TextDraw lässt SA:MP crashen. Bitte dringend helfen.

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


    mal wieder ein hübsches Problem. Wenn ich mit 2 Personen auf meinem Server bin, kann die ID 0 (zuerst gejointe Person) ohne Probleme Autos fahren etc.
    ID 1 jedoch, die zuletzt gejointe Person, braucht nur in ein Fahrzeug einzusteigen und das GTA crasht bei dem Spieler. Dem Server hat das nichts an aber das ist ja doch etwas unpraktisch für die Spieler. :D
    Im Serverlog steht auch nur Join und Part, nichts auffälliges.
    Welche Codeschnipsel braucht ihr?


    Liebe Grüße.

  • Nach ausführlichen Tests kam ich zum Entschluss, dass es an dieser Codezeile scheitert.


    public OnPlayerStateChange(playerid, newstate, oldstate)
    {
    if(newstate == PLAYER_STATE_DRIVER)
    {
    if(IsPlayerInAnyVehicle(playerid) && !IsBicycle(GetPlayerVehicleID(playerid)))
    {
    TextDrawShowForPlayer(playerid, SpeedoText[playerid]); //HIER CRASHT SAMP!!
    new vehicleid = GetPlayerVehicleID(playerid);
    if(VehicleSecurity[vehicleid] == 1)
    {
    ToggleAlarm(vehicleid, VEHICLE_PARAMS_ON);
    SetTimerEx("StopAlarm", ALARM_TIME, false, "d", vehicleid);
    }
    }
    else
    {
    TextDrawHideForPlayer(playerid, SpeedoText[playerid]);
    }
    new vehicleid = GetPlayerVehicleID(playerid);
    new id = GetVehicleID(vehicleid);
    if(IsValidVehicle(id))
    {
    if(VehicleCreated[id] == VEHICLE_DEALERSHIP)
    {
    SetPVarInt(playerid, "DialogValue1", id);
    ShowDialog(playerid, DIALOG_VEHICLE_BUY);
    return 1;
    }
    }
    if(IsBicycle(vehicleid))
    {
    ToggleEngine(vehicleid, VEHICLE_PARAMS_ON);
    }
    if(Fuel[vehicleid] <= 0)
    {
    ToggleEngine(vehicleid, VEHICLE_PARAMS_OFF);
    }
    TankLeerCheck = SetTimerEx("TankLeer", 5000, true, "i", vehicleid);
    }
    return 1;
    }


    Dazu interessiert bestimmt noch das:
    public Speedometer()
    {
    new vehicleid, Float:health;
    new engine, lights, alarm, doors, bonnet, boot, objective;
    new fstring[32], string[512];


    for(new i=0; i < MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i) && IsPlayerInAnyVehicle(i))
    {
    vehicleid = GetPlayerVehicleID(i);
    GetVehicleHealth(vehicleid, health);
    GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);

    //string = "~b~~h~B: ~w~";
    //strcat(string, VehicleNames[GetVehicleModel(vehicleid)-400], sizeof(string));

    strcat(string, "~n~~B~~h~Standort: ~w~", sizeof(string));
    strcat(string, GetPlayer3DZone(i), sizeof(string));


    strcat(string, "~n~~B~~h~Zustand: ~g~", sizeof(string));
    fstring = "iiiiiiiiii";
    if(health > 1000.0) strins(fstring, "~r~", 10, sizeof(fstring));
    else if(health < 0.0) strins(fstring, "~r~", 0, sizeof(fstring));
    else strins(fstring, "~r~", floatround(health/100.0), sizeof(fstring));
    strcat(string, fstring, sizeof(string));

    strcat(string, " ~B~~h~Treibstoff: ~g~", sizeof(string));
    fstring = "iiiiiiiiii";
    if(Fuel[vehicleid] > 100.0) strins(fstring, "~r~", 10, sizeof(fstring));
    else if(Fuel[vehicleid] < 0.0) strins(fstring, "~r~", 0, sizeof(fstring));
    else strins(fstring, "~r~", floatround(Fuel[vehicleid]/10.0), sizeof(fstring));
    strcat(string, fstring, sizeof(string));

    strcat(string, " ~B~~h~", sizeof(string));
    if(GetPVarInt(i, "Speedo")) format(fstring,sizeof(fstring),"Km/h: ~w~%d", GetPlayerSpeed(i, false));
    else format(fstring,sizeof(fstring),"Km/h: ~w~%d", GetPlayerSpeed(i, true));
    strcat(string, fstring, sizeof(string));

    strcat(string, "~n~~B~~h~Motor: ", sizeof(string));
    if(engine == 1) strcat(string, "~g~An", sizeof(string));
    else strcat(string, "~r~Aus", sizeof(string));

    strcat(string, " ~B~~h~Alarm: ", sizeof(string));
    if(VehicleSecurity[vehicleid] == 1) strcat(string, "~g~Ein", sizeof(string));
    else strcat(string, "~r~Aus", sizeof(string));

    strcat(string, " ~B~~h~Verriegelung: ", sizeof(string));
    if(doors == 1) strcat(string, "~r~aktiviert", sizeof(string));
    else strcat(string, "~g~deaktiviert", sizeof(string));

    TextDrawSetString(SpeedoText[i], string);
    }
    }
    }

    public OnPlayerConnect(playerid)
    {
    RefuelTime[playerid] = 0;
    TrackCar[playerid] = 0;

    SpeedoText[playerid] = TextDrawCreate(180.000, 362.000," ");
    TextDrawAlignment(SpeedoText[playerid], 1);
    TextDrawFont(SpeedoText[playerid],2);
    TextDrawLetterSize(SpeedoText[playerid], 0.310, 1.400);
    TextDrawSetShadow(SpeedoText[playerid],0);
    //TextDrawUseBox(SpeedoText[playerid], 1);
    TextDrawBoxColor(SpeedoText[playerid], 0x99);
    TextDrawTextSize(SpeedoText[playerid], 520.000, 0.000);

    return 1;
    }


    Ich hoffe, euch verschafft das einen Überblick. Ich habe einfach keine Idee, was falsch ist. :/


    EDIT: Nein, keine Timer mit GetPlayerState... -.-

  • Da es wohl nun keiner wusste, hab' ich es selbst gelöst bekommen. :D


    if(IsPlayerConnected(i) && IsPlayerInAnyVehicle(i))
    {
    vehicleid = GetPlayerVehicleID(i);
    GetVehicleHealth(vehicleid, health);
    GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);

    //string = "~b~~h~B: ~w~";
    //strcat(string, VehicleNames[GetVehicleModel(vehicleid)-400], sizeof(string));

    string = "~n~~B~~h~Standort: ~w~";
    strcat(string, GetPlayer3DZone(i), sizeof(string));


    strcat(string, "~n~~B~~h~Zustand: ~g~", sizeof(string));
    fstring = "iiiiiiiiii";
    if(health > 1000.0) strins(fstring, "~r~", 10, sizeof(fstring));
    else if(health < 0.0) strins(fstring, "~r~", 0, sizeof(fstring));
    else strins(fstring, "~r~", floatround(health/100.0), sizeof(fstring));
    strcat(string, fstring, sizeof(string));


    Die Zeile strcat(string, "~n~~B~~h~Standort: ~w~", sizeof(string)); musste string = "~n~~B~~h~Standort: ~w~"; werden. Denn ohne diese Angabe wurde der String immer erweitert, wenn ein neuer User in ein Auto stieg. Wie wir alle wissen, crasht jedoch der SA:MP Client bei mehr als 800 Zeichen in einem String, da er die nicht anzeigen kann. Simples Problem, große Folge.


    Jetzt wisst ihr es für's nächste Mal - und ich auch. :)


    Liebste Grüße,
    PreJay.