Jak zmienić prowadzenie pojazdu (FiveM)

Jak zmienić prowadzenie pojazdu (FiveM)

Chcesz ostrzejszych hamulców, bardziej przyczepnych opon lub realistycznej fizyki driftu? Możesz zmienić prowadzenie pojazdów w FiveM na dwa czyste sposoby:

  1. Edytuj handling.meta do trwałego strojenia dla każdego modelu.
  2. Zmień prowadzenie w czasie rzeczywistym za pomocą natywów FiveM w skrypcie.

Ten przewodnik pokazuje obie metody, wyjaśnia każdą ważną wartość i zapewnia bezpieczne procedury testowania, które zapobiegają desynchronizacji i chaosowi na twoim serwerze.

Dostarczamy również narzędzie do zmiany wszystkich ustawień prowadzenia pojazdów.


Krótkie podsumowanie

  • Dla samochodów dodatkowych: edytuj plik tego zasobu handling.meta i upewnij się, że pojazd vehicles.meta wskazuje na to.
  • Dla podstawowych samochodów GTA: dodaj niestandardowy wpis prowadzenia i odwołaj się do niego w lekkim zasobie; nie edytuj plików gry.
  • Do modyfikacji na żywo: użyj SetVehicleHandlingFloat/Int/Vector na client który jest właścicielem pojazdu, a następnie zablokuj domyślne ustawienia za pomocą bramki po stronie serwera, jeśli to konieczne.
  • Testuj prawidłowo: zmierz 0–100 km/h, prędkość maksymalną, drogę hamowania i zachowanie w zakrętach; zapisz zmiany; szybko cofnij, jeśli prowadzenie się pogorszy.

Wymagania wstępne

  • Działający serwer FiveM i zasób deweloperski do testowania zmian.
  • Podstawowa wiedza o strukturze zasobu FiveM: fxmanifest.lua, client.lua, server.lua.
  • Edytor tekstu (VS Code) i dostęp do folderu z zasobami.

Wskazówka: przechowuj wszystkie zmiany prowadzenia w oddzielnym zasobie handling_tuning/ abyś mógł szybko go wyłączyć, jeśli coś się zepsuje.


Metoda 1: Edytuj handling.meta (stałe)

Gdzie to znaleźć

  • Pojazdy dodatkowe zwykle są dostarczane z data/handling.meta.
  • Jeśli nie, utwórz go i odwołaj się do niego w fxmanifest.lua.

Przykład struktury zasobu

resources/
 handling_tuning/
 fxmanifest.lua
 data/
 handling.meta
 vehicles.meta (only if you need to bind new handlingId)
 carvariations.meta (optional)

Minimalny fxmanifest.lua

fx_version 'cerulean'
game 'gta5'

files {
 'data/handling.meta',
 'data/vehicles.meta'
}

-- Tell the game what each file is
data_file 'HANDLING_FILE' 'data/handling.meta'
data_file 'VEHICLE_METADATA_FILE' 'data/vehicles.meta'

Przykład handling.meta wpis (samochód)

<HandlingData>
 <Item type="CHandlingData">
 <handlingName>MY_TUNED_SULTAN</handlingName>
 <fMass value="1400.0"/>
 <fInitialDragCoeff value="8.0"/>
 <fPercentSubmerged value="85.0"/>

 <!-- Engine / drivetrain -->
 <fInitialDriveForce value="0.31"/> <!-- Acceleration strength -->
 <fDriveInertia value="1.0"/>
 <fClutchChangeRateScaleUpShift value="2.5"/>
 <fClutchChangeRateScaleDownShift value="2.0"/>
 <fInitialDriveMaxFlatVel value="190.0"/> <!-- Approx top speed (km/h proxy) -->

 <!-- Brakes -->
 <fBrakeForce value="1.0"/>
 <fBrakeBiasFront value="0.55"/>
 <fHandBrakeForce value="0.65"/>

 <!-- Steering -->
 <fSteeringLock value="40.0"/>

 <!-- Grip / traction -->
 <fTractionCurveMax value="2.4"/> <!-- Peak grip -->
 <fTractionCurveMin value="2.1"/> <!-- Mid‑corner grip -->
 <fTractionCurveLateral value="22.0"/>
 <fTractionSpringDeltaMax value="0.14"/>
 <fLowSpeedTractionLossMult value="0.6"/>

 <!-- Suspension -->
 <fSuspensionForce value="2.0"/>
 <fSuspensionCompDamp value="1.5"/>
 <fSuspensionReboundDamp value="2.0"/>
 <fSuspensionUpperLimit value="0.08"/>
 <fSuspensionLowerLimit value="-0.10"/>
 <fSuspensionRaise value="0.00"/>
 <fAntiRollBarForce value="0.7"/>

 <!-- Weight balance / roll -->
 <fRollCentreHeightFront value="0.32"/>
 <fRollCentreHeightRear value="0.33"/>

 <!-- Model flags (optional) -->
 <strModelFlags>440010</strModelFlags>
 <strHandlingFlags>0</strHandlingFlags>

 </Item>
</HandlingData>

Powiąż obsługę z pojazdem

