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.