Problem mit Updaten der Textdraws

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
  • Guten Morgen Community,


    Ich habe das Problem, dass das Textdraw was ich erstellt habe sich nicht löscht, wenn ich es zweimal innerhalb des Timers [1500s] mit einem Befehl einblenden lasse.
    Wenn ich den /gz Befehl eingebe, erscheint das Textdraw. Wenn das Textdraw verschwunden ist, kann ich wieder den /gz Befehl nutzen und das Textdraw erscheint erneut problemlos.


    dcmd_gz(playerid,params[])
    {
    if (AccInfo[playerid][Level] <= 1)
    return SendClientMessage (playerid, COLOR_GREY, "* You are not an Administrator to perform this command.");

    new Float:x,Float:y,Float:z, Float:zz;
    if(sscanf(params, "f",zz)) return SendClientMessage(playerid, COLOR_GREY, "* Usage: /gz [Meters in Z Direction") && SendClientMessage(playerid, COLOR_GREY,"* Function: Moves you in the specified Z - Direction.");
    GetPlayerPos(playerid, x, y, z);
    SetPlayerPos(playerid, x, y, z+zz);


    if (Float:zz >= 0)
    {
    new tdstring[7];
    TextDrawShowForPlayer(playerid, Textdraw2);
    Textdraw2 = TextDrawCreate(117.000000, 338.000000, tdstring);
    format(tdstring, sizeof(tdstring), "Z %.2f ", zz);
    TextDrawBackgroundColor(Textdraw2, 255);
    TextDrawFont(Textdraw2, 2);
    TextDrawLetterSize(Textdraw2, 0.290000, 1.200000);
    TextDrawColor(Textdraw2, -1);
    TextDrawSetOutline(Textdraw2, 0);
    TextDrawSetProportional(Textdraw2, 1);
    TextDrawSetShadow(Textdraw2, 1);
    TextDrawSetString(Textdraw2, tdstring);
    TextDrawShowForPlayer(playerid, Textdraw2);
    SetTimerEx("DisableTextDraw2", 1500, false, "i", playerid);
    }


    if (Float:zz <= 0)
    {
    new tdstring[7];
    TextDrawShowForPlayer(playerid, Textdraw2);
    Textdraw2 = TextDrawCreate(117.000000, 338.000000, tdstring);
    format(tdstring, sizeof(tdstring), "Z %.2f ", zz);
    TextDrawBackgroundColor(Textdraw2, 255);
    TextDrawFont(Textdraw2, 2);
    TextDrawLetterSize(Textdraw2, 0.290000, 1.200000);
    TextDrawColor(Textdraw2, -1);
    TextDrawSetOutline(Textdraw2, 0);
    TextDrawSetProportional(Textdraw2, 1);
    TextDrawSetShadow(Textdraw2, 1);
    TextDrawSetString(Textdraw2, tdstring);
    TextDrawShowForPlayer(playerid, Textdraw2);
    SetTimerEx("DisableTextDraw2", 1500, false, "i", playerid);
    }
    return 1;
    }


    forward DisableTextDraw2(playerid);


    public DisableTextDraw2(playerid)
    {
    new tdstring[7];
    TextDrawDestroy(Textdraw2);
    TextDrawHideForPlayer(playerid, Textdraw2);
    Textdraw2 = TextDrawCreate(117.000000, 338.000000, tdstring);
    return 1;
    }


    Mfg Salpoe :P

  • dcmd_gz(playerid,params[])
    {
    if (AccInfo[playerid][Level] <= 1)
    return SendClientMessage (playerid, COLOR_GREY, "* You are not an Administrator to perform this command.");

    new Float:x,Float:y,Float:z, Float:zz;
    if(sscanf(params, "f",zz)) return SendClientMessage(playerid, COLOR_GREY, "* Usage: /gz [Meters in Z Direction") && SendClientMessage(playerid, COLOR_GREY,"* Function: Moves you in the specified Z - Direction.");
    GetPlayerPos(playerid, x, y, z);
    SetPlayerPos(playerid, x, y, z+zz);


    if (Float:zz >= 0)
    {
    new tdstring[7];
    TextDrawShowForPlayer(playerid, Textdraw2);
    Textdraw2 = TextDrawCreate(117.000000, 338.000000, tdstring);
    format(tdstring, sizeof(tdstring), "Z %.2f ", zz);
    TextDrawBackgroundColor(Textdraw2, 255);
    TextDrawFont(Textdraw2, 2);
    TextDrawLetterSize(Textdraw2, 0.290000, 1.200000);
    TextDrawColor(Textdraw2, -1);
    TextDrawSetOutline(Textdraw2, 0);
    TextDrawSetProportional(Textdraw2, 1);
    TextDrawSetShadow(Textdraw2, 1);
    TextDrawSetString(Textdraw2, tdstring);
    TextDrawShowForPlayer(playerid, Textdraw2);
    SetTimer("DisableTextDraw2", 1500, false, "i", playerid);
    }


    if (Float:zz <= 0)
    {
    new tdstring[7];
    TextDrawShowForPlayer(playerid, Textdraw2);
    Textdraw2 = TextDrawCreate(117.000000, 338.000000, tdstring);
    format(tdstring, sizeof(tdstring), "Z %.2f ", zz);
    TextDrawBackgroundColor(Textdraw2, 255);
    TextDrawFont(Textdraw2, 2);
    TextDrawLetterSize(Textdraw2, 0.290000, 1.200000);
    TextDrawColor(Textdraw2, -1);
    TextDrawSetOutline(Textdraw2, 0);
    TextDrawSetProportional(Textdraw2, 1);
    TextDrawSetShadow(Textdraw2, 1);
    TextDrawSetString(Textdraw2, tdstring);
    TextDrawShowForPlayer(playerid, Textdraw2);
    SetTimer("DisableTextDraw2", 1500, false, "i", playerid);
    }
    return 1;
    }


    forward DisableTextDraw2(playerid);


    public DisableTextDraw2(playerid)
    {
    new tdstring[7];
    TextDrawDestroy(Textdraw2);
    TextDrawHideForPlayer(playerid, Textdraw2);
    Textdraw2 = TextDrawCreate(117.000000, 338.000000, tdstring);
    return 1;


    Mach Mal Mit SetTimer nun ^^

  • Alle Textdraw2 zu Textdraw2[playerid] machen.
    Bei der Deklaration von Textdraw2 noch [MAX_PLAYERS] = {Text:-1,...}; hin hängen.


    Bei dem Befehl vor dem Erstellen des Textdraws:


    if(Textdraw2[playerid] != Text:-1) DisableTextDraw2(playerid);



    Für den Timer erstellst du auch eine Spieler Variable und killst ihn nach der selben Methode.

  • new Text:Textdraw2[MAX_PLAYERS] = {Text:-1,...};


    public OnGameModeInit()
    {
    new tdstring[7];
    Textdraw2[playerid]= TextDrawCreate(117.000000, 338.000000, tdstring); //error 017: undefined symbol "playerid"
    TextDrawBackgroundColor(Textdraw2[playerid], 255); //error 017: undefined symbol "playerid"
    TextDrawFont(Textdraw2[playerid], 2); //error 017: undefined symbol "playerid"
    TextDrawLetterSize(Textdraw2[playerid], 0.290000, 1.200000); //error 017: undefined symbol "playerid"
    TextDrawColor(Textdraw2[playerid], -1); //error 017: undefined symbol "playerid"
    TextDrawSetOutline(Textdraw2[playerid], 0); //error 017: undefined symbol "playerid"
    TextDrawSetProportional(Textdraw2[playerid], 1); //error 017: undefined symbol "playerid"
    TextDrawSetShadow(Textdraw2[playerid], 1); //error 017: undefined symbol "playerid"
    Lasse ich das [playerid] so bekomme ich den "error 035: argument type mismatch (argument 1)" Error.


    Hab den Befehl nun unter OnPlayerCommandText plaziert.


    Edit: Habs hinbekommen. Nun funktioniert der Befehl aber nicht mehr.


    if(strcmp(cmdtext, "/gz", true) == 0)
    {
    if (AccInfo[playerid][Level] <= 1)
    return SendClientMessage (playerid, COLOR_GREY, "* You are not an Administrator to perform this command.");


    new params[7], Float:x,Float:y,Float:z, Float:zz;
    if(sscanf(params, "f",zz)) return SendClientMessage(playerid, COLOR_GREY, "* Usage: /gz [Meters in Z Direction") && SendClientMessage(playerid, COLOR_GREY,"* Function: Moves you in the specified Z - Direction.");
    GetPlayerPos(playerid, x, y, z);
    SetPlayerPos(playerid, x, y, z+zz);

    Einmal editiert, zuletzt von Salpoe ()

  • Beginne erneut, das ist kompletter Murks:

    • Du benötigst PlayerTextDraws, nicht einfache TextDraws. Grund: Es können mehrere Benutzer gleichzeitig den Befehl verwenden und somit mehrere Benutzer gleichzeitig den selben Textdraw mit unterschiedlichem Content sehen.
    • Erstelle die PlayerTextDraws einmalig unter OnPlayerConnect() und verwende nur PlayerTextDrawSetString(), PlayerTextDrawHide() und PlayerTextDrawShow() in deinem Befehl und Timer.
    • Verwende nicht "return SendClientMessage() && SendClientMessage()". Das ist kein guter Stil! Verwende einfach geschweifte Klammern und rufe die Funktion normal 2x auf!
    • Verwende elseif! Deine if-Statements überschneiden sich (bei =) und werden immer beide überprüft. Verwende elseif, um zu verhindern, dass die zweite auch überprüft wird, wenn die erste bereits zutrifft.
    • Zerstöre deinen PlayerTextDraw nicht mehr, sondern blende ihn lediglich aus. Sonst musst du ihn immer wieder erstellen. Das ist eine unnötige Verschwendung von Ressourcen.
    • Überprüfe die logische Abfolge deines Quellcodes! Du deklarierst die Variable "tdstring", erstellst dann den Textdraw und erst dann setzt du die Variable. Das macht keinen Sinn!
  • Ich habe deine Verbesserungen befolgt und den Befehl teilweise verbessert.


    Der Befehl wie ich ihn oben habe funktioniert aber trotzdem nicht um ihn ingame zu testen, was habe ich falsch gemacht?


    Keiner ne Idee? :S

    Einmal editiert, zuletzt von Salpoe ()

  • Ich sagte ja, der Befehl sieht immernoch genauso aus.


    if(strcmp(cmdtext, "/gz", true) == 0)
    {
    if (AccInfo[playerid][Level] <= 1)
    return SendClientMessage (playerid, COLOR_GREY, "* You are not an Administrator to perform this command.");


    new params[7], Float:x,Float:y,Float:z, Float:zz;
    if(sscanf(params, "f",zz)) return SendClientMessage(playerid, COLOR_GREY, "* Usage: /gz [Meters in Z Direction") && SendClientMessage(playerid, COLOR_GREY,"* Function: Moves you in the specified Z - Direction.");
    GetPlayerPos(playerid, x, y, z);
    SetPlayerPos(playerid, x, y, z+zz);
    //rest

  • if(strcmp(cmdtext, "/gz", true) == 0)
    {
    if (AccInfo[playerid][Level] <= 1)
    return SendClientMessage (playerid, COLOR_GREY, "* You are not an Administrator to perform this command.");


    new params[7], Float:x,Float:y,Float:z, Float:zz;
    format(params, sizeof(params), "%s", cmdtext[4]);
    if(sscanf(params, "f",zz)) return SendClientMessage(playerid, COLOR_GREY, "* Usage: /gz [Meters in Z Direction") && SendClientMessage(playerid, COLOR_GREY,"* Function: Moves you in the specified Z - Direction.");
    GetPlayerPos(playerid, x, y, z);
    SetPlayerPos(playerid, x, y, z+zz);


    Du hattest params keinen Wert zugewiesen.


  • Dein Quellcode ist trotzdem kompletter Murks. Unperformant, unstrukturiert und verbuggt. Ich empfehle dir die Tipps im Thread wahrzunehmen.


    Murks ist es nicht. Ich bin überhaupt froh, dass ich es erstmal so weit geschafft habe. Nur weil es nicht so aussieht wie du es gerne haben möchtest, heißt es nicht dass es gleich Murks ist.
    Da ich ein Anfänger bin, halte ich es für in Ordnung. Und verbuggt ist es nicht mehr.

  • Murks ist es nicht. Ich bin überhaupt froh, dass ich es erstmal so weit geschafft habe. Nur weil es nicht so aussieht wie du es gerne haben möchtest, heißt es nicht dass es gleich Murks ist.
    Da ich ein Anfänger bin, halte ich es für in Ordnung. Und verbuggt ist es nicht mehr.


    Sobald du das System mit mehreren Spielern entsprechend testen wirst, wirst du Probleme erkennen. Es ist nicht, dass ich hier deinen Quellcode herunterziehen möchte. Ich finde vor allem als Anfänger sollte man Tipps beherzigen und die Hintergründe untersuchen, um sich selbst weiterentwickeln zu können. Ob dein Quellcode nun meinen Tipps entspricht, das ist mir herzlichst egal. Schließlich bin ich nur hier um Ratschläge zu geben. Von mir aus kann dein ganzer Server auch abrauchen. Ich versuche lediglich neben einer (primitiven) Lösung für das Problem dir für deinen gesamten Quellcode Verbesserungsvorschläge mitzugeben. Die kannst du nun überdenken und lernen oder du ignorierst sie und schlägst dich mit einem anfängerlichen Quellcode herum und machst zukünftig die exakt selben Fehler wieder.