Back to community

Vehicle handling overrides côté client : ce que je regrette d'avoir su trop tard

112 rep379 views1 min read

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.

41 3 commentsSign in to vote

Comments (3)

Sign in to leave a comment.
  • Le truc du stateBag pour re-apply à l'ownership transfer, c'est exactement ce qui me manquait. Mes courses custom plantaient toutes les 3 minutes, je comprenais pas.

    2 points
  • Tutorial parfait. À ajouter dans le wiki communautaire si tu m'autorises à reprendre ton snippet (avec crédit).

    2 points
    • paulo_rp

      Bien sûr, vas-y.