diff --git a/Server/Components/CAPI/Impl/NPCs/APIs.cpp b/Server/Components/CAPI/Impl/NPCs/APIs.cpp index 53c9c0baf..b96cbfabc 100644 --- a/Server/Components/CAPI/Impl/NPCs/APIs.cpp +++ b/Server/Components/CAPI/Impl/NPCs/APIs.cpp @@ -540,8 +540,7 @@ OMP_CAPI(NPC_PutInVehicle, bool(objectPtr npc, objectPtr vehicle, int seatId)) { POOL_ENTITY_RET(vehicles, IVehicle, vehicle, vehicle_, false); POOL_ENTITY_RET(npcs, INPC, npc, npc_, false); - npc_->putInVehicle(*vehicle_, seatId); - return true; + return npc_->putInVehicle(*vehicle_, seatId); } OMP_CAPI(NPC_RemoveFromVehicle, bool(objectPtr npc)) diff --git a/Server/Components/NPCs/NPC/npc.cpp b/Server/Components/NPCs/NPC/npc.cpp index 74ef1fb6a..0f0a90ba7 100644 --- a/Server/Components/NPCs/NPC/npc.cpp +++ b/Server/Components/NPCs/NPC/npc.cpp @@ -361,6 +361,7 @@ void NPC::respawn() float health = getHealth(); float armour = getArmour(); auto vehicle = vehicle_; + int vehicleId = vehicle ? vehicle->getID() : INVALID_VEHICLE_ID; int vehicleSeat = vehicleSeat_; int skin = player_->getSkin(); PlayerSpecialAction specialAction = getSpecialAction(); @@ -393,7 +394,7 @@ void NPC::respawn() setSkin(skin); setSpecialAction(specialAction); - if (vehicle) + if (vehicle && npcComponent_->getVehiclesPool()->get(vehicleId) == vehicle) { putInVehicle(*vehicle, vehicleSeat); } @@ -1548,9 +1549,16 @@ void NPC::exitVehicle() bool NPC::putInVehicle(IVehicle& vehicle, uint8_t seat) { - if (player_->getState() != PlayerState_OnFoot && spawning_ == false) + auto state = player_->getState(); + if (state != PlayerState_OnFoot && state != PlayerState_Spawned && spawning_ == false) { + // spawn() runs OnPlayerSpawn, which may destroy the vehicle + int vehicleId = vehicle.getID(); spawn(); + if (npcComponent_->getVehiclesPool()->get(vehicleId) != &vehicle) + { + return false; + } } auto maxPassengerSeats = getVehiclePassengerSeats(vehicle.getModel()); diff --git a/Server/Components/Pawn/Scripting/NPC/Natives.cpp b/Server/Components/Pawn/Scripting/NPC/Natives.cpp index fc153576f..4e32ed3cc 100644 --- a/Server/Components/Pawn/Scripting/NPC/Natives.cpp +++ b/Server/Components/Pawn/Scripting/NPC/Natives.cpp @@ -498,8 +498,7 @@ SCRIPT_API(NPC_ExitVehicle, bool(INPC& npc)) SCRIPT_API(NPC_PutInVehicle, bool(INPC& npc, IVehicle& vehicle, int seatId)) { - npc.putInVehicle(vehicle, seatId); - return true; + return npc.putInVehicle(vehicle, seatId); } SCRIPT_API(NPC_RemoveFromVehicle, bool(INPC& npc))