Jeśli wprowadziłeś nowy <handlingName>, wskaż swój pojazd na to w vehicles.meta:

<CVehicleModelInfo__InitDataList>
 <Item>
 <modelName>sultan</modelName>
 <handlingId>MY_TUNED_SULTAN</handlingId>
 </Item>
</CVehicleModelInfo__InitDataList>

Typowe cele strojenia

CelZmień te wartościUwagi
Szybsze przyspieszeniefInitialDriveForce nieco w górę; fDriveInertia trochę w góręUnikaj dużych skoków. Małe przyrosty 0.02–0.05.
Wyższa prędkość maksymalnafInitialDriveMaxFlatVel w góręZachowaj realizm dla równowagi.
Lepsze hamulcefBrakeForce w górę; odchylenie 0,55–0,65 przódZbyt wysokie blokowanie kół nierealistycznie.
Większa przyczepnośćfTractionCurveMax/Min w górę; w dół fLowSpeedTractionLossMultWysoka przyczepność ogranicza zabawne poślizgi.
Ustawienia dryfuNiższy fTractionCurveMax/Min; podnieś fLowSpeedTractionLossMult; zmniejsz fBrakeBiasFrontPołącz z wyższymi fSteeringLock.
Miększe zawieszenieNiższy fSuspensionForce; niższy fCompDamp/ReboundDampUważaj na dotykanie podłoża.
Bardziej płynne pokonywanie zakrętówPodnieś fAntiRollBarForce; dostosuj środki przechyłuZbyt sztywne powoduje nagłe nadsterowność.

Zachowaj lista zmian na pojazd: co zmieniłeś, o ile i jakie są wyniki testów.


Metoda 2: Nadpisywanie handlingu za pomocą natywów (runtime)

Użyj tego, gdy potrzebujesz dynamiczny konfiguracje (wyścigi, prace, wypożyczalnie) lub chcesz przetestować A/B przed zablokowaniem wartości handling.meta.

Przykładowy skrypt kliencki

-- client.lua
local function setHandlingFloat(model, field, value)
 local mhash = type(model) == 'string' and GetHashKey(model) or model
 SetVehicleHandlingFloat(mhash, 'CHandlingData', field, value)
end

CreateThread(function()
 -- Example: buff Sultan acceleration a bit
 setHandlingFloat('sultan', 'fInitialDriveForce', 0.33)
 setHandlingFloat('sultan', 'fInitialDriveMaxFlatVel', 195.0)
end)

Dotyczy tylko posiadanych pojazdów

Klient, który posiada obiekt powinien zastosować zmianę, aby uniknąć desynchronizacji. Jeśli potrzebujesz autorytetu serwera, połącz zdarzenie serwera z kontrolą właściciela obiektu i zastosuj ponownie na playerEnteredVehicle.

-- server.lua
RegisterNetEvent('tune:apply')
AddEventHandler('tune:apply', function(netId, changes)
 local src = source
 -- validate permissions here
 TriggerClientEvent('tune:applyClient', -1, netId, changes)
end)

-- client.lua
RegisterNetEvent('tune:applyClient')
AddEventHandler('tune:applyClient', function(netId, changes)
 local veh = NetToVeh(netId)
 if DoesEntityExist(veh) and NetworkHasControlOfEntity(veh) then
 for _, c in ipairs(changes) do
 SetVehicleHandlingFloat(GetEntityModel(veh), 'CHandlingData', c.field, c.value)
 end
 end
end)

W przypadku tymczasowych wzmocnień (nitro, wydarzenia) zapisz oryginalne wartości i przywróć je po sesji.


Bezpieczny przepływ pracy testowania

  1. Klonuj pojazd: najpierw przetestuj na jednym modelu, a nie na całej klasie.
  2. Ustaw wartości bazowe: zapas 0–100, prędkość maksymalna, dystans hamowania 100–0, standardowa slalom.
  3. Zmień jedną zmienną: wprowadzaj małe przyrosty, testuj po każdym.
  4. Użyj identycznych tras i pogody: usuń losowość.
  5. Zbierz opinie: pozwól wielu graczom testować; uwaga kontroler vs klawiatura.
  6. Monitoruj wydajność: sprawdź resmon dla skoków podczas skryptowania zmian na tick.

Prosta lista kontrolna KPI

  • 0–100 km/h improves by 5–10% without wheelspin.
  • Prędkość maksymalna wzrasta nie więcej niż jest to potrzebne do zbalansowania klasy.
  • Droga hamowania skraca się, ale pozostaje realistyczna.
  • Samochód pozostaje łapany na granicy; brak nagłego nadsterowności.

Zasady Równowagi i Anty-Chaosu

  • Ustaw klasy caps: prędkość maksymalna, moc, przyczepność na klasę (A, S, X). Udokumentuj limity.
  • Zastosuj walidację po stronie serwera, aby gracze nie mogli wprowadzać nielegalnych wartości.
  • Trzymać policja i służby ratunkowe przewidywalne pojazdy; nie przesadzaj z ulepszeniami.
  • W przypadku serwerów driftowych opublikuj pakiet bazowy driftu ze współdzielonymi wartościami, aby zmniejszyć liczbę skarg.

