Bloga Geri Dön
Tutorial7 dk. okuma

FiveM Kiralık Araç Sistemi: Geçici Araç Kodlama

FiveM sunucunuza kiralık araçlar ekleyin. Süreli anahtarlar, depozitolar, otomatik iade mantığı ve QBCore, ESX ve standalone meslekler için en iyi kiralama scriptleri.

Agency Scripts

Agency Scripts Kurucusu ve Baş Geliştiricisi

Kiralama Sistemleri Roleplay'i Neden Geliştirir?

Bir roleplay sunucusundaki her oyuncu, özellikle yeni başlayan karakterler, bir araca sahip değildir. Kiralık araba ve bisiklet sistemi, uygun fiyatlarla geçici ulaşım sağlayarak bu boşluğu doldurur; kiralama noktalarında doğal roleplay fırsatları yaratır ve yeni oyunculara toplu taşımaya veya yürümeye bağımlı kalmadan haritayı keşfetme özgürlüğü sunar. Temel ulaşımın ötesinde kiralama sistemleri, ziyaretçilerin manzaralı sürüşler için üstü açık arabalar kiraladığı turizm roleplay'ini, belirli araç türleri gerektiren teslimat mesleklerini ve oyuncuların organize konvoylar veya yarışlar için uyumlu araçlara ihtiyaç duyduğu etkinlik senaryolarını destekler. Sistem ayrıca kiralama ücretleri, hasar depozitoları ve geç iade cezaları aracılığıyla sunucu ekonomisi için pasif bir gelir akışı oluşturur.

Filo Yapılandırması ve Araç Kategorileri

Kiralık araç filonuzu farklı oyuncu ihtiyaçlarına ve bütçelerine hitap eden kategorilere ayırın. Ekonomi sınıfı araçlar uygun fiyatlı temel ulaşım sağlar, orta segment arabalar daha fazla konfor ve performans sunar, premium araçlar lüks deneyimlere hitap eder ve motosikletler oyunculara iki tekerlekli bir alternatif sunar. Her kategoride net fiyatlandırmaya sahip birden fazla araç seçeneği bulunmalıdır. Oyuncuların ihtiyaçlarına en uygun ekonomik seçeneği belirleyebilmeleri için hem saatlik hem de günlük kiralama ücretlerine yer verin. Filoyu, mevcut her aracı kiralama fiyatı, gerekli depozitosu, kategorisi ve spawn modeliyle belirten bir yapılandırma tablosunda tanımlayın:

Config.RentalLocations = {
    ['airport'] = {
        label = 'LS Airport Car Rental',
        pedModel = 's_f_y_airhostess_01',
        pedCoords = vector4(-1037.34, -2736.82, 20.17, 238.52),
        spawnPoint = vector4(-1029.12, -2728.91, 20.17, 148.76),
        returnZone = vector3(-1035.00, -2730.00, 20.17),
        returnRadius = 10.0,
        categories = {'economy', 'midrange', 'premium', 'motorcycle'},
    },
    ['downtown'] = {
        label = 'Downtown Bike Rental',
        pedModel = 'a_m_y_business_02',
        pedCoords = vector4(-259.68, -892.41, 31.08, 69.24),
        spawnPoint = vector4(-264.30, -888.12, 31.08, 339.87),
        returnZone = vector3(-260.00, -890.00, 31.08),
        returnRadius = 8.0,
        categories = {'motorcycle', 'bicycle'},
    },
}

