Économisez 20% dès aujourd'hui Utilisez le code BIENVENUE lors du paiement. ACCUEILLIR

Éditeur de comportement des véhicules FiveM – Personnaliser la physique des voitures

Cet outil permet de modifier votre fichier de conduite de véhicule

.fhe-wrap{–bg:#0f1115;–fg:#e6e8eb;–muted:#97a1ab;–acc:#4f8cff;–accent2:#00c2a8;–border:#1b1f2a;–card:#141822;–warn:#ffcc00;font-family:system-ui,-apple-system,Segoe UI,Roboto,Inter,Arial,sans-serif;color:var(–fg)} .fhe-wrap{background:var(–bg);padding:24px;border-radius:16px;box-shadow:0 10px 30px rgba(0,0,0,.35);max-width:1100px;margin:24px auto;border:1px solid var(–border)} .fhe-top{display:flex;gap:12px;flex-wrap:wrap;align-items:center;justify-content:space-between;margin-bottom:16px} .fhe-title{font-size:18px;font-weight:700;letter-spacing:.2px} .fhe-controls{display:flex;gap:8px;flex-wrap:wrap} .fhe-btn{background:var(–card);border:1px solid var(–border);color:var(–fg);padding:8px 12px;border-radius:10px;cursor:pointer;transition:.15s;line-height:1} .fhe-btn:hover{border-color:#2d3342;transform:translateY(-1px)} .fhe-btn.primary{background:linear-gradient(180deg,var(–acc),#2b5fd9);border-color:#2b5fd9;color:white} .fhe-btn.secondary{background:linear-gradient(180deg,var(–accent2),#0aa890);border-color:#0aa890;color:white} .fhe-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px} @media (max-width:1000px){.fhe-grid{grid-template-columns:repeat(2,minmax(0,1fr))}} @media (max-width:640px){.fhe-grid{grid-template-columns:1fr}} .fhe-card{background:var(–card);border:1px solid var(–border);border-radius:14px;padding:14px} .fhe-card h3{margin:0 0 10px;font-size:14px;color:#c7d2e1;letter-spacing:.3px} .fhe-field{display:flex;flex-direction:column;gap:6px} .fhe-label{display:flex;align-items:center;justify-content:space-between;font-size:12px;color:var(–muted)} .fhe-input{width:100%;padding:8px 10px;border-radius:10px;border:1px solid #2a3141;background:#0e121a;color:var(–fg);outline:none} .fhe-input:focus{border-color:var(–acc);box-shadow:0 0 0 3px rgba(79,140,255,.15)} .fhe-metrics{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;margin-top:10px} @media (max-width:1000px){.fhe-metrics{grid-template-columns:repeat(2,minmax(0,1fr))}} @media (max-width:640px){.fhe-metrics{grid-template-columns:1fr}} .fhe-kpi{background:linear-gradient(180deg,#121725,#0d111a);border:1px solid var(–border);border-radius:12px;padding:12px} .fhe-kpi .kpi-h{font-size:11px;color:#9aa7b5;margin-bottom:6px} .fhe-kpi .kpi-v{font-size:18px;font-weight:700} .fhe-row{display:flex;gap:12px;flex-wrap:wrap;margin-top:16px} .fhe-col{flex:1;min-width:280px} textarea.fhe-text{width:100%;min-height:180px;background:#0e121a;color:var(–fg);border:1px solid #2a3141;border-radius:12px;padding:10px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace} .fhe-subtle{font-size:12px;color:var(–muted)} .fhe-badge{display:inline-block;background:#0e243f;border:1px solid #163a6b;color:#a7c5ff;padding:2px 8px;border-radius:999px;font-size:11px;margin-left:8px} .fhe-help{font-size:12px;color:#99a7b8;margin-top:8px} .fhe-sep{height:1px;background:var(–border);margin:14px 0} .fhe-note{background:#1b1f2a;border:1px dashed #2e3446;color:#dfdfdf;border-radius:12px;padding:10px;font-size:12px} .fhe-warn{color:var(–warn)}
Éditeur de gestion FiveM Lite • Intégrer

Importer

Formats KV : fMasse=1600,0, fMasse 1600,0, ou <fMass value="1600.0"/>.

Sortir

Utiliser Copier la sortie ou Télécharger XML.
Remarques: Les estimations sont indicatives. Testez en jeu. Les valeurs sont conservées localement (localStorage).
Transmission intégrale/propulsion : fDriveBiasFront → 0 = propulsion, 1 = traction avant, 0,5 = traction intégrale.
Confidentialité: 100% côté client. Aucune donnée ne quitte la page.
(function(){ const KEY = ‘fhe_state_v1’; const $ = (s, r=document)=>r.querySelector(s); const root = $(‘#fhe-root’); if(!root) return; const FIELDS = { HandlingName: { label: ‘HandlingName’, type:’text’ }, fMass: { label: ‘fMass’, min:1, max:10000, step:1 }, fInitialDragCoeff: { label: ‘fInitialDragCoeff’, min:0, max:100, step:0.1 }, fPercentSubmerged: { label: ‘fPercentSubmerged’, min:0, max:200, step:1 }, fDriveBiasFront: { label: ‘fDriveBiasFront (0=RWD,1=FWD)’, min:0, max:1, step:0.01 }, nInitialDriveGears: { label: ‘nInitialDriveGears’, min:1, max:10, step:1 }, fInitialDriveForce: { label: ‘fInitialDriveForce’, min:0, max:2, step:0.01 }, fDriveInertia: { label: ‘fDriveInertia’, min:0.1, max:5, step:0.01 }, fClutchChangeRateScaleUpShift: { label: ‘fClutchChangeRateScaleUpShift’, min:0, max:10, step:0.1 }, fClutchChangeRateScaleDownShift: { label: ‘fClutchChangeRateScaleDownShift’, min:0, max:10, step:0.1 }, fInitialDriveMaxFlatVel: { label: ‘fInitialDriveMaxFlatVel (approx m/s)’, min:1, max:500, step:0.1 }, fBrakeForce: { label: ‘fBrakeForce’, min:0, max:10, step:0.01 }, fHandBrakeForce: { label: ‘fHandBrakeForce’, min:0, max:10, step:0.01 }, fSteeringLock: { label: ‘fSteeringLock (deg)’, min:1, max:90, step:0.1 }, fTractionCurveMax: { label: ‘fTractionCurveMax’, min:0, max:10, step:0.01 }, fTractionCurveMin: { label: ‘fTractionCurveMin’, min:0, max:10, step:0.01 }, fSuspensionForce: { label: ‘fSuspensionForce’, min:0, max:20, step:0.1 }, fSuspensionCompDamp: { label: ‘fSuspensionCompDamp’, min:0, max:10, step:0.1 }, fSuspensionReboundDamp: { label: ‘fSuspensionReboundDamp’, min:0, max:10, step:0.1 }, fRollCentreHeightFront: { label: ‘fRollCentreHeightFront’, min:-1, max:2, step:0.01 }, fRollCentreHeightRear: { label: ‘fRollCentreHeightRear’, min:-1, max:2, step:0.01 } }; const DEFAULTS = { HandlingName: ‘ADDER’, fMass: 1600, fInitialDragCoeff: 7.0, fPercentSubmerged: 85, fDriveBiasFront: 0.0, nInitialDriveGears: 6, fInitialDriveForce: 0.35, fDriveInertia: 1.0, fClutchChangeRateScaleUpShift: 2.5, fClutchChangeRateScaleDownShift: 2.0, fInitialDriveMaxFlatVel: 150.0, fBrakeForce: 1.0, fHandBrakeForce: 0.7, fSteeringLock: 40.0, fTractionCurveMax: 2.30, fTractionCurveMin: 2.10, fSuspensionForce: 2.50, fSuspensionCompDamp: 1.40, fSuspensionReboundDamp: 1.70, fRollCentreHeightFront: 0.30, fRollCentreHeightRear: 0.30 }; const grid = $(‘#fhe-grid’); const metrics = $(‘#fhe-metrics’); const outArea = $(‘#fhe-output’); const inArea = $(‘#fhe-import’); let state = load() || {…DEFAULTS}; function load(){ try{ const raw = localStorage.getItem(KEY); return raw? JSON.parse(raw):null; }catch(e){ return null; } } function save(){ try{ localStorage.setItem(KEY, JSON.stringify(state)); }catch(e){} } function fmt(n,d=3){ return (typeof n===’number’&&isFinite(n)) ? Number(n.toFixed(d)).toString() : ‘—’; } function clamp(v,min,max){ return Math.max(min, Math.min(max, v)); } function escapeAttr(s){ return String(s).replace(/&/g,’&’).replace(/”/g,’"’).replace(/{ const value = state[k] ?? ”; const isText = m.type===’text’; const card = document.createElement(‘div’); card.className = ‘fhe-card’; card.innerHTML = `
${m.label}${k}
`; grid.appendChild(card); }); Object.keys(FIELDS).forEach(k=>{ const el = $('#fhe-'+cssEscape(k)); el.addEventListener('input',()=>{ const meta = FIELDS[k]; if(meta.type==='text'){ state[k] = el.value.trim(); } else { const n = Number(el.value); if(!isNaN(n)) state[k]=n; } save(); renderMetrics(); },{passive:true}); }); } function renderMetrics(){ const kmh = state.fInitialDriveMaxFlatVel * 3.6; const accelScore = clamp((state.fInitialDriveForce * state.fDriveInertia * 900)/Math.max(500,state.fMass),0,10); const gripScore = clamp(((state.fTractionCurveMin+state.fTractionCurveMax)/2)*(1.6 – (state.fMass/4000)),0,10); const brakeScore = clamp(state.fBrakeForce * (1600/state.fMass) * 3,0,10); metrics.innerHTML = `
Vitesse maximale estimée
${fmt(kmh,0)} km/h
fInitialDriveMaxFlatVel × 3,6
Score d'accélération
${fmt(accelScore,1)} / 10
Masse • Force • Inertie
Score de prise en main
${fmt(gripScore,1)} / 10
Traction et masse
Score de freinage
${fmt(brakeScore,1)} / 10
Force et masse de freinage
`; } function toXML(){ const x=(k,v)=>` `; const body = Object.keys(FIELDS).map(k=>x(k,state[k]??”)).join(‘\n’); const header = ”; /* avoid ‘<?xml' */ return `${header} ${body} `; } function toKV(){ return Object.keys(FIELDS).map(k=>{ const v = state[k]??”; return `${k}=${typeof v===’number’?Number(v).toFixed(6):v}`; }).join(‘\n’); } function parseXML(text){ try{ const doc = new DOMParser().parseFromString(text,’application/xml’); if(doc.querySelector(‘parsererror’)) return null; const next = {…state}; Object.keys(FIELDS).forEach(k=>{ const el = doc.querySelector(k); if(!el) return; let val = el.getAttribute(‘value’); if(val==null) val = el.textContent; if(val==null) return; const meta = FIELDS[k]; if(meta.type===’text’) next[k] = String(val).trim(); else { const n = Number(val); if(!isNaN(n)) next[k]=n; } }); return next; }catch(e){ return null; } } function parseKV(text){ const next = {…state}; const lines = text.split(/\r?\n/).map(s=>s.trim()).filter(Boolean); for(const line of lines){ let m = line.match(/^\s*([a-zA-Z0-9_]+)\s*=\s*(“?)([^”]+)\2\s*$/) || line.match(/^\s*([a-zA-Z0-9_]+)\s+([^\s]+)\s*$/) || line.match(/^\s*]*\bvalue\s*=\s*”(.*?)”[^>]*\/?>\s*$/); if(!m) continue; const key = m[1], val = m[3] ?? m[2]; if(!(key in FIELDS)) continue; const meta = FIELDS[key]; if(meta.type===’text’) next[key]=String(val).trim(); else { const n = Number(val); if(!isNaN(n)) next[key]=n; } } return next; } function setState(next){ state = {…state, …next}; save(); renderFields(); renderMetrics(); } function download(filename,content){ const blob = new Blob([content],{type:’application/xml;charset=utf-8′}); const url = URL.createObjectURL(blob); const a = document.createElement(‘a’); a.href=url; a.download=filename; a.click(); setTimeout(()=>URL.revokeObjectURL(url),5000); } document.getElementById(‘fhe-root’).addEventListener(‘click’, (e)=>{ const btn = e.target.closest(‘.fhe-btn’); if(!btn) return; const a = btn.getAttribute(‘data-action’); if(a===’reset’){ setState({…DEFAULTS}); document.getElementById(‘fhe-output’).value=”; document.getElementById(‘fhe-import’).value=”; } if(a===’save’){ save(); btn.textContent=’Saved’; setTimeout(()=>btn.textContent=’Save’,900); } if(a===’load-example’){ setState({ HandlingName:’GODMODEX’, fMass:1450,fInitialDragCoeff:6.4,fPercentSubmerged:85,fDriveBiasFront:0.05,nInitialDriveGears:7, fInitialDriveForce:0.40,fDriveInertia:1.15,fClutchChangeRateScaleUpShift:3.2,fClutchChangeRateScaleDownShift:2.6, fInitialDriveMaxFlatVel:165,fBrakeForce:1.10,fHandBrakeForce:0.9,fSteeringLock:38.0,fTractionCurveMax:2.45, fTractionCurveMin:2.20,fSuspensionForce:2.7,fSuspensionCompDamp:1.5,fSuspensionReboundDamp:1.8, fRollCentreHeightFront:0.32,fRollCentreHeightRear:0.32 }); } if(a===’export-xml’){ document.getElementById(‘fhe-output’).value = toXML(); document.getElementById(‘fhe-output’).scrollIntoView({behavior:’smooth’,block:’center’}); } if(a===’export-kv’){ document.getElementById(‘fhe-output’).value = toKV(); document.getElementById(‘fhe-output’).scrollIntoView({behavior:’smooth’,block:’center’}); } if(a===’copy-output’){ const ta = document.getElementById(‘fhe-output’); if(!ta.value) ta.value = toXML(); ta.select(); document.execCommand(‘copy’); btn.textContent=’Copied’; setTimeout(()=>btn.textContent=’Copy Output’,900); } if(a===’download-xml’){ const xml = toXML(); const name = (state.HandlingName||’handling’) + ‘.xml’; download(name, xml); } }); document.querySelector(‘#fhe-root [data-action=”import-xml”]’).addEventListener(‘click’, ()=>{ const txt = document.getElementById(‘fhe-import’).value.trim(); if(!txt){ alert(‘Paste XML into the Import box.’); return; } const next = parseXML(txt); if(!next){ alert(‘Could not parse XML.’); return; } setState(next); }); document.querySelector(‘#fhe-root [data-action=”import-kv”]’).addEventListener(‘click’, ()=>{ const txt = document.getElementById(‘fhe-import’).value.trim(); if(!txt){ alert(‘Paste KV lines into the Import box.’); return; } const next = parseKV(txt); setState(next); }); renderFields(); renderMetrics(); })();
Luc
Luc

Je m'appelle Luke, je suis un joueur et j'adore écrire sur FiveM, GTA et le jeu de rôle. Je dirige une communauté de jeu de rôle et j'ai environ 10 ans d'expérience dans l'administration de serveurs.

Articles: 570