Schaden ab bestimmter Geschwindigkeit

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 liebe Brotfische.


    Ich habe mir heute mal wieder eine Frage gestellt, zu der ich hier Rat suche.


    Und zwar möchte ich an diesem Punkt: (Bild nur zum Verstehen)

    messen, wie schnell das Fahrzeug ist wenn es über den Bremsstein fährt. (Keine Ahnung, so nenn ich ihn...)
    Wenn er jetzt zum Beispiel an dieser Stelle über 40 fährt, soll dem Auto 10% abgezogen werden. (10%, weil ich gerade nicht weiß ob das Auto standart mäßig 100 der 1000 HP hat)


    Geht das? Und könnte einer mir vielleicht erklären mit welcher Abfrage ich das mit der Geschwindigkeit machen kann?
    Ich glaube für den Schaden am Auto kann man SetVehicleHealth(ID, -10), oder?



    Mit freundlichen Grüßen,
    Bosei.

  • Ich bin mir nicht sicher..
    Aber versuchs mal mit IsPlayerInArea..


    dann die Geschwindigkeit ausrechnen & schaden setzen 8)


    Also erstmal zum Verständnis. Ich kenne IsPlayerInRangeOfPoint, wo er ja die Reichweite in Form eines Kreises misst, hab ich Recht?
    Wo ist jetzt der Unterschied zu IsPlayerInArea?


    Und zweitens, das mit der Geschwindigkeit ausrechnen hab ich ja zum Teil gefragt... :D

  • Das Problem mit der Area (und auch einer kleinen IsPlayerInRangeOfPoint) ist aber, dass diese dann nur so groß sein dürfte wie der Bremsstein. Da du allerdings einen Timer nutzen musst um die Position jedes Spielers zu überprüfen, muss dieser einen sehr kleinen Delay haben, da die Zeit, in der man in der Area oder im Radius ist dann dementsprechend klein ist. Also wird das ganze System sehr laufzeit- und performance lastig.

  • Du brauchst erstmal ne Funktion, die dir die Geschwindigkeit berechnet:
    Hier ist eine, die ich mal für nen Speedo geschrieben hab:


    stock getVehSpeed(playerid)
    {
    new Float:gesch_f,gesch,Float:fPos[3];
    GetVehicleVelocity(GetPlayerVehicleID(playerid), fPos[0], fPos[1], fPos[2]);
    gesch_f = floatsqroot(floatpower(fPos[0], 2) + floatpower(fPos[1], 2) + floatpower(fPos[2], 2)) * 170;
    gesch = floatround(gesch_f);
    return gesch;
    }


    Dann brauchst du einen Timer mit einem sehr kleinen Delay (warum steht weiter oben in einem Post von mir)


    SetTimer("checkspeed",200,1); // Unter OnGameModeInit, alternativ kann man auch jedem Spieler einen eigenen Timer geben. KEine Ahnung ob das besser für die Performance ist


    Dann benötigen wir noch das check Callback



    forward checkspeed();
    public checkspeed()
    {
    for(new i = 0;i<MAX_PLAYERS;i++)
    {
    if(!IsPlayerConnected(i)) continue;
    if(!IsPlayerInAnyVehicle(i)) continue;
    if(GetPlayerState != PLAYER_STATE_DRIVER) continue;
    if(!IsPlayerInRangeOfPoint(i,2.0,x,y,z)) continue; // hier kann auch eine Area benutzt werden
    new speed = getVehSpeed(i);
    if(speed > limit) // limit bitte angeben
    {
    new Float:health;
    GetVehicleHealth(GetPlayerVehicleID(i),health);
    SetVehicleHealth(GetPlayerVehicleID(i),health-wert); // wert bitte angeben
    }
    }
    }

  • Dann brauchst du einen Timer mit einem sehr kleinen Delay (warum steht weiter oben in einem Post von mir)


    Dafür würd ich kein Timer nutzen...
    Da reicht auch OnPlayerUpdate aus da das genau so arbeitet (kleiner Tipp bei kleinen Funktionen kann man es mal anwenden aber nicht nur)

    All in all it's just another brick in the wall

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Darum bleib ich eigentlich immer gerne von OnPlayerUpdate weg, da es halt sehr oft (immer wenn beim Player was geupdated wird) aufgerufen wird. Da sind die 5 mal der Timer in der Sekunde weniger aufrufe. Dafür hat man beim Timer natürlich ne loop die alle Spieler durchgeht. Alternativ könnte man halt auch für jeden Spieler einen eigenen TimerEx verwenden. Dann summiert sich das aber natürlich auch wieder.

  • Dafür hat man beim Timer natürlich ne loop die alle Spieler durchgeht.


    Das kann aber bei der kleinen Zeit zu laggs führen daher meine ich es ja gut mit den OnPlayerUpdate, da es für jeden spieler selber ist ;)
    Mit SetTimerEx wirds auch wieder doof
    100 User ~> 100 Timer

    All in all it's just another brick in the wall

  • Also so wie ich das sehe ist die einzig logische Möglichkeit OnPlayerUpdate.
    Wie mache ich das aber dann?
    Hagi: Danke für das Beispiel! :) Aber wenn ich wirklich OnPlayerUpdate lieber nehmen sollte, hilft mir das jetzt leider nicht mehr weiter... :S

  • Dann nimmste die for raus und klatscht das alles in OnPlayerUpdate :D



    if(!IsPlayerInAnyVehicle(playerid)) continue;
    if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER) continue;
    if(!IsPlayerInRangeOfPoint(playerid,2.0,x,y,z)) continue; // hier kann auch eine Area benutzt werden
    new speed = getVehSpeed(playerid);
    if(speed > limit) // limit bitte angeben
    {
    new Float:health;
    GetVehicleHealth(GetPlayerVehicleID(playerid),health);
    SetVehicleHealth(GetPlayerVehicleID(playerid),health-wert); // wert bitte angeben
    }

  • Aber da OnPlayerUpdate x mal die Sekunde ausgeführt wird, besteht kaum eine Chance, dass das Fahrzeug diesen Punkt überlebt. Da der diesen Schadenswert x mal die Sekunde an das Fahrzeug ausgibt. (oder sehe ich da was falsch)?

  • Aber da OnPlayerUpdate x mal die Sekunde ausgeführt wird, besteht kaum eine Chance, dass das Fahrzeug diesen Punkt überlebt. Da der diesen Schadenswert x mal die Sekunde an das Fahrzeug ausgibt. (oder sehe ich da was falsch)?


    Musst du mal ausprobieren, ich glaube zwar nicht das das Auto so lange in der Grenze/an dem Punkt ist, wenn es mit 100 Klamotten unterwegs ist, aber falls dem so wäre, mit einer Variable abfangen :thumbup:

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

    Margarete Stokowski

  • Ach, was auch noch wichtig ist: Bei der Speed Funktion kannst/musst du den letzten Faktor deinen Bedürfnissen anpassen:


    gesch_f = floatsqroot(floatpower(fPos[0], 2) + floatpower(fPos[1], 2) + floatpower(fPos[2], 2)) * 170;


    Ich glaub mit 170 fährt ein Infernus knapp 240 km/h.

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen