Textdraw sieht nur ID 0 ?

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 Tag liebe Leute :)
    Ich wollte mal fragen warum der Textdraw immer nur für ID 0 angezeigt wird?



    forward TextDraw();
    new Text:Textdrawstats[MAX_PLAYERS];




    OnGameModeInit


    for(new playerid = 0;playerid<MAX_PLAYERS;playerid++)
    {
    Textdrawstats[playerid] = TextDrawCreate(BLABLABLA);
    TextDrawAlignment(BLABLABLA);
    ........................
    }
    SetTimer("TextDraw", 1000, 1);




    Funktion
    public TextDraw()
    {
    for(new i = 0;i<MAX_PLAYERS;i++)
    {
    new bstring[128];
    new bankkonto = Spieler[i][bankmoney];
    format(bstring,sizeof(bstring),"~g~$%d", bankkonto);
    TextDrawSetString(Textdrawstats[i], bstring);
    return 1;
    }
    return 1;
    }

    OnPlayerConnect

    TextDrawShowForPlayer(playerid, Textdrawstats[playerid]);

    OnPlayerDisconnect


    TextDrawHideForPlayer(playerid, Textdrawstats[playerid]);




    Wo ist der Fehler?

    Dieser Beitrag wurde bereits 2853564 mal editiert, zuletzt von »Vanish« (Heute,16:46)
    _______________________________________________________________________________________________________________________________________________________________

  • Du musst anstatt "playerid<MAXPLAYERS" SLOT<MAXPLAYERS einsetzen

    Einmal editiert, zuletzt von GLS | Scripter ()

  • Und wieso muss er das machen? Wieder mal ein Post der nichts bringt außer seinen Post-Count hoch zu treiben ohne wirklich zu helfen.


    Der Fehler ist das return 1; im Loop von TextDraw().Dadurch wird die Funktion beendet und die Schleife wird immer nach dem 1 durchlauf beendet. Ich hab es dir mal etwas verändert, womit es von den Ressourcen weniger verbraucht.


    forward TextDraw();
    new Text:Textdrawstats[MAX_PLAYERS];


    public OnGameModeInit()
    {
    SetTimer("TextDraw", 5003, 1); // Alle ~5 Sek reicht doch locker aus
    return 1;
    }
    public TextDraw()
    {
    new
    bstring[16];
    for(new i = 0; i < MAX_PLAYERS ; i++)
    {
    if(IsPlayerConnected(i)) {
    format(bstring,sizeof(bstring),"~g~$%d", Spieler[i][bankmoney] );
    TextDrawSetString(Textdrawstats[i], bstring);
    }
    }
    return 1;
    }


    public OnPlayerConnect(playerid)
    {
    Textdrawstats[playerid] = TextDrawCreate(BLABLABLA);
    TextDrawAlignment(BLABLABLA);
    // ........................
    TextDrawShowForPlayer(playerid, Textdrawstats[playerid]);
    return 1;
    }


    public OnPlayerDisconnect(playerid, reason)
    {
    TextDrawHideForPlayer(playerid, Textdrawstats[playerid]);
    TextDrawDestroy(Textdrawstats[playerid]);
    return 1;
    }


    Es ist besser,wenn du den Textdraw erst beim Connecten für den Spieler erstellst und ihn dann auch beim Verlassen wieder zerstörst.

  • Iwie ab ID 5 oder so klappt es dann nicht mehr.
    Also wenn mehr als 5 -6 Spieler da sind , geht es auf einmal bei allen nicht mehr.
    Was soll ich jetzt tun ?


    Liegt es vllt noch an anderen normalen Textdraws?





    /EDIT : Frage

    Dieser Beitrag wurde bereits 2853564 mal editiert, zuletzt von »Vanish« (Heute,16:46)
    _______________________________________________________________________________________________________________________________________________________________

    Einmal editiert, zuletzt von GurkenSalat ()

  • Liegt sehr wahrscheinlich an Anderen TextDraws.
    Erstellst du denn andere Textdraws, so wie du in deinem Ausgangscode unter
    OnGameModeInit() gezeigt hast ?
    Falls ja, dann wird es daran liegen.
    In SA:MP sind maximal 2048 Textdraws möglich. Versuchst du weitere zu erstellen,
    wird es nicht funktionieren. MAX_PLAYERS ist standartmäßig auf 500 definiert, falls
    du das nicht geändert hast und du mehrere Textdraws in OnGameModeInit in einem Loop für alle
    Spieler erstellst, überschreitest du ziemlich schnell diese 2048 Textdraws



    public OnGameModeInit() {
    for(new i ; i < MAX_PLAYERS ; i++) {
    TextDrawCreate() ... // 1
    TextDrawCreate() ... // 2
    TextDrawCreate() ... // 3
    TextDrawCreate() ... // 4
    }
    }

    Damit erreichst du bereits 2000 (!!!) Textdraws.Könntest also nur noch 48 erstellen.

    public OnGameModeInit() {
    for(new i ; i < MAX_PLAYERS ; i++) {
    TextDrawCreate() ... // 1
    TextDrawCreate() ... // 2
    TextDrawCreate() ... // 3
    TextDrawCreate() ... // 4
    TextDrawCreate() ... // 5
    }
    }

    Das sind bereits 2500, es werden aber nur 2048 erstellt.Die übrigen 452 ( 500-48 ) Textdraws werden
    nicht erstellt.Denn der Speicher für Textdraws ist voll.


    Entweder du reduzierst MAX_PLAYERS ( Da du mit sehr hoher wahrscheinlichkeit eh nie 500 Spieler haben
    wirst ) oder du erstellst die Textdraws erst bei OnPlayerConnect, so wie Ich es gezeigt habe.
    Zerstörst diese dann auch wieder bei OnPlayerDisconnect.
    Ich empfehle die Methode mit OnPlayerConnect/Disconnect . Da du so zusätzlich die Ressourcen des Server schohnst da nur die Textdraws erstellt sind, die aktuell auch wirklich benötigt werden.


    Für die Andere Methode müsstest folgendes einfügen

    // direkt unter #include <a_samp>
    #if defined MAX_PLAYERS
    #undef MAX_PLAYERS
    #define MAX_PLAYERS 100
    #endif

  • Würde das nicht sinn machen in einer Variable zu speichern wie viele Spieler online sind?
    Denn man hat vll 100 Slots aber es sind nur 20 aufm Server, also wieso für die restlichen 80 unbenutzen Slots einen Textdraw erstellen?


    PS: Korrigiert mich wenn falsch liege. Hab das noch nicht ausprobiert

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Das hab Ich doch geschrieben.
    Deswegen sollte er die Textdraws beim Connecten erstellen und beim Verlassen wieder zerstören.So sind auch wirklich nur Textdraws erstellt für Spieler, die sich derzeit auch wirklich auf dem Server befinden.

  • Gut dann hab ich wohl die stelle Überlesen oder nicht ganz drauf geachtet^^


    Aber das müsste doch gehn, wenn ich z.B. Checkpoints erstellen möchte oder?


    PS: Hab nur keine Lust einen neuen Theard aufzumachen

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • So habs jetzt ma so getestet und so.
    Es lag an den anderen textdraws.
    Danke noch viel mals ,dass du dir so viel Zeit investierst hast ;)

    Dieser Beitrag wurde bereits 2853564 mal editiert, zuletzt von »Vanish« (Heute,16:46)
    _______________________________________________________________________________________________________________________________________________________________