ब्लॉग पर वापस
Tutorial10 मिनट पढ़ें

FiveM टो ट्रक सिस्टम: स्क्रिप्ट प्रोफेशनल टोइंग जॉब्स

FiveM में एक टो ट्रक जॉब चलाएं। NPC अनुरोध, इम्पाउंड लॉजिक, फ्लैटबेड एनीमेशन और मैकेनिक व पुलिस इंटीग्रेशन के लिए सर्वश्रेष्ठ टो स्क्रिप्ट।

Agency Scripts

Agency Scripts के संस्थापक और प्रमुख डेवलपर

टो ट्रक सिस्टम अवलोकन

एक टो ट्रक और इंपाउंड सिस्टम आपके FiveM सर्वर पर एक पूरा नौकरी पारिस्थितिकी तंत्र बनाता है, जो खिलाड़ियों को एक नागरिक करियर पथ देता है जो स्वाभाविक रूप से कानून प्रवर्तन, मैकेनिक, और अन्य ड्राइवरों के साथ इंटरैक्ट करता है। सिस्टम में कई अंतर्संबंधित घटक शामिल हैं: एक नौकरी प्रबंधन परत जो क्लॉक इन और आउट को संभालती है, एक डिस्पैच सिस्टम जो उपलब्ध ड्राइवरों को टो अनुरोध भेजता है, वाहन संलग्नक मैकेनिक जो यथार्थवादी टोइंग का अनुकरण करते हैं, एक इंपाउंड लॉट जो जब्त और परित्यक्त वाहनों को संग्रहीत करता है, और एक शुल्क संरचना जो इंपाउंड किए गए वाहनों को पुनः प्राप्त करने की लागत को नियंत्रित करती है। जब अच्छी तरह से डिज़ाइन किया जाता है, तो टो ट्रक नौकरी सर्वर पर सबसे सामाजिक रूप से आकर्षक भूमिकाओं में से एक बन जाती है क्योंकि प्रत्येक कॉल में सीधे उस खिलाड़ी के साथ इंटरैक्शन होता है जिसे उनके टूटे या अवैध रूप से पार्क किए गए वाहन के लिए मदद की जरूरत होती है।

जॉब सेटअप और ड्यूटी सिस्टम

अपने फ्रेमवर्क के जॉब सिस्टम में टो ट्रक जॉब को परिभाषित करके शुरू करें। खिलाड़ियों को टो यार्ड स्थान पर क्लॉक इन करने में सक्षम होना चाहिए, कंपनी टो ट्रक प्राप्त करना चाहिए, और डिस्पैच कॉल स्वीकार करना शुरू करना चाहिए। ड्यूटी सिस्टम सक्रिय टो ड्राइवरों को ट्रैक करना चाहिए ताकि डिस्पैच सिस्टम जान सके कि कौन उपलब्ध है। जब कोई खिलाड़ी क्लॉक इन करता है, तो टो वाहन मॉडलों की पूर्वनिर्धारित सूची से एक फ्लैटबेड ट्रक स्पॉन करें और उसे उस खिलाड़ी को असाइन करें। जब वे क्लॉक आउट करते हैं, तो कंपनी वाहन को वापस किया जाना चाहिए या हटा दिया जाना चाहिए। खिलाड़ी की ऑन-ड्यूटी स्थिति को सर्वर-साइड स्टोर करें ताकि यह सही ढंग से बनी रहे और डिस्पैच सिस्टम द्वारा क्वेरी की जा सके:

Config.TowJob = {
    jobName = 'tow',
    clockInLocation = vector3(409.09, -1622.57, 29.29),
    vehicleSpawn = vector4(405.87, -1631.14, 29.29, 228.35),
    towVehicles = {
        {model = 'flatbed', label = 'Flatbed Truck', rank = 0},
        {model = 'towtruck', label = 'Tow Truck (Hook)', rank = 1},
        {model = 'towtruck2', label = 'Heavy Tow Truck', rank = 2},
    },
    impoundLot = vector3(409.59, -1637.87, 29.29),
    impoundReturn = vector4(403.12, -1640.23, 29.29, 138.92),
    payPerTow = {min = 350, max = 750},
    payPerImpound = 500,
}

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

    if Player.PlayerData.job.name ~= Config.TowJob.jobName then
        TriggerClientEvent('QBCore:Notify', src, 'You are not a tow driver', 'error')
        return
    end

    Player.Functions.SetJobDuty(true)
    TowDrivers[src] = {
        onDuty = true,
        currentCall = nil,
        vehicleNet = nil,
        towedVehicle = nil,
    }

    TriggerClientEvent('QBCore:Notify', src, 'You are now on duty', 'success')
    TriggerClientEvent('tow:client:spawnVehicle', src)
