FiveM Yakıt Sistemi Scriptleri: Araçlar İçin Gerçekçi Yakıt Dolumu
FiveM sunucunuza çalışan yakıt sistemi ekleyin. Benzin istasyonları, yakıt bidonları, elektrikli araçlar ve QBCore, ESX ile standalone kurulumlar için en iyi yakıt scriptleri.
Agency Scripts
Agency Scripts Kurucusu ve Baş Geliştiricisi
Yakıt Tüketimi Mekanikleri
Gerçekçi bir yakıt sistemi vazgeçilmez bir atmosfer katmanı ekler ve sunucunuzun ekonomisini dengelemeye yardımcı olan doğal bir para havuzu oluşturur. Temel mekanizma, her aracın yakıt seviyesini 0 ile 100 arasında kayan noktalı bir değer olarak izlemeyi, motor etkinliğine ve sürüş davranışına göre azaltmayı içerir. Yakıt seviyesini entity state bag'leri ile Entity(vehicle).state.fuel böylece değer tüm istemcilerde kalıcı olur ve ağ sahipliği değişikliklerinden etkilenmez. Şu yöntemle elde edilen aracın mevcut RPM değerine göre tick başına tüketim oranını hesaplayın: GetVehicleCurrentRpm, gaz kelebeği konumu şuradan: GetControlNormal, ve aracın sınıfına özel tüketim çarpanı. Spor ve süper arabalar yakıtı ekonomik araçlara göre önemli ölçüde daha hızlı tüketmelidir, kamyonlar ve SUV'lar ise bunların arasında bir yerdedir. Hızlı hızlanma, uzun süreli yüksek hızlar ve motor freni gibi agresif sürüş davranışları için ek tüketim niteleyicileri uygulayın. Yakıt sıfıra ulaştığında şunu kullanarak aracın maksimum hızını kademeli olarak azaltın: SetVehicleMaxSpeed motoru anında durdurmak yerine tekleme hissi simüle etmek için; böylece oyuncuya aracı güvenli bir şekilde kenara çekmesi adına birkaç kritik saniye tanınır.
-- Client-side fuel consumption thread
local fuelConsumptionRate = 0.0
CreateThread(function()
while true do
local ped = PlayerPedId()
local vehicle = GetVehiclePedIsIn(ped, false)
if vehicle ~= 0 and GetPedInVehicleSeat(vehicle, -1) == ped then
local engineOn = GetIsVehicleEngineRunning(vehicle)
if engineOn then
local rpm = GetVehicleCurrentRpm(vehicle)
local speed = GetEntitySpeed(vehicle) * 3.6 -- km/h
local classMultiplier = Config.ClassConsumption[GetVehicleClass(vehicle)] or 1.0
-- Base consumption + RPM factor + speed factor
fuelConsumptionRate = (Config.BaseConsumption
+ (rpm * Config.RpmFactor)
+ (speed * Config.SpeedFactor)
) * classMultiplier
local currentFuel = Entity(vehicle).state.fuel or 100.0
local newFuel = math.max(0.0, currentFuel - fuelConsumptionRate)
Entity(vehicle).state:set('fuel', newFuel, true)
-- Engine stall when empty
if newFuel <= 0 then
SetVehicleUndriveable(vehicle, true)
SetVehicleEngineOn(vehicle, false, true, true)
elseif newFuel <= 5.0 then
-- Sputtering effect
SetVehicleMaxSpeed(vehicle, 30.0 * (newFuel / 5.0))
end
end
end
Wait(1000) -- Update every second
end
end)
Benzinlik Arayüzü ve Yakıt Doldurma
Benzinlik deneyimi, iyi tasarlanmış bir NUI arayüzü sayesinde kusursuz ve sezgisel hissettirmelidir. Bir oyuncu belirli bir yarıçap içinde bir yakıt pompasının yanına park ettiğinde bir etkileşim istemi gösterin. Etkileşim kurulduğunda: mevcut yakıt seviyesini bir gösterge veya ilerleme çubuğu olarak, aracın depo kapasitesini, mevcut yakıt türüne göre litre başına fiyatı ve depoyu tamamen doldurma veya belirli bir dolar tutarında yakıt alma seçeneklerini gösteren bir yakıt ikmali UI açın. Yakıt ikmali animasyonu, aracın yanında durup şu kullanılarak bir yakıt tabancası prop'u tutan oyuncu karakterinde oynatılmalıdır: TaskPlayAnim, ve özel bir prop kurulumu kullanıyorsanız yakıt pompasının kendisi. Yakıt anında dolmak yerine gerçek zamanlı olarak kademeli olarak dolmalıdır, bu, gerçekçilik katan ve kovalamacalar sırasında oyuncuların hızla yakıt ikmali yapmasını önleyen kısa bir bekleme oluşturur. Yakıt pompalandıkça güncellenen toplam maliyeti canlı olarak gösterin ve ödemeyi yalnızca oyuncu pompalamayı bıraktığında veya depo dolduğunda kesin. Premium istasyonlarda birden fazla yakıt türünü destekleyin: standart fiyata normal kurşunsuz, küçük bir performans artışı sağlayan ve daha pahalı olan premium yakıt ve ayrı pompalar kullanan kamyonlar ve endüstriyel araçlar için dizel.
Benzin Bidonu ve Acil Durum Yakıt İkmali
Otoyolda yakıtın bitmesi, sisteminizin oyuncuyu aracını terk etmeye zorlamadan sorunsuzca ele alması gereken gerçekçi bir senaryodur. Benzinliklerden veya yapı marketlerden satın alınabilen ve herhangi bir pompada yakıtla doldurulabilen bir jerry can eşyası uygulayın. Jerry can, genellikle 10-20 litre alan ve mevcut doluluk seviyesini takip eden meta verilere sahip, kullanılabilir bir envanter eşyası olarak çalışmalıdır. Bir oyuncu boş bir aracın yakınında jerry can kullandığında dökme animasyonu oynatın ve bidondan aracın deposuna yakıt aktarın. Jerry can, envanter sisteminde içerdiği yakıt miktarıyla orantılı bir ağırlığa sahip olmalı ve dolu bir bidon boş bir bidondan daha ağır olmalıdır. Oyun içi telefon üzerinden yol yardımının çağrılabildiği, ücret karşılığında yakıt teslimat hizmeti sunan bir NPC veya oyuncu tarafından kullanılan çekici yönlendiren bir mekanik ekleyin. Rol derinliği için oyuncular bir hortum eşyası kullanarak diğer araçlardan yakıt çekebilmeli, zaman kaybı ve suçüstü yakalanma riski karşılığında araçlar arasında yakıt aktarabilmelidir.
-- Jerry can usage handler
RegisterNetEvent('fuel:useJerryCan')
AddEventHandler('fuel:useJerryCan', function(slot)
local src = source
local ped = GetPlayerPed(src)
local coords = GetEntityCoords(ped)
-- Find nearest vehicle
local nearbyVehicle = GetClosestVehicle(coords, 3.0)
if not nearbyVehicle or nearbyVehicle == 0 then
return notify(src, 'No vehicle nearby.', 'error')
end
-- Get jerry can metadata
local canData = exports.ox_inventory:GetSlot(src, slot)
if not canData or not canData.metadata or not canData.metadata.fuel then
return notify(src, 'Jerry can is empty.', 'error')
end
local canFuel = canData.metadata.fuel
local vehicleFuel = Entity(nearbyVehicle).state.fuel or 0.0
local maxTransfer = math.min(canFuel, 100.0 - vehicleFuel)
if maxTransfer <= 0 then
return notify(src, 'Vehicle tank is already full.', 'error')
end
-- Transfer fuel
Entity(nearbyVehicle).state:set('fuel', vehicleFuel + maxTransfer, true)
-- Update jerry can metadata
local remainingFuel = canFuel - maxTransfer
if remainingFuel <= 0 then
exports.ox_inventory:SetMetadata(src, slot, { fuel = 0, label = 'Empty Jerry Can' })
else
exports.ox_inventory:SetMetadata(src, slot, { fuel = remainingFuel })
end
notify(src, ('Transferred %.1f liters to the vehicle.'):format(maxTransfer), 'success')
end)
Elektrikli Araç Desteği
Modern roleplay sunucuları, giderek daha fazla oranda paralel bir şarj altyapısına ihtiyaç duyan elektrikli araçlara yer veriyor. Elektrikli araçlar benzin tüketmemeli, bunun yerine yakıt göstergesiyle aynı şekilde çalışan ancak farklı bir hızda azalan batarya şarj seviyesini tüketmelidir. Gerçek dünyadaki verimlilik avantajını yansıtacak şekilde, elektrikli araçların kilometre başına tüketimi benzinli araçlardan daha düşük olmalı, ancak şarj işlemi benzin doldurmaktan daha uzun sürerek farklı bir oynanış ritmi oluşturmalıdır. EV sahipleri için belirgin seyahat rotaları yaratmak adına şarj istasyonlarını geleneksel benzinliklere bağlı kalmadan haritanın belirli noktalarına yerleştirin. Mevcut şarj yüzdesini, tam şarj için tahmini süreyi ve kilovatsaat başına maliyeti gösteren bir şarj UI'ı uygulayın. Birim başına iki kat maliyetle bataryayı yarı sürede dolduran, premium istasyonlara özel bir hızlı şarj seçeneği ekleyin. Araç yapılandırması için EV'leri model hash'lerine göre sınıflandırın ve sistemin bir aracın benzin mi yoksa elektriğe mi ihtiyaç duyduğunu otomatik olarak algılaması için araç türünü config dosyanızda saklayın. Düşük hızlarda elektrik moduna ve otoyol hızlarında benzin moduna geçerek her iki kaynağı da daha düşük oranlarda tüketen ve her iki yakıt türünü de kullanabilen hibrit araçları destekleyin.
Dinamik Yakıt Fiyatlandırma Ekonomisi
Dinamik bir fiyatlandırma sistemi, yakıt ekonomisini canlı hissettirir ve oyuncular için ilgi çekici ekonomik kararlar yaratır. Yakıt fiyatlarını, arz ve talep mekaniklerine göre dalgalanan yapılandırılabilir bir orana dayandırın. Belirli zaman aralıklarında tüm istasyonlarda satın alınan toplam yakıtı takip edin ve tüketim yüksek olduğunda fiyatlar kademeli olarak yükselsin. Tüketim düştüğünde, daha fazla müşteri çekmek için fiyatlar azalsın. Blaine County bölgesindeki uzak istasyonların ulaşım maliyetleri nedeniyle daha yüksek ücret aldığı, şehir istasyonlarının ise daha düşük kâr marjlarıyla rekabet ettiği istasyona özel fiyatlandırma uygulayın. Sahibinin sunucu config dosyası tarafından tanımlanan minimum ve maksimum aralıkta kendi yakıt fiyatlarını belirleyebildiği, oyunculara ait benzin istasyonlarına izin vererek istasyon işletmecileri arasında gerçek bir fiyat rekabeti oluşturun. İstasyon sahibi, bir tedarikçi NPC'den toptan satış fiyatıyla toplu yakıt satın alır ve perakende satış fiyatına yükseltir, kâr marjı ise kendi geliri olur. Yarışlar veya soygunlar gibi yüksek araç aktivitesi içeren sunucu etkinlikleri sırasında yakıt maliyetlerinin aniden yükseldiği mevsimsel veya etkinliğe dayalı fiyat artışları ekleyin; bu durum tüm oyuncuları etkileyen ekonomik dalgalanmalar yaratır ve tasarrufu veya beklenen fiyat artışlarından önce stratejik yakıt alımlarını teşvik eder.
İşletme Olarak Benzinlik
Benzin istasyonlarını oyuncular tarafından işletilen işletmelere dönüştürmek, yakıt sistemine eksiksiz bir ekonomik döngü kazandırır. İstasyon sahibi, toptancı bir tedarikçiden yakıt teslimatları sipariş ederek envanteri yönetir, pompa onarımları ve yükseltmeler için ödeme yaparak ekipmanın bakımını sağlar ve saatlik ücret alan pompa görevlileri olarak diğer oyuncuları işe alıp personel yönetimini üstlenir. Yalnızca sahibinin erişebileceği: günlük satış hacmini, geliri, kar marjlarını, yer altı tanklarındaki mevcut yakıt stoğunu ve personel devam kayıtlarını gösteren bir istasyon yönetim paneli uygulayın. İstasyon, müşteriler yakıt aldıkça tükenen sınırlı kapasiteye sahip fiziksel bir yer altı tankına sahip olmalıdır: bu durum sahibinin gelmesi zaman alan ve peşin maliyet gerektiren tanker teslimatları planlamasını zorunlu kılar. İstasyonun içine, sahibinin atıştırmalıklar, içecekler ve temel ihtiyaç malzemeleri gibi ürünleri stoklayabileceği, müşterilerin yakıtlarının yanında bunları satın alarak ek bir gelir kapısı oluşturabileceği bir market bileşeni ekleyin. Aynı anda daha fazla müşteriye hizmet vermek için ek pompa alanları eklemek, ekstra hizmet ücreti karşılığında oto yıkama ekipmanı kurmak veya elektrikli araç pazarından pay almak için EV şarj istasyonları eklemek gibi istasyon yükseltmelerine izin verin. İstasyon itibarını fiyatlandırma adaleti, hizmet kesintisizliği ve müşteri memnuniyetine göre takip edin: böylece daha iyi itibara sahip istasyonlar haritada vurgulansın ve daha fazla müşteri çeksin.
HUD Entegrasyonu ve Yakıt Göstergesi
Yakıt göstergesi, oyuncuların sürekli göreceği kalıcı bir HUD öğesidir, bu nedenle temel bilgileri bir bakışta iletirken görsel olarak temiz ve dikkat dağıtmayan bir yapıda olmalıdır. Hız göstergesinin yanında veya ekranın bir köşesinde yer alan, mevcut yakıt seviyesini yarım daire şeklinde bir gösterge, dikey bir çubuk veya basit bir yüzde değeri olarak gösteren minimal bir yakıt göstergesi tasarlayın. Yeşilin %50'nin üzerindeki sağlıklı bir yakıt seviyesini, sarının %20-50 arasındaki orta düzey yakıtı ve kırmızının %20'nin altındaki kritik derecede düşük yakıtı gösterdiği bir renk kodlaması kullanın. Yakıt %15'in altına düştüğünde, oyuncunun kazara yakıtının bitmesini önlemek için periyodik bir düşük yakıt uyarı sesi tetikleyin ve göstergeyi yanıp söndürün. Sürüşün son birkaç dakikasındaki kilometre başına ortalama tüketime kalan yakıtın bölünmesiyle hesaplanan, mevcut tüketim oranına dayalı tahmini kalan mesafeyi görüntüleyin. HUD kalabalığını azaltmak için oyuncu yaya olduğunda yakıt göstergesini tamamen gizleyin ve bir araca bindiğinde yumuşak bir şekilde ekrana getirin. Minimal bir HUD tercih eden oyuncular için yakıt göstergesini tamamen gizleme ve yalnızca yakıt yapılandırılabilir bir eşiğin altına düştüğünde geçici bir bildirim olarak gösterme ayarı sunun. Uyumlu bir araç gösterge paneli deneyimi yaratmak için göstergeyi hız göstergesi ve motor sağlığı gibi diğer araç HUD öğeleriyle entegre edin.
Performans ve Senkronizasyon
Yakıt sistemi araç kullanan her istemcide sürekli çalışır, bu nedenle performans optimizasyonu kritik öneme sahiptir. Yakıt değişiklikleri saniyelik güncellemelerin kare başına güncellemelerden görsel olarak ayırt edilemeyeceği kadar kademeli olduğundan ve yaklaşık 60 kat daha az işlem gücü kullandığından, her kare tick'inde çalıştırmak yerine 1000 milisaniyelik bir tüketim güncelleme aralığı kullanın. Yakıt değerlerini özel ağ eventleri yerine entity state bag'lerinde saklayın; çünkü state bag'ler sık değişen değerler için optimize edilmiştir ve yalnızca değer gerçekten değiştiğinde senkronize olur. Sunucu yeniden başlatmalarında kalıcılık sağlamak amacıyla yakıtı veri tabanına kaydederken, bir aracın yakıtı her değiştiğinde ayrı ayrı yazmak yerine tüm araç yakıt güncellemelerini her 60 saniyede bir yürütülen tek bir sorguda toplayın. Yakıt takibi için anahtar olarak aracın ağ ID'sini kullanın ve veri tabanının şişmesini önlemek için artık mevcut olmayan araçların kayıtlı yakıt verilerini temizleyin. Yakıt ikmali sırasında bir aracın ağ sahipliğinin değiştiği uç durumu, yakıt değişikliklerini uygulamadan önce sahipliği kontrol ederek ve tüm ödeme işlemleri için sunucu tarafı doğrulaması kullanarak yönetin. Aynı anda çok sayıda müşterisi olan istasyonlar için, pompanın kullanımda olduğunu gösteren görsel bir gösterge sunarken iki oyuncunun aynı pompayı aynı anda kullanmasını engelleyen bir sıra sistemi uygulayın.