Config.RentalFleet = {
    economy = {
        {model = 'blista', label = 'Blista', priceHour = 150, priceDay = 800, deposit = 500},
        {model = 'asea', label = 'Asea', priceHour = 120, priceDay = 650, deposit = 400},
        {model = 'stanier', label = 'Stanier', priceHour = 130, priceDay = 700, deposit = 450},
    },
    midrange = {
        {model = 'schafter2', label = 'Schafter', priceHour = 300, priceDay = 1600, deposit = 1000},
        {model = 'oracle', label = 'Oracle', priceHour = 280, priceDay = 1500, deposit = 900},
    },
    premium = {
        {model = 'felon', label = 'Felon GT', priceHour = 600, priceDay = 3200, deposit = 2500},
        {model = 'exemplar', label = 'Exemplar', priceHour = 550, priceDay = 3000, deposit = 2000},
    },
    motorcycle = {
        {model = 'pcj', label = 'PCJ-600', priceHour = 100, priceDay = 500, deposit = 300},
        {model = 'sanchez', label = 'Sanchez', priceHour = 80, priceDay = 400, deposit = 250},
    },
    bicycle = {
        {model = 'cruiser', label = 'Cruiser Bike', priceHour = 30, priceDay = 150, deposit = 50},
        {model = 'tribike', label = 'Tri-Cycles Race', priceHour = 25, priceDay = 120, deposit = 50},
    },
}

Kiralama Süreci ve NUI Arayüzü

Kiralama etkileşimi, bir oyuncu kiralama tezgahındaki NPC'ye yaklaştığında başlar. Bir target sistemi veya yakınlık kontrolü kullanarak, filtreleme seçenekleriyle mevcut araç kategorilerini gösteren bir NUI menüsü açın. Her araç listesi: model adını, mümkünse bir görsel önizlemeyi, saatlik ve günlük ücretleri, gerekli depozitoyu ve uygunluk durumunu göstermelidir. Oyuncu bir araç seçip kiralama süresini onayladığında, sunucu işlemi gerçekleştirir. Toplam tutar, seçilen süre için kiralama ücreti artı hasar depozitosudur. Depozito sistem tarafından tutulur ve araç hasarsız olarak iade edildiğinde geri ödenir. Kiralama onayını, oyuncunun yeterli bakiyesi olduğunu doğrulayan, seçilen aracın uygunluğunu kontrol eden, oyuncudan ücreti tahsil eden ve kiralık aracı belirlenen spawn noktasında oluşturan bir sunucu eventi olarak uygulayın:

RegisterNetEvent('rental:server:rentVehicle', function(locationId, vehicleModel, duration)
    local src = source
    local Player = QBCore.Functions.GetPlayer(src)
    if not Player then return end

    local location = Config.RentalLocations[locationId]
    if not location then return end

    -- Check if player already has an active rental
    if ActiveRentals[Player.PlayerData.citizenid] then
        TriggerClientEvent('QBCore:Notify', src, 'You already have an active rental', 'error')
        return
    end

    -- Find vehicle config
    local vehicleConfig = nil
    for _, category in pairs(Config.RentalFleet) do
        for _, v in ipairs(category) do
            if v.model == vehicleModel then
                vehicleConfig = v
                break
            end
        end
        if vehicleConfig then break end
    end

    if not vehicleConfig then return end

    -- Calculate cost
    local rentalFee = duration == 'day' and vehicleConfig.priceDay or vehicleConfig.priceHour
    local totalCost = rentalFee + vehicleConfig.deposit

    if Player.Functions.GetMoney('bank') < totalCost then
        TriggerClientEvent('QBCore:Notify', src, 'Insufficient funds. Need $' .. totalCost, 'error')
        return
    end

    -- Charge player
    Player.Functions.RemoveMoney('bank', totalCost, 'vehicle-rental')

    -- Generate rental plate
    local plate = 'RNT' .. math.random(10000, 99999)

    -- Store active rental
    ActiveRentals[Player.PlayerData.citizenid] = {
        model = vehicleModel,
        plate = plate,
        deposit = vehicleConfig.deposit,
        rentalFee = rentalFee,
        startTime = os.time(),
        duration = duration,
        expiresAt = os.time() + (duration == 'day' and 86400 or 3600),
        locationId = locationId,
        initialHealth = 1000,
    }

    TriggerClientEvent('rental:client:spawnVehicle', src, vehicleModel, plate, location.spawnPoint)
    TriggerClientEvent('QBCore:Notify', src, 'Vehicle rented! Return before your time expires.', 'success')
end)

Hasar Depozitosu ve İade Mekanikleri

