UpdateVehicleDamageStatus

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 Breadfish-Community,


    letztens habe ich etwas Hilfe gebraucht, wie man beim Callback GetVehicleDamageStatus die Fahrzeug schadeninformation herausfindet.
    Nun habe ich eine Frage, ich möchte jetzt das man mit einem Befehl nur die Motorhaube repariert.


    Folgendes habe ich versucht:


    Code
    stock GetDoorState(doorStates, Door:door, DoorState:doorState)
    	return (doorStates >>> (8 * _:door)) & _:doorState;




    Ich habe bei UpdateVehicleDamageStatus einen Fragezeichen geschrieben da ich nicht weiß welche Bits da hinzukommen.Geht das nicht mit dem enum das ich dann wo das Fragezeichen ist DOOR_HOOD reinschreibe?



    Könnte mir einer Helfen?
    Vielen Dank im Vorraus :)



    //Edit: Wenn es eine Bit zahl wäre wäre es dann diese: 0124000? Versuche es aus dem Wiki zu entnehmen.
    Komme aber nicht weiter...
    ( @Jeffry )

  • Ich habe eine Funktion geschrieben, mit der das zu realisieren wäre:
    stock SetDoorState(doorStates, Door:door, DoorState:doorState) //©Jeffry
    {
    new tmp[4];
    for(new i = 3; i >= 0; i--)
    {
    tmp[i] = (doorStates >> i * 8);
    doorStates -= (tmp[i] << i * 8);
    }
    tmp[_:door] = _:doorState;
    return ((tmp[3] << 24) + (tmp[2] << 16) + (tmp[1] << 8) + (tmp[0]));
    }


    Warum wäre?
    Ich habe es ausführlich getestet, nur scheint hier SA-MP mal wieder nicht so richtig funktionieren zu wollen. Es gibt einige Szenarios, bei denen der DamageStatus nicht korrekt geändert wird, obwohl der Wert, den SetDoorState zurück gibt offensichtlich stimmt (per Rechner die Bits ausgelesen und verglichen mit dem Wiki Beispiel: https://i.imgur.com/hox3Mz0.png).


    Für den Fixed-Status wäre noch das hier notwendig:
    #define IS_FIXED DoorState:0


    So hat dies aber zum Beispiel die Motorhaube nur geschlossen, aber nicht repariert.
    Ein weiteres Beispiel: Die Motorhaube war weg, nutzt man dann den Status IS_OPENED passierte gar nichts. Mit IS_DAMAGED allerdings war die Motorhaube wieder da, geschlossen aber kaputt. Das ist meiner Ansicht nach ein Problem von SA-MP, welches sich nicht wirklich beheben lässt.


    Ich konnte es dann so umgehen, um mein Ergebnis (Motorhaube offen und kaputt) hinzubekommen:
    if(!strcmp(cmdtext, "/test", true))
    {
    new panels, doors, lights, tires;
    GetVehicleDamageStatus(GetPlayerVehicleID(playerid),panels,doors,lights,tires);
    doors = SetDoorState(doors, DOOR_HOOD, IS_DAMAGED);
    UpdateVehicleDamageStatus(GetPlayerVehicleID(playerid),panels,doors,lights,tires);
    doors = SetDoorState(doors, DOOR_HOOD, IS_OPENED);
    UpdateVehicleDamageStatus(GetPlayerVehicleID(playerid),panels,doors,lights,tires);
    return 1;
    }
    Hier ist interessant, dass es wirklich nur klappt, wenn UpdateVehicleDamageStatus separat ausgeführt wird, obwohl das Ergebnis in "doors" nachher falsch ist (sollte ja nur IS_OPENED sein), ist die Motorhaube sowohl offen als auch kaputt gewesen. Die Ausgabe von doors war "1", was "Offen/Nicht-Kaputt" entspricht. Korrekt, aber nicht das, was im Spiel angezeigt wird. Die Gegenprüfung mit GetVehicleDamageStatus gab auch "1" zurück, was dem entspricht was gesetzt wurde, aber nicht dem entspricht, was im Spiel der Stand ist.


    Übrigens, in dem Test-Befehl, wenn man IS_DAMAGED und IS_OPENED vertauscht kam auch ein anderes Ergebnis raus, es war dann nämlich die Motorhaube nur kaputt, aber nicht offen, was ja korrekt ist, dem Ablauf nach, aber nicht erklärt, warum, wenn man es andersherum macht, beides genommen wird.


    Je nach dem was du am Ende machen willst könntest du es über RepairVehicle und SetDoorState/UpdateVehicleDamageStatus irgendwie hinbiegen. Das hilft allerdings nur viel Ausprobieren.

  • @Jeffry, krass daaanke!
    Echt danke das du mir geholfen hast, dickes Dankeschön :* :)


    Funktioniert jetzt auch, kann ich den neuen Define IS_FIXED eigentlich zum Enum hinzufügen?
    ( Teste ich trz gleich mal )


    Sollte ich Probleme/Schwierigkeiten weiterhin haben melde ich mich!
    Dank dir echt das war keine leichte Sache :)

  • Funktioniert jetzt auch, kann ich den neuen Define IS_FIXED eigentlich zum Enum hinzufügen?

    Ja, dann müsste das enum so aussehen:
    enum DoorState
    {
    IS_FIXED,
    IS_OPENED,
    IS_DAMAGED,
    DS_DUMMY,
    IS_REMOVED
    }
    Der Dummy ist notwendig, da IS_REMOVED den Wert 4 haben muss.


    Man könnte es auch komplett über Defines regeln, aber da der Stock GetDoorState schon so aufgebaut ist habe ich das einfach übernommen, damit der nicht geändert werden muss.