Rozwiązywanie problemów

Pojazd ignoruje Twój handlingId

  • Upewnij się, że vehicles.meta wpisów <handlingId> dokładnie pasuje <handlingName>.
  • Upewnij się, że załadowałeś vehicles.meta przez data_file 'VEHICLE_METADATA_FILE'.

Zmiany w obsłudze nie dotyczą dodanego samochodu

  • Niektóre paczki zawierają własne handling.meta. Usuń duplikaty lub upewnij się, że plik się ładuje po ich.

Desynchronizacja między graczami

  • Zastosuj nadpisania czasu wykonania u klienta posiadającego. Unikaj spamujących pętli; ustaw raz na odrodzenie.

Samochód zbyt łatwo się przewraca

  • Niższy środek ciężkości: lekko zwiększ fRollCentreHeightFront/Rear i zmniejsz fSuspensionRaise.

Niedostateczna przyczepność

  • Zwiększ fTractionCurveMin nieznacznie i fSteeringLock. Rozważ większe pochylenie hamulców tylnych.

Nadsterowność

  • Zwiększ lekko tylny chwyt lub stabilizator. Obniż fLowSpeedTractionLossMult.

Referencja: Kluczowe wartości obsługi

  • Silnik: fInitialDriveForce, fDriveInertia, fInitialDriveMaxFlatVel, fClutchChangeRateScaleUpShift/DownShift
  • Hamulce: fBrakeForce, fBrakeBiasFront, fHandBrakeForce
  • Kierowanie: fSteeringLock
  • Przyczepność: fTractionCurveMax/Min/Lateral, fLowSpeedTractionLossMult, fTractionSpringDeltaMax
  • Zawieszenie: fSuspensionForce, fSuspensionCompDamp, fSuspensionReboundDamp, fSuspensionUpper/LowerLimit, fSuspensionRaise, fAntiRollBarForce
  • Stabilność: fRollCentreHeightFront/Rear, fMass, fInitialDragCoeff

Przykład: Zrównoważona konfiguracja uliczna (skopiuj i dostosuj)

<Item type="CHandlingData">
 <handlingName>MX_STREET_BALANCED</handlingName>
 <fMass value="1500.0"/>
 <fInitialDragCoeff value="9.0"/>
 <fInitialDriveForce value="0.30"/>
 <fDriveInertia value="1.05"/>
 <fClutchChangeRateScaleUpShift value="2.2"/>
 <fClutchChangeRateScaleDownShift value="1.9"/>
 <fInitialDriveMaxFlatVel value="200.0"/>
 <fBrakeForce value="1.0"/>
 <fBrakeBiasFront value="0.60"/>
 <fHandBrakeForce value="0.55"/>
 <fSteeringLock value="38.0"/>
 <fTractionCurveMax value="2.35"/>
 <fTractionCurveMin value="2.05"/>
 <fLowSpeedTractionLossMult value="0.7"/>
 <fSuspensionForce value="2.2"/>
 <fSuspensionCompDamp value="1.6"/>
 <fSuspensionReboundDamp value="2.2"/>
 <fSuspensionUpperLimit value="0.07"/>
 <fSuspensionLowerLimit value="-0.09"/>
 <fAntiRollBarForce value="0.75"/>
 <fRollCentreHeightFront value="0.31"/>
 <fRollCentreHeightRear value="0.32"/>
</Item>

Często zadawane pytania

Jak zmienić ustawienia prowadzenia tylko dla jednego samochodu?
Utwórz nowy <handlingName> w handling.meta i odwołuj się do niego przez <handlingId> w vehicles.meta dla tego modelu.

Czy mogę zastosować zmiany obsługi dla każdego gracza lub zadania?
Tak. Użyj nadpisań w czasie wykonywania w skrypcie klienta, gdy zadanie się rozpoczyna, i przywróć wartości domyślne, gdy się kończy.

Dlaczego prędkość maksymalna wydaje się ograniczona?
fInitialDriveMaxFlatVel działa jako miękki limit. Opór aerodynamiczny i przełożenia skrzyni biegów nadal wpływają na rzeczywistą prędkość maksymalną.

Czy zmiany w handlingu wpływają na wydajność serwera?
Statyczny handling.meta zmiany nie. Dostosowania skryptów na tick mogą; ustaw raz przy spawnie i unikaj pętli.


Linki wewnętrzne


Odwołania zewnętrzne


Opublikuj listę kontrolną

  • Dodaj bloki kodu z przyciskami kopiowania.
  • Połącz powyższe pięć wewnętrznych przewodników.
  • Dodaj krótki klip demonstracyjny pokazujący drogę hamowania przed i po.
  • Sprawdź zachowanie międzyplatformowe (klawiatura/kontroler).
  • Przeprowadź test A/B przez 7 dni przed wdrożeniem na całej stronie.

Editorial review and source policy

Vehicle handling changes should be versioned per resource. Change one parameter, test braking, steering, collisions and networked behaviour, then compare against the original handling.meta. Do not edit a live shared pack without a rollback copy.