Hasar depozitosu sistemi, oyuncuların kiralık araçları nasıl kullandığı konusunda bir sorumluluk yaratır. Araç iade edildiğinde, mevcut sağlık değerlerini kiralama anında kaydedilen başlangıç değerleriyle karşılaştırın. GTA araçlarının motor, gövde ve münferit bileşenler için ayrı sağlık değerleri vardır; bu da size hasar değerlendirmesi üzerinde ayrıntılı kontrol sağlar. Oluşan hasara göre onarım maliyetini hesaplayın ve kalanı iade etmeden önce depozitodan düşün. Hasar depozito miktarını aşarsa oyuncuya iade yapılmaz ve ek bir ücret tahsil edilebilir. Araç kusursuz durumda iade edilirse depozitonun tamamı iade edilir. Bu sistem, GTA'nın sürüş fiziğinde kaçınılmaz olan küçük çizikler için cezalandırıcı olmadan dikkatli sürüşü teşvik eder:

RegisterNetEvent('rental:server:returnVehicle', function(vehicleNet)
    local src = source
    local Player = QBCore.Functions.GetPlayer(src)
    if not Player then return end

    local citizenid = Player.PlayerData.citizenid
    local rental = ActiveRentals[citizenid]
    if not rental then return end

    local vehicle = NetworkGetEntityFromNetworkId(vehicleNet)
    if not DoesEntityExist(vehicle) then return end

    -- Check plate matches
    local plate = GetVehicleNumberPlateText(vehicle)
    if plate:trim() ~= rental.plate then
        TriggerClientEvent('QBCore:Notify', src, 'This is not your rental vehicle', 'error')
        return
    end

    -- Calculate damage
    local bodyHealth = GetVehicleBodyHealth(vehicle)
    local engineHealth = GetVehicleEngineHealth(vehicle)
    local damagePercent = 1.0 - ((bodyHealth + engineHealth) / 2000.0)
    local repairCost = math.floor(rental.deposit * damagePercent)

    -- Calculate late fee
    local lateFee = 0
    if os.time() > rental.expiresAt then
        local overHours = math.ceil((os.time() - rental.expiresAt) / 3600)
        lateFee = overHours * 200
    end

    -- Refund deposit minus costs
    local refund = math.max(0, rental.deposit - repairCost - lateFee)

    if refund > 0 then
        Player.Functions.AddMoney('bank', refund, 'rental-deposit-refund')
    end

    DeleteEntity(vehicle)
    ActiveRentals[citizenid] = nil

    local message = string.format('Vehicle returned. Deposit: $%d | Repairs: $%d | Late fee: $%d | Refund: $%d',
        rental.deposit, repairCost, lateFee, refund)
    TriggerClientEvent('QBCore:Notify', src, message, refund > 0 and 'success' or 'warning')
end)

Süre Sonu ve Otomatik İade Sistemi

Kiralık araçlar süresiz olarak kalmamalıdır. Her kiralamanın ne zaman sona ereceğini takip eden ve buna göre harekete geçen bir zamanlayıcı sistemi uygulayın. Süre dolmadan otuz dakika önce oyuncuya bir bildirim gönderin, ardından on dakika kala bir bildirim daha ve beş dakika kala son bir uyarı iletin. Kiralama süresi dolduğunda, maksimum bir eşiğe kadar dakika başına gecikme ücreti almaya başlayın. Oyuncu sürenin dolmasından sonraki ek süre içinde aracı iade etmezse, aracı otomatik olarak despawn edin ve depozitonun tamamına el koyun. Bu, terk edilmiş kiralık araçların sunucuda kalabalık yapmasını önler. Süre aşımı kontrolü düzenli aralıklarla sunucu tarafında çalışmalı, tüm aktif kiralamaları taramalı ve kalan süreye göre uygun işlemi yapmalıdır. Gerektiğinde uzaktan silebilmek için aracın network ID değerini saklayın ve kiralama süresi dolmadan önce aracın tahrip edilmesi durumunu, depozitonun tamamına el koyarak kiralamayı otomatik olarak sonlandırarak yönetin.

Çoklu Kiralama Konumları