end)

वाहन संलग्नक तंत्र

एक tow सिस्टम की मुख्य तकनीकी चुनौती एक वाहन को दूसरे से इस तरह जोड़ना है कि वह यथार्थवादी दिखे और ड्राइविंग के दौरान सही व्यवहार करे। FiveM प्रदान करता है AttachEntityToEntity native इस उद्देश्य के लिए, लेकिन ऑफसेट पोजीशंस को सही ढंग से सेट करने के लिए प्रत्येक टो ट्रक मॉडल के लिए सावधानीपूर्वक कैलिब्रेशन आवश्यक है। फ्लैटबेड तरीका अधिकांश वाहनों के लिए सबसे अच्छा काम करता है: टो किया गया कार फ्लैटबेड प्लेटफॉर्म के ऊपर उचित ऑफसेट के साथ रखा जाता है ताकि यह बिस्तर पर स्वाभाविक रूप से बैठे। हुक-शैली टो ट्रकों के लिए, टो किए गए वाहन के सामने के पहिये उठाए जाते हैं जबकि पीछे के पहिये जमीन पर बने रहते हैं। प्रत्येक संलग्नक शैली को अलग-अलग ऑफसेट वेक्टर और रोटेशन मानों की आवश्यकता होती है। इन मानों का गेम में परीक्षण करें छोटे समायोजन करके जब तक वाहन सही ढंग से बिना ट्रक के माध्यम से क्लिप किए बैठे।

function AttachVehicleToFlatbed(towTruck, targetVehicle)
    local towModel = GetEntityModel(towTruck)

    -- Offsets calibrated for the flatbed model
    local offsets = {
        ['flatbed'] = {x = 0.0, y = -0.5, z = 1.1, rx = 0.0, ry = 0.0, rz = 0.0},
    }

    local offset = offsets['flatbed']
    if not offset then return false end

    -- Freeze target vehicle physics
    SetEntityCollision(targetVehicle, false, false)
    FreezeEntityPosition(targetVehicle, true)

    -- Attach to flatbed
    AttachEntityToEntity(
        targetVehicle, towTruck,
        0, -- bone index
        offset.x, offset.y, offset.z,
        offset.rx, offset.ry, offset.rz,
        false, false, false, false, 0, true
    )

    -- Store attachment state
    TriggerServerEvent('tow:server:vehicleAttached', VehToNet(towTruck), VehToNet(targetVehicle))
    return true
end

function DetachVehicleFromFlatbed(towTruck, targetVehicle)
    DetachEntity(targetVehicle, true, true)
    SetEntityCollision(targetVehicle, true, true)
    FreezeEntityPosition(targetVehicle, false)

    -- Place vehicle on ground behind the truck
    local truckCoords = GetEntityCoords(towTruck)
    local truckHeading = GetEntityHeading(towTruck)
    local behind = GetOffsetFromEntityInWorldCoords(towTruck, 0.0, -12.0, 0.0)

    SetEntityCoords(targetVehicle, behind.x, behind.y, behind.z)
    SetEntityHeading(targetVehicle, truckHeading)
    SetVehicleOnGroundProperly(targetVehicle)

    TriggerServerEvent('tow:server:vehicleDetached', VehToNet(towTruck))
end

एक महत्वपूर्ण विवरण संलग्न वाहन पर टक्कर को अक्षम करना है ताकि भौतिकी गड़बड़ियों को रोका जा सके। जब दो वाहन सक्रिय टक्कर के साथ संलग्न होते हैं, तो गेम इंजन हिंसक झटके उत्पन्न कर सकता है या वाहनों को हवा में उछाल सकता है। लक्ष्य वाहन की स्थिति को फ्रीज करना और संलग्न होने पर उसकी टक्कर को अक्षम करना इन समस्याओं को पूरी तरह समाप्त करता है।

