Dealing with individual vehicle damage elements can be a little bit tricky because they're compressed in to bits to save space.
JernejL (RedShirt) has provided an example of dealing with individual damage elements and also provided some reusable functions:
pawn Code:
const object_undamaged = 0;
const door_swinging = 1;
const door_damaged = 2;
const door_damaged_swinging = 3;
const door_fell_off = 4;
const windshield_crackedA = 1;
const windshield_crackedB = 2;
const windshielddestroyed = 3;
encode_lights(light1, light2, light3, light4) {
return light1 | (light2 << 1) | (light3 << 2) | (light4 << 3);
}
encode_tires(tire1, tire2, tire3, tire4) {
return tire1 | (tire2 << 1) | (tire3 << 2) | (tire4 << 3);
}
encode_tires_bike(rear, front) {
return rear | (front << 1);
}
#pragma unused encode_tires_bike
encode_doors(bonnet, boot, driver_door, passenger_door, behind_driver_door, behind_passenger_door) {
#pragma unused behind_driver_door
#pragma unused behind_passenger_door
// will be modified once again, when rear doors are synced.
return bonnet | (boot << 8) | (driver_door << 16) | (passenger_door << 24);
}
encode_panels(flp, frp, rlp, rrp, windshield, front_bumper, rear_bumper) {
return flp | (frp << 4) | (rlp << 8) | (rrp << 12) | (windshield << 16) | (front_bumper << 20) | (rear_bumper << 24);
}
breakcar(PlayerID) {
if (IsPlayerInAnyVehicle(PlayerID)) {
new panels, doors, lights, tires;
GetVehicleDamageStatus(GetPlayerVehicleID(PlayerID), panels, doors, lights, tires);
panels = encode_panels(1, 1, 1, 1, 3, 3, 3); // damage windshield & make bumpers swing
doors = encode_doors(4, 4, 4, 4, 0, 0); // make them all fall off
lights = encode_lights(1, 1, 1, 1); // damage all lights
tires = encode_tires(1, 1, 1, 1); // damage all tires
UpdateVehicleDamageStatus(GetPlayerVehicleID(PlayerID), panels, doors, lights, tires);
}
return true;
}
OnVehicleDamageStatusUpdate(vehicleid, playerid) {
#pragma unused playerid
new panels, doors, lights, tires;
GetVehicleDamageStatus(vehicleid, panels, doors, lights, tires);
new driver_door, passenger_door/ *, behind_driver_door, behind_passenger_door* / = 0;
/ *
door & boot & bonnet status:
0: undamaged
1: swinging
2: damaged
3: damaged & swinging
4: fell off
* /
driver_door = doors >> 16 & 0x7;
passenger_door = doors >> 24 & 0x7;
// other 2 doors are not yet synced.
new bonnet, boot = 0;
bonnet = doors & 0x7;
boot = doors >> 8 & 0x7; // boot will not swing unless on specific car (like a bobcat)
new flp, frp, rlp, rrp, windshield, front_bumper, rear_bumper;
/ *
panels are unused on cars, they are used on planes tho.
* /
flp = panels >> 0 & 0xF;
frp = panels >> 4 & 0xF;
rlp = panels >> 8 & 0xF;
rrp = panels >> 12 & 0xF;
/ *
windshield:
0 undagamed
1,2 cracked
3: destroyed
* /
windshield = panels >> 16 & 0xF;
/ *
bonnet & boot:
0 undamaged
1 open swinging (hood only)
2 damaged
3 damaged swinging
4 fallen off
* /
front_bumper = panels >> 20 & 0xF;
rear_bumper = panels >> 24 & 0xF;
// for tires & lights: 1 damaged, 0 = ordinary
new tyre1, tyre2, tyre3, tyre4;
tyre1 = tires >> 0 & 0x1; // rear right (bike rear)
tyre2 = tires >> 1 & 0x1; // front right (bike front)
tyre3 = tires >> 2 & 0x1; // rear left
tyre4 = tires >> 3 & 0x1; // front left
new light1, light2, light3, light4;
light1 = lights >> 0 & 0x1; // front left
light2 = lights >> 1 & 0x1; // cant get to break rear light
light3 = lights >> 2 & 0x1; // front right
light4 = lights >> 3 & 0x1; // cant get to break rear light
// bike lights never break!
new string[128];
format(string,sizeof(string),"Doors: Driver: %d, Passenger: %d", driver_door, passenger_door);
SendClientMessageToAll(COLOR_RED, string);
format(string,sizeof(string),"Swinging: bonnet: %d, boot: %d", bonnet, boot);
SendClientMessageToAll(COLOR_RED, string);
format(string,sizeof(string),"panels: flp: %d, frp: %d, rlp: %d, rrp: %d, windshield: %d, front bumper: %d, rear bumper: %d", flp, frp, rlp, rrp, windshield, front_bumper, rear_bumper);
SendClientMessageToAll(COLOR_RED, string);
format(string,sizeof(string),"tires: %d %d %d %d", tyre1, tyre2, tyre3, tyre4);
SendClientMessageToAll(COLOR_RED, string);
format(string,sizeof(string),"lights: %d %d %d %d", light1, light2, light3, light4);
SendClientMessageToAll(COLOR_RED, string);
return 1;
}