Kiralama noktalarını, harita genelinde geçici ulaşımın en mantıklı olduğu stratejik noktalara yerleştirin. Şehre yeni gelen oyunculara hizmet veren havalimanı belirgin bir tercihtir. Hükümet binalarının yakınındaki şehir merkezi konumları, mahkeme duruşmalarına veya iş toplantılarına katılan oyunculara hizmet verir. Sahil konumları ise kıyı şeridi boyunca boş zaman aktiviteleri için motosikletler ve bisikletler sunar. Her konum filonun farklı bir alt kümesini sunabilir; havalimanı ekonomiden prime kadar tüm yelpazeye sahipken sahil konumları yalnızca motosiklet ve bisiklet bulundurur. Ortama uyum sağlaması için her konumdaki NPC modelini özelleştirin. Havalimanı kiralamalarında profesyonel bir iş insanı modeli, sahil kiralamalarında rahat bir sörfçü modeli ve şehir merkezi konumlarında takım elbiseli bir memur kullanılır. Detaylara gösterilen bu özen, her kiralama noktasının aynı sistemin birebir kopyaları yerine farklı bir işletme gibi hissettirmesini sağlar.

GPS Takibi ve Hırsızlık Önleme

Kiralık araçlar, kiralama şirketinin ve oyuncunun aracı her an bulmasını sağlayan yerleşik GPS takibine sahip olmalıdır. Kiralık aracın konumunu oyuncunun haritasında belirgin bir blip simgesiyle gösterin. Araç yapılandırılabilir bir sınırın dışına çıkarsa bir uyarı bildirimi gönderin. Kiralık bir aracın kiralama sisteminin kontrolünde kalmasını sağlayarak diğer oyuncuların aracı saklamasını veya garaja koymasını önleyen hırsızlık önleme tedbirleri uygulayın. Bir oyuncu kiralık bir aracı kişisel garajına koymaya çalıştığında sistem, kiralık araçların saklanamayacağını açıklayan bir bildirimle bu eylemi engellemelidir. Motosikletler ve bisikletler için yalnızca kiralayan oyuncunun açabileceği sanal bir kilit ekleyerek hırsızlığı önleyin. Kiralık bir araç çalınırsa, kiralayan oyuncu bunu bir telefon uygulaması üzerinden bildirebilmeli ve aracı bulmasına yardımcı olacak bir GPS pingi tetikleyebilmelidir. Yüksek kilometreli kiralamalarda olası ek ücretler için kiralama sırasında toplam kilometreyi takip edin ve gerçekçi araç kiralama yönetimine bir katman daha ekleyin.

İşletme Entegrasyonu ve Oyuncuya Ait Kiralamalar

İşletme sahipliği sistemi olan sunucularda oyuncuların kendi kiralama işletmelerini satın almalarına ve işletmelerine izin verin. İşletme sahibi, kiralama havuzuna eklenecek araçları satın alarak filo yapısını belirler, fiyatlandırmayı ayarlar, bankoda görev yapacak çalışanları işe alır ve kiralamalardan gelir toplar. İşletme sahipleri aktif kiralamaları, günlük geliri, filo kullanım oranlarını ve birden fazla kiralama boyunca hasar biriktiren araçların bakım maliyetlerini gösteren bir yönetim paneline sahip olmalıdır. Çalışanlar; kiralama ve iade işlemlerini yürütme, iade edilen araçları hasar açısından inceleme ve anlaşmazlıkları işletme sahibine iletme gibi ön büro işlemlerini gerçekleştirebilir. Oyuncu odaklı bu yaklaşım, kiralama sistemini statik bir oyun mekaniğinden rol yapma sunucularının girişimci ruhunu yansıtan dinamik bir işletmeye dönüştürür ve yüksek aksiyonlu oynanış yerine müşteri hizmetleri rollerini tercih eden oyuncular için istihdam fırsatları yaratır.

Başlamaya Hazır mısınız?

Scriptleri mağazamızdan edinin veya destek, güncellemeler ve gelecek yeniliklere göz atmak için Discord'a katılın.