डिस्पैच और टो अनुरोध प्रणाली

डिस्पैच सिस्टम उन खिलाड़ियों को जोड़ता है जिन्हें टो की आवश्यकता होती है और उपलब्ध टो ट्रक ड्राइवरों के साथ। खिलाड़ी अपने फोन, मैकेनिक शॉप NPC, या मानचित्र के आसपास रखे रोडसाइड कॉल बॉक्स के माध्यम से टो का अनुरोध कर सकते हैं। जब अनुरोध आता है, तो सर्वर उपलब्ध टो ड्राइवरों की जांच करता है और कॉल को सबसे निकटतम ड्राइवर को मार्गदर्शित करता है। यदि कोई ड्राइवर ड्यूटी पर नहीं है, तो एक फॉलबैक NPC टो सेवा प्रदान करें जो उच्च शुल्क लेती है और विलंब के बाद वाहन को इंपाउंड लॉट में टेलीपोर्ट करती है। डिस्पैच सूचना में अनुरोधकर्ता का स्थान, वाहन मॉडल, और टो का कारण जैसे ब्रेकडाउन, दुर्घटना, या अवैध पार्किंग शामिल होना चाहिए। टो ड्राइवर को कॉल स्वीकार या अस्वीकार करने का विकल्प दें, अस्वीकार की गई कॉल्स अगले निकटतम ड्राइवर को भेजी जाती हैं:

RegisterNetEvent('tow:server:requestTow', function(reason)
    local src = source
    local Player = QBCore.Functions.GetPlayer(src)
    if not Player then return end

    local playerCoords = GetEntityCoords(GetPlayerPed(src))
    local vehicle = GetVehiclePedIsIn(GetPlayerPed(src), true)
    local vehicleModel = vehicle ~= 0 and GetDisplayNameFromVehicleModel(GetEntityModel(vehicle)) or 'Unknown'

    -- Find nearest available tow driver
    local nearestDriver = nil
    local nearestDist = math.huge

    for driverId, data in pairs(TowDrivers) do
        if data.onDuty and not data.currentCall then
            local driverCoords = GetEntityCoords(GetPlayerPed(driverId))
            local dist = #(playerCoords - driverCoords)
            if dist < nearestDist then
                nearestDist = dist
                nearestDriver = driverId
            end
        end
    end

    if nearestDriver then
        TowDrivers[nearestDriver].currentCall = {
            requesterId = src,
            coords = playerCoords,
            vehicle = vehicleModel,
            reason = reason,
            timestamp = os.time(),
        }

        TriggerClientEvent('tow:client:incomingCall', nearestDriver, {
            coords = playerCoords,
            vehicle = vehicleModel,
            reason = reason,
            playerName = Player.PlayerData.charinfo.firstname,
        })

        TriggerClientEvent('QBCore:Notify', src, 'Tow truck dispatched. ETA based on driver location.', 'success')
    else
        TriggerClientEvent('QBCore:Notify', src, 'No tow drivers available. NPC service will arrive shortly.', 'info')
        StartNPCTowService(src, playerCoords, vehicle)
    end
end)

इंपाउंड लॉट प्रबंधन

इम्पाउंड लॉट वह जगह है जहां टो किए गए और जब्त किए गए वाहन तब तक संग्रहीत होते हैं जब तक उनके मालिक उन्हें पुनः प्राप्त नहीं करते। इम्पाउंड डेटाबेस को डिज़ाइन करें ताकि यह ट्रैक कर सके कि कौन से वाहन वर्तमान में इम्पाउंड हैं, किसने उन्हें इम्पाउंड किया, कब इम्पाउंड किया गया, और रिहाई के लिए आवश्यक शुल्क। पुलिस को ट्रैफिक स्टॉप के दौरान या पीछा के बाद सीधे वाहन इम्पाउंड करने में सक्षम होना चाहिए, जिन इम्पाउंड्स पर अधिक शुल्क या लंबी अनिवार्य होल्ड अवधि होती है। इम्पाउंड लॉट इंटरफ़ेस खिलाड़ी के इम्पाउंड किए गए वाहनों की सूची दिखाना चाहिए जिसमें वाहन मॉडल, प्लेट नंबर, इम्पाउंड तिथि, कारण, और रिहाई शुल्क जैसे विवरण शामिल हों। खिलाड़ी इम्पाउंड लॉट काउंटर पर शुल्क का भुगतान करते हैं, और उनका वाहन पास के एक निर्दिष्ट वापसी बिंदु पर स्पॉन होता है।

