Tutorial qui aurait pu m'épargner 6 mois de bugs.
Le problème
Quand tu modifies les handling d'un véhicule (SetVehicleHandlingFloat etc.), si tu le fais après que le véhicule soit network-owned par un client, c'est lui qui propage la modif. Si ce client lag, est en VPN, ou tu es en transition d'ownership, tes modifs disparaissent.
La solution propre
-- Sur le client qui spawn le véhicule
local function applyHandling(vehicle, overrides)
if not DoesEntityExist(vehicle) then return end
-- 1. Wait for network ownership
while not NetworkHasControlOfEntity(vehicle) do
Wait(50)
end
-- 2. Apply
for key, value in pairs(overrides) do
if type(value) == 'number' then
SetVehicleHandlingFloat(vehicle, 'CHandlingData', key, value)
end
end
-- 3. Mark applied via state bag (so other clients can re-apply if ownership changes)
Entity(vehicle).state:set('handlingOverrides', overrides, true)
end
Et le bit critique que personne ne mentionne :
-- On every client, watch for ownership transfer
AddStateBagChangeHandler('handlingOverrides', nil, function(bagName, _, overrides)
local entity = GetEntityFromStateBagName(bagName)
if NetworkHasControlOfEntity(entity) then
applyHandling(entity, overrides)
end
end)
Sans ça, dès qu'un autre joueur prend network ownership du véhicule (passe à proximité, monte dedans), les modifs s'évaporent.
En bonus : pourquoi vos roues tombent en multi
Si tu modifies le fSuspensionForce côté client sans replicate, dès qu'un autre client devient owner, le véhicule "saute" parce que la suspension reset. Mets toujours tes overrides dans un stateBag et regarde-les côté client.