Fahrzeug Leben in % anzeigen

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
  • Moin Leute,
    ich hab gestern zum Spaß nach Jahren angefangen mir wieder einen kleinen Server zu schreiben. Habe früher immer nur Copy'n'Paste gemacht und möchte das ganze nun richtig lernen.


    Jetzt zu meinem Problem:


    Ich lasse mir jedes Mal, wenn ich in ein Fahrzeug steige die Leben des Fahrzeugs (vorerst im Chat) ausgeben. Wollte dort gerne von 0 - 100 % stehen haben. Ich habe jetzt auch zB. "Das Fahrzeug hat noch 52 Struktur." da stehen, möchte aber gerne 52% Struktur haben. Einfach ein % Zeichen rein setzen ist nicht und auf andere Arten hab ich auch nichts vernünftiges hin bekommen. Kann mir wer helfen?


    public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
    {
    new
    Float:health,
    string[36];
    GetVehicleHealth(vehicleid, health);
    format(string,sizeof(string), "Das Fahrzeug hat noch %.0f Struktur.", health/10.0);
    SendClientMessage(playerid, COLOR_RED, string);
    return 1;
    }

  • Danke :)


    Jetzt hab ich aber ein Problem. Möchte mit einer While Schleife überprüfen, ob der Player noch im Fahrzeug ist und wenn er es ist, dann soll eben die VehicleHealth geschrieben werden (habe es mittlerweile als TextDraw). Wenn der Player nicht mehr im Fahrzeg ist, soll die Schleife aber enden und nicht den Server unnötig auslasten.


    Hab das jetzt so, aber ich vermute, dass das nicht passt :D


    public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
    {
    new
    Float:health,
    string[25];
    while (IsPlayerInVehicle(playerid, vehicleid) = 1)
    {
    PlayerTextDrawDestroy(playerid, healthText[playerid]);
    GetVehicleHealth(vehicleid, health);
    format(string,sizeof(string), "Fahrzeug: %.0f%s", health/10.0, "%");
    healthText[playerid] = CreatePlayerTextDraw(playerid, 320.0, 0.0, string);
    PlayerTextDrawShow(playerid, healthText[playerid]);
    };
    return 1;
    }

  • Warum mit einer Schleife und nicht mit der if abfrage?


    public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
    {
    new
    Float:health,
    string[25];


    if (IsPlayerInAnyVehicle()) // Wenn er in ein Vehicle ist
    {
    PlayerTextDrawDestroy(playerid, healthText[playerid]);
    GetVehicleHealth(vehicleid, health);
    format(string,sizeof(string), "Fahrzeug: %.0f%s", health/10.0, "%");
    healthText[playerid] = CreatePlayerTextDraw(playerid, 320.0, 0.0, string);
    PlayerTextDrawShow(playerid, healthText[playerid]);
    }
    return 1;
    }

  • Ich will ja, dass die Anzeige immer Aktuell bleibt, heißt, wenn ich vor eine Wand fahre und nur noch 75% habe, dann soll da auch sofort 75% stehen und nicht erst, wenn ich das nächste mal in das Fahrzeig steige.



    EDIT: Stimmt, da war ja was... Wie gesagt, habe bestimmt 3 Jahre nichts mehr geschrieben.

  • OnGameModeInit:
    SetTimer("TextdrawTimer", 1000, true);


    Unten im Gamemode:
    forward TextdrawTimer();
    public TextdrawTimer()
    {
    new
    Float:health,
    string[25];
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(IsPlayerInAnyVehicle(i))
    {
    GetVehicleHealth(GetPlayerVehicleID(i), health);
    format(string,sizeof(string), "Fahrzeug: %.0f%s", health/10.0, "%");
    PlayerTextDrawSetString(i, healthText[i], string);
    PlayerTextDrawShow(i, healthText[i]);
    }
    }
    return 1;
    }

  • Ah habe es Verstanden, wie Jeffry schon sagte solltest du das in einem Timer machen.
    Am besten in einen Sekunden Timer.


    Unter OnGameModeInit:


    SetTimer("UpdateVehicleHealth", 1000, true); // Erstellt ein Timer der das Callback UpdateVehicleHealth immer aufruft, true = Wiederholen


    Dort wo du Platz hast bzw deine Publics sind, dass hier hin machen, sollte so passen:


    forward UpdateVehicleHealth();
    public UpdateVehicleHealth()
    {
    new Float:health, string[25], vID;


    for (new i = 0; i < MAX_PLAYERS; i++)
    {
    if (!IsPlayerConnected(i) || !IsPlayerInAnyVehicle(i)) continue; // Wenn er nicht Online ist oder nicht in einem Vehicle ist Überspringen


    vID = GetPlayerVehicleID(i);
    PlayerTextDrawDestroy(i, healthText[i]);
    GetVehicleHealth(vID, health);
    format(string,sizeof(string), "Fahrzeug: %.0f%s", health/10.0, "%");
    healthText[i] = CreatePlayerTextDraw(i, 320.0, 0.0, string);
    PlayerTextDrawShow(i, healthText[i]);
    }
    return 1;
    }


    //EDIT:
    Jeffry: war schneller :D

  • Vieeeeelen Dank! Ich hätte jetzt bestimmt noch bis um 3 Uhr Nachts gesessen, bis ich das selber hin bekommen hätte. :D


    EDIT: Wenn man das Fahrzeug verlässt zerstöre ich immer den Textdraw. Doof nur, dass man das Fahrzeug so langsam verlässt und der Textdraw dann meistens wieder erstellt wird und dann auch stehen bleibt, wenn man nicht mehr drin sitzt.

    Einmal editiert, zuletzt von Incrazed ()