CREATE TABLE IF NOT EXISTS impounded_vehicles (
    id INT AUTO_INCREMENT PRIMARY KEY,
    plate VARCHAR(10) NOT NULL,
    citizenid VARCHAR(50) NOT NULL,
    vehicle_data LONGTEXT NOT NULL,
    impound_reason ENUM('tow', 'police', 'abandoned', 'parking') DEFAULT 'tow',
    impound_fee INT DEFAULT 250,
    impounded_by VARCHAR(50) DEFAULT NULL,
    impounded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    hold_until TIMESTAMP DEFAULT NULL,
    released_at TIMESTAMP DEFAULT NULL,
    INDEX idx_plate (plate),
    INDEX idx_citizen (citizenid),
    INDEX idx_released (released_at)
);

-- Server-side: Impound a vehicle
RegisterNetEvent('tow:server:impoundVehicle', function(vehicleNet, reason)
    local src = source
    local Player = QBCore.Functions.GetPlayer(src)
    if not Player then return end

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

    local plate = GetVehicleNumberPlateText(vehicle)
    local vehicleData = QBCore.Functions.GetVehicleProperties(vehicle)
    local fee = Config.ImpoundFees[reason] or 250

    MySQL.insert('INSERT INTO impounded_vehicles (plate, citizenid, vehicle_data, impound_reason, impound_fee, impounded_by) VALUES (?, ?, ?, ?, ?, ?)', {
        plate:trim(),
        GetVehicleOwner(plate),
        json.encode(vehicleData),
        reason,
        fee,
        Player.PlayerData.citizenid,
    })

    DeleteEntity(vehicle)
    local pay = math.random(Config.TowJob.payPerImpound - 100, Config.TowJob.payPerImpound + 100)
    Player.Functions.AddMoney('bank', pay, 'tow-impound')
    TriggerClientEvent('QBCore:Notify', src, 'Vehicle impounded. Earned $' .. pay, 'success')
end)

स्वचालित पार्किंग प्रवर्तन

एक स्वचालित प्रणाली जोड़ें जो प्रतिबंधित क्षेत्रों में पार्क किए गए वाहनों का पता लगाती है और एक विन्यास योग्य ग्रेस अवधि के बाद उन्हें टोइंग के लिए चिह्नित करती है। फायर हाइड्रेंट, बस स्टॉप, पुलिस स्टेशन और अस्पताल आपातकालीन प्रवेश के आसपास प्रतिबंधित पार्किंग क्षेत्र परिभाषित करें। जब कोई खिलाड़ी प्रतिबंधित क्षेत्र में पार्क करता है और दूर चला जाता है, तो एक टाइमर शुरू करें। यदि वाहन ग्रेस अवधि समाप्त होने के बाद भी बिना देखरेख के रहता है, तो टो अनुरोध उत्पन्न करें और उपलब्ध टो ड्राइवरों को सूचित करें। यह टो ट्रक ड्राइवरों के लिए जैविक कार्य बनाता है बिना खिलाड़ियों को सेवा के लिए मैन्युअल रूप से कॉल करने की आवश्यकता के। प्रणाली केवल खिलाड़ी-स्वामित्व वाले वाहनों को चिह्नित करनी चाहिए क्योंकि NPC वाहन गेम इंजन द्वारा प्रबंधित होते हैं और स्वाभाविक रूप से गायब हो जाते हैं। वाहन मालिक को एक सूचना शामिल करें कि उनकी कार टोइंग के लिए चिह्नित की गई है, जिससे उन्हें टो ट्रक आने से पहले लौटकर इसे स्थानांतरित करने का मौका मिलता है।

राजस्व और प्रगति

टो जॉब को एक प्रगति प्रणाली के साथ संरचित करें जो लगातार काम के लिए पुरस्कार देती है। नए टो ड्राइवर रैंक शून्य से शुरू होते हैं और बुनियादी फ्लैटबेड ट्रक तक पहुंच रखते हैं और प्रत्येक पूर्ण टो पर एक आधार दर कमाते हैं। जैसे-जैसे वे पूर्ण टो जमा करते हैं, वे रैंक अप करते हैं और भारी टो वाहनों को अनलॉक करते हैं जो ट्रक और बस जैसे बड़े वाहनों को संभाल सकते हैं, पुलिस जब्ती अनुबंधों तक पहुंच जो अधिक भुगतान करते हैं, और एक व्यक्तिगत टो ट्रक जिसे वे अनुकूलित कर सकते हैं। कुल पूर्ण टो, टो करते समय दूरी, और डिस्पैच कॉल पर औसत प्रतिक्रिया समय जैसी सांख्यिकी ट्रैक करें। ये सांख्यिकी एक जॉब डैशबोर्ड में प्रदर्शित करें जो एक NPC या फोन ऐप के माध्यम से सुलभ हो। एक प्रतिष्ठा प्रणाली लागू करने पर विचार करें जहां टो ड्राइवर जो लगातार जल्दी प्रतिक्रिया देते हैं और बिना वाहन को नुकसान पहुंचाए काम पूरा करते हैं, वे अपने वेतन पर बोनस गुणक कमाते हैं, जबकि जो कॉल्स को अनदेखा करते हैं या टो करते समय वाहन को नुकसान पहुंचाते हैं, वे वेतन में कटौती का सामना करते हैं। यह एक प्राकृतिक गुणवत्ता प्रोत्साहन बनाता है जो पूरे सर्वर समुदाय को लाभ पहुंचाता है यह सुनिश्चित करते हुए कि टो सेवाएं विश्वसनीय और पेशेवर हैं।

एज केस और नेटवर्किंग को संभालना

टो सिस्टम में कई जटिल किनारे के मामले होते हैं जिन्हें सावधानी से संभालना होता है। जब एक टो ड्राइवर वाहन को टो करते हुए डिस्कनेक्ट होता है, तो सर्वर को डिस्कनेक्शन का पता लगाना चाहिए और टो किए गए वाहन को सुरक्षित रूप से अलग करना और जमीन पर रखना चाहिए ताकि वह हवा में तैरता न रहे या नक्शे से नीचे न गिरे। यदि वाहन मालिक लॉग इन करता है जबकि उनकी कार टो ट्रक से जुड़ी हुई है, तो उन्हें अपनी वाहन सूची में टो किए जाने के रूप में चिह्नित वाहन दिखाई देना चाहिए जिसमें टो ड्राइवर की जानकारी हो। वाहन इकाई स्वामित्व को सावधानी से संभालें क्योंकि अटैचमेंट नेटिव केवल तब विश्वसनीय रूप से काम करता है जब अटैच करने वाला क्लाइंट दोनों इकाइयों का स्वामी होता है। उपयोग करें NetworkRequestControlOfEntity यह सुनिश्चित करने के लिए कि टो ड्राइवर का क्लाइंट दोनों वाहनों को नियंत्रित करता है इससे पहले कि संलग्नक का प्रयास किया जाए। मल्टीप्लेयर सिंक्रोनाइज़ेशन के लिए, संलग्नक स्थिति को सभी निकटवर्ती खिलाड़ियों को प्रसारित करें ताकि वे अपने स्क्रीन पर टो किए गए वाहन को सही स्थिति में देख सकें। स्टेट बैग इसके लिए अच्छी तरह काम करते हैं क्योंकि वे स्वचालित रूप से उस इकाई की सीमा में सभी क्लाइंट्स तक पुनरावृत्त होते हैं।

शुरू करने के लिए तैयार?

हमारी शॉप से स्क्रिप्ट लें, या सपोर्ट, अपडेट और आगे आने वाली चीज़ों की झलक के लिए Discord से जुड़ें।