I recently did a vehicle based map and encountered similar problems, what I did to get around it was have functions like TryAssignDriver where we keep trying every .1 seconds to assign them and then check if they are in vehicle, if so then break and if not try again. (.inVehicle is from customPlayer class I made where I just subscribe to the player’s enter and exit vehicle event) if you race this loop against Sleep(10.0) it will fail after 10 seconds. Looks like this:
TryAssignDriver(A : agent, V : vehicle_spawner_device, C: CustomPlayer, FC : fort_character)<suspends>: void =
var i : int = 0
race:
loop:
Print("try assign {i}")
if:
C.inVehicle = true
then:
Print("Success")
break
else:
V.AssignDriver(A)
set i += 1
Sleep(0.1)
block:
Sleep(10.0)
Print("Assign Failed")
As far as keeping track of player’s vehicles, I use an AssetPool script where I check out the vehicle spawner assets per player:
PlayerAssets := class<concrete>:
var checkedOut : logic = false
@editable Follower : creative_prop = creative_prop{}#used for fps cam blocker, lights (?), particle FX
@editable Teleporter : creative_prop = creative_prop{} #used for teleporting spawners
@editable Bike : vehicle_spawner_sportbike_device = vehicle_spawner_sportbike_device{}
@editable SUV : vehicle_spawner_valet_suv_device = vehicle_spawner_valet_suv_device{}
@editable Sedan : vehicle_spawner_sedan_device = vehicle_spawner_sedan_device{}
Asset_Pool := class(creative_device):
@editable AssetPool<public> : []PlayerAssets = array{}
CheckOut<public>(id : int): void =
if:
AssetPool[id].checkedOut = false
set AssetPool[id].checkedOut = true
then:
Print("checked out {id}")
else :
Print("already checked out!")
#set checkedOut = true
Return<public>(id : int): void =
if:
AssetPool[id].checkedOut = true
set AssetPool[id].checkedOut = false
then:
Print("returned {id}")
else:
Print("not checked out!")