Problem mit TextDraws [BUG]

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 Leute,


    Ich hab ein Problem, undzwar spinnen die Textdraws rum fürs Auto, wenn man das Autokennzeichen ändert, verschwinden einfach 3 Textdraws, wenn man das Auto verlääst, verschwinden ganz andere Textdraws, wie z.B. der TextDraw fürs Anzeigen der ServerVersion.
    Und ein Wert wird nicht gesetzt bzw. bei Floats kommt garnichts, nur ein leerer Text.
    Hier die verbuggten Codes


    //GameModeInit
    SetTimer("IsPlayerDriverTextDrawCheck",200,true);
    new Versionstring[128];
    format(Versionstring,sizeof(Versionstring),"~y~Version: ~w~%s",ServerVersion);
    VersionText = TextDrawCreate(635.0,5.0,Versionstring);
    TextDrawColor(VersionText,WEIß);
    TextDrawUseBox(VersionText,0);
    TextDrawAlignment(VersionText,3);
    TextDrawFont(VersionText,1);
    TextDrawLetterSize(VersionText,0.5,1.4);
    TextDrawSetShadow(VersionText,3);
    TextDrawSetProportional(VersionText,1);
    TextDrawSetOutline(VersionText,1);
    TextDrawBackgroundColor(VersionText,0x000000FF);


    for(new i=0; i<MAX_VEHICLES; i++)
    {
    Fahrzeuganzeige[i][0] = TextDrawCreate(500.000000, 241.500000, "Fahrzeuginfos:");
    TextDrawAlignment(Fahrzeuganzeige[i][0], 2);
    TextDrawBackgroundColor(Fahrzeuganzeige[i][0], -1);
    TextDrawFont(Fahrzeuganzeige[i][0], 0);
    TextDrawLetterSize(Fahrzeuganzeige[i][0], 0.500000, 1.000000);
    TextDrawColor(Fahrzeuganzeige[i][0], 255);
    TextDrawSetOutline(Fahrzeuganzeige[i][0], 0);
    TextDrawSetProportional(Fahrzeuganzeige[i][0], 1);
    TextDrawSetShadow(Fahrzeuganzeige[i][0], 1);
    TextDrawUseBox(Fahrzeuganzeige[i][0], 1);
    TextDrawBoxColor(Fahrzeuganzeige[i][0], 1145325143);
    TextDrawTextSize(Fahrzeuganzeige[i][0], 0.000000, 276.000000);


    Fahrzeuganzeige[i][1] = TextDrawCreate(362.000000, 254.000000, "Fahrzeugname: ~w~NAME");
    TextDrawBackgroundColor(Fahrzeuganzeige[i][1], -1);
    TextDrawFont(Fahrzeuganzeige[i][1], 0);
    TextDrawLetterSize(Fahrzeuganzeige[i][1], 0.500000, 1.000000);
    TextDrawColor(Fahrzeuganzeige[i][1], 255);
    TextDrawSetOutline(Fahrzeuganzeige[i][1], 0);
    TextDrawSetProportional(Fahrzeuganzeige[i][1], 1);
    TextDrawSetShadow(Fahrzeuganzeige[i][1], 0);
    TextDrawUseBox(Fahrzeuganzeige[i][1], 1);
    TextDrawBoxColor(Fahrzeuganzeige[i][1], -225);
    TextDrawTextSize(Fahrzeuganzeige[i][1], 714.000000, 0.000000);


    Fahrzeuganzeige[i][4] = TextDrawCreate(362.000000, 292.250000, "Motor: ~g~ Eingeschaltet");
    TextDrawBackgroundColor(Fahrzeuganzeige[i][4], -1);
    TextDrawFont(Fahrzeuganzeige[i][4], 0);
    TextDrawLetterSize(Fahrzeuganzeige[i][4], 0.500000, 1.000000);
    TextDrawColor(Fahrzeuganzeige[i][4], 255);
    TextDrawSetOutline(Fahrzeuganzeige[i][4], 0);
    TextDrawSetProportional(Fahrzeuganzeige[i][4], 1);
    TextDrawSetShadow(Fahrzeuganzeige[i][4], 0);
    TextDrawUseBox(Fahrzeuganzeige[i][4], 1);
    TextDrawBoxColor(Fahrzeuganzeige[i][4], -225);
    TextDrawTextSize(Fahrzeuganzeige[i][4], 714.000000, 0.000000);


    Fahrzeuganzeige[i][5] = TextDrawCreate(362.000000, 279.500000, "Licht: ~g~ Eingeschaltet ?");
    TextDrawBackgroundColor(Fahrzeuganzeige[i][5], -1);
    TextDrawFont(Fahrzeuganzeige[i][5], 0);
    TextDrawLetterSize(Fahrzeuganzeige[i][5], 0.500000, 1.000000);
    TextDrawColor(Fahrzeuganzeige[i][5], 255);
    TextDrawSetOutline(Fahrzeuganzeige[i][5], 0);
    TextDrawSetProportional(Fahrzeuganzeige[i][5], 1);
    TextDrawSetShadow(Fahrzeuganzeige[i][5], 0);
    TextDrawUseBox(Fahrzeuganzeige[i][5], 1);
    TextDrawBoxColor(Fahrzeuganzeige[i][5], -225);
    TextDrawTextSize(Fahrzeuganzeige[i][5], 714.000000, 0.000000);


    Fahrzeuganzeige[i][14] = TextDrawCreate(362.000000, 381.500000, "Zustand:~w~");
    TextDrawBackgroundColor(Fahrzeuganzeige[i][14], -1);
    TextDrawFont(Fahrzeuganzeige[i][14], 1);
    TextDrawLetterSize(Fahrzeuganzeige[i][14], 0.500000, 1.000000);
    TextDrawColor(Fahrzeuganzeige[i][14], 255);
    TextDrawSetOutline(Fahrzeuganzeige[i][14], 0);
    TextDrawSetProportional(Fahrzeuganzeige[i][14], 1);
    TextDrawSetShadow(Fahrzeuganzeige[i][14], 0);
    TextDrawUseBox(Fahrzeuganzeige[i][14], 1);
    TextDrawBoxColor(Fahrzeuganzeige[i][14], -225);
    TextDrawTextSize(Fahrzeuganzeige[i][14], 714.000000, 0.000000);


    Fahrzeuganzeige[i][9] = TextDrawCreate(362.000000, 304.750000, "Status: ~r~ Abgeschlossen");
    TextDrawBackgroundColor(Fahrzeuganzeige[i][9], -1);
    TextDrawFont(Fahrzeuganzeige[i][9], 0);
    TextDrawLetterSize(Fahrzeuganzeige[i][9], 0.500000, 1.000000);
    TextDrawColor(Fahrzeuganzeige[i][9], 255);
    TextDrawSetOutline(Fahrzeuganzeige[i][9], 0);
    TextDrawSetProportional(Fahrzeuganzeige[i][9], 1);
    TextDrawSetShadow(Fahrzeuganzeige[i][9], 0);
    TextDrawUseBox(Fahrzeuganzeige[i][9], 1);
    TextDrawBoxColor(Fahrzeuganzeige[i][9], -225);
    TextDrawTextSize(Fahrzeuganzeige[i][9], 714.000000, 0.000000);
    }


    // public


    public UpdateVehicleAnzeigeTimer(vehicleid)
    {
    new engine, lights, alarm, doors, bonnet, boot, objective, string[256], Float: health;
    GetVehicleHealth(vehicleid,health);
    GetVehicleParamsEx(vehicleid,engine,lights,alarm,doors,bonnet,boot,objective);
    format(string,sizeof(string),"Fahrzeugname: ~w~%s",VehicleNames[GetVehicleModel(vehicleid) - 400]);
    TextDrawSetString(Fahrzeuganzeige[vehicleid][1],string);
    format(string,sizeof(string),"Motor: ~g~ %s",GetVehicleEngineState(vehicleid));
    TextDrawSetString(Fahrzeuganzeige[vehicleid][4],string);
    format(string,sizeof(string),"Licht: ~g~ %s",GetVehicleLightState(vehicleid));
    TextDrawSetString(Fahrzeuganzeige[vehicleid][5],string);
    format(string,sizeof(string),"Status: ~r~ %s",GetVehicleCarlockState(vehicleid));
    TextDrawSetString(Fahrzeuganzeige[vehicleid][9],string);
    format(string,sizeof(string),"Zustand:~w~%f (%i%%)",health,floatround(health,floatround_round));
    TextDrawSetString(Fahrzeuganzeige[vehicleid][14],string);
    return 1;
    }


    public IsPlayerDriverTextDrawCheck()
    {
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(GetPVarInt(i,"ImFahrzeug")==0)
    {
    if(IsPlayerInAnyVehicle(i) && GetPlayerState(i) == PLAYER_STATE_DRIVER)
    {
    SetPVarInt(i,"ImFahrzeug",1);
    SetPVarInt(i,"IsPlayerDriverTextDrawCheckVehicleID",GetPlayerVehicleID(i));
    for(new r=0; r<MAX_FAHRZEUGANZEIGETEXT; r++)
    {
    updatevehicleanzeigetimer[GetPlayerVehicleID(i)] = SetTimerEx("UpdateVehicleAnzeigeTimer",500,true,"i",GetPlayerVehicleID(i));
    TextDrawShowForPlayer(i,Fahrzeuganzeige[GetPlayerVehicleID(i)][r]);
    }
    }
    }
    if(GetPVarInt(i,"ImFahrzeug")==1)
    {
    if(!IsPlayerInAnyVehicle(i) || GetPlayerState(i) != PLAYER_STATE_DRIVER)
    {
    new vid;
    SetPVarInt(i,"ImFahrzeug",0);
    for(new r=0; r<MAX_FAHRZEUGANZEIGETEXT; r++)
    {
    vid = GetPVarInt(i,"IsPlayerDriverTextDrawCheckVehicleID");
    KillTimer(updatevehicleanzeigetimer[vid]);
    TextDrawHideForPlayer(i,Fahrzeuganzeige[vid][r]);
    }
    SetPVarInt(i,"IsPlayerDriverTextDrawCheckVehicleID",0);
    }
    }
    }
    return 1;
    }


    stock GetVehicleEngineState(vehicleid)
    {
    new Status[128], engine, light, alarm, doors, bonnet, boot, objective;
    GetVehicleParamsEx(vehicleid,engine,light,alarm,doors,bonnet,boot,objective);
    if(engine == 0)
    {
    Status = "Ausgeschaltet";
    }
    else if(engine == 1)
    {
    Status = "Eingeschaltet";
    }
    return Status;
    }


    stock GetVehicleLightState(vehicleid)
    {
    new Status[128], engine, light, alarm, doors, bonnet, boot, objective;
    GetVehicleParamsEx(vehicleid,engine,light,alarm,doors,bonnet,boot,objective);
    if(light == 0)
    {
    Status = "Ausgeschaltet";
    }
    else if(light == 1)
    {
    Status = "Eingeschaltet";
    }
    return Status;
    }


    stock GetVehicleCarlockState(vehicleid)
    {
    new Status[128], engine, light, alarm, doors, bonnet, boot, objective;
    GetVehicleParamsEx(vehicleid,engine,light,alarm,doors,bonnet,boot,objective);
    if(doors == 0)
    {
    Status = "Aufgeschlossen";
    }
    else if(doors == 1)
    {
    Status = "Abgeschlossen";
    }
    return Status;
    }


    Wo ist der Bug??

  • Die TextDraws zum Beispiel als PlayerTextDraws erstellen, also nicht für jedes Auto eins, sondern für jeden Spieler eins, das bei OnPlayerDisconnect wieder entfernt wird.
    Mit Zeilenumbrüchen arbeiten, anstatt zehn TextDraws untereinander zu setzen

  • Zitat

    Created Serverwise (Per-Player)256

    Was macht denn das für einen Sinn wenn MaxPlayers 500 ist ^^

    Zitat

    Created Serverwise (Global)2048

    Ok, man könnte für jeden Spieler dann die 3 TextDraws erstellen (3 * 500) = 1500
    Dann hätte ich noch ca. 548 TextDrawas zur verfügung.
    Sehe ich das richtig?
    Und ich kann ja dann garnicht PlayerTextDraws ändern, weil die ja nur auf 256 beschränkt sind. (ich brauch mindestens 3 TextDraws für jeden Spieler)
    Also da ist schon der Zeileumbruch dabei bräuchte am Ende ca 3 für jeden

  • Du kannst ja die Textdraws auch nur dann erstellen wenn ein Spieler den Server betritt. Außerdem musst du nicht 500 Slots am Server haben, 100 werden ewig reichen.


    Generell ist das mit den Textdraws so eine Sache, die sind einfach viel zu limitiert. Da muss man einfach schauen, dass man so sparsam wie möglich damit umgeht.

  • Naja vielleicht kommt ja in der 0.4 Version dann 4096 TextDraws?
    Wäre nicht schlecht


    Oh ja, das stimmt. Aber mach dir da mal keine falschen Hoffnungen. Ich persönlich verstehe sowieso nicht, warum man überhaupt so ein mickriges Limit macht.


    Eine wirkliche Verbesserung wäre, wenn man selbst das Limit bestimmen kann, eben auf Kosten von mehr Arbeitsspeicher, aber das sollte kein Problem sein, denn so ein SAMP Server verbraucht zwischen 100 und 500 MB, da ist noch viel Luft nach oben, mein Server hat 24 GB Arbeitsspeicher, da kommt es auf ein paar MB nicht an.
    Aber das wird wohl ein Wunsch bleiben...


    Heißt eben: Sparsam mit Textdraws umgehen.

  • Wieviel Arbeitsspeicher braucht denn ein SAMP Sever standardmäßig?
    Also würden 4GB Reichen, wenn man noch nen Teamspeak server laufen lässt oder 8GB für beides?


    Also meiner braucht mit 47 Spieler online zur Zeit 238MB RAM. Das steigt aber nicht linear, bei 100 Spieler sind es hochgerechnet ca. 300MB.


    Also das sollte eigentlich reichen, wenn du 4GB hast. Je nach dem wie viel das Teamspeak braucht.