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

ox_target addSpherezone उदाहरण - QBCore और ESX Lua कोड

ox_target addSpherezone उदाहरण: कॉपी-पेस्ट Lua कोड, उपयोग के लिए तैयार। इसमें addBoxZone, addLocalEntity और qb-target addGlobalPlayer भी शामिल हैं। QBCore और ESX।

Agency Scripts

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

Target System क्या है और इसे क्यों उपयोग करें?

एक लक्ष्य प्रणाली, जिसे कभी-कभी eye-target या interaction system कहा जाता है, पारंपरिक तरीके को बदलती है जिसमें कुछ के पास जाकर कुंजी दबानी होती है। इसके बजाय, E आशा है कि आप पर्याप्त करीब हैं, खिलाड़ी एक कुंजी (आमतौर पर बायां अल्ट) दबाकर लक्ष्यीकरण मोड में प्रवेश करते हैं, जो स्क्रीन के केंद्र में एक छोटा क्रॉसहेयर दिखाता है। जब क्रॉसहेयर किसी लक्षित योग्य इकाई, वस्तु, या क्षेत्र पर होवर करता है, तो उपलब्ध क्रियाओं का मेनू प्रकट होता है। यह तरीका काफी अधिक सहज है क्योंकि यह खिलाड़ियों को उनके इंटरैक्ट करने वाले वस्तुओं पर सटीक नियंत्रण देता है। कई NPCs, वाहनों, और वस्तुओं के साथ भीड़भाड़ वाले दृश्य में, एक लक्ष्य प्रणाली आपको ठीक वही चुनने देती है जो आप चाहते हैं बिना ओवरलैपिंग इंटरैक्शन प्रॉम्प्ट्स के साथ संघर्ष किए। दो सबसे लोकप्रिय कार्यान्वयन हैं ox_target (Overextended टीम से) और qb-target (built for QBCore). यह गाइड दोनों को कवर करता है, ox_target पर जोर के साथ क्योंकि यह फ्रेमवर्क-एग्नोस्टिक है और अधिक सक्रिय रूप से विकसित किया जा रहा है।

ox_target बनाम qb-target: किसे चुनें

दोनों सिस्टम एक ही लक्ष्य प्राप्त करते हैं लेकिन API डिज़ाइन और प्रदर्शन में भिन्न होते हैं। ox_target standalone है, किसी भी फ्रेमवर्क के साथ काम करता है, entity detection के लिए raycasting का उपयोग करता है, और बेहतर TypeScript समर्थन के साथ एक साफ़ API है। qb-target QBCore के साथ कड़ाई से एकीकृत है, समान raycast दृष्टिकोण का उपयोग करता है, और अधिक समय से मौजूद है इसलिए अधिक मौजूदा स्क्रिप्ट इसे डिफ़ॉल्ट रूप से समर्थन करती हैं। यदि आप नया सर्वर शुरू कर रहे हैं या ESX/standalone उपयोग कर रहे हैं, तो ox_target का उपयोग करें। यदि आप QBCore पर हैं और आपके अधिकांश खरीदे गए स्क्रिप्ट qb-target एक्सपोर्ट्स का उपयोग करते हैं, तो qb-target के साथ बने रहना संगतता की समस्याओं से बचाता है। अच्छी बात यह है कि ox_target में qb-target संगतता परत शामिल है, इसलिए स्क्रिप्ट जो कॉल करती हैं exports['qb-target'] ox_target इंस्टॉल होने पर काम करेगा। हालांकि, इसका उल्टा सत्य नहीं है, इसलिए ox_target के लिए लिखे गए स्क्रिप्ट बिना संशोधन के qb-target के साथ काम नहीं करेंगे।

विशिष्ट संस्थाओं पर लक्ष्य जोड़ना

Entity targets attach interaction options to a specific spawned entity like a ped, vehicle, or object. This is useful when you create an NPC for a job and want players to interact specifically with that NPC rather than any ped model in the world. The target follows the entity, so if the NPC walks around, the interaction point moves with them. You provide the entity handle, the options array, and an optional distance that controls how far away the crosshair can detect the entity. Always clean up entity targets when the entity is deleted or the resource stops to prevent orphaned targets from lingering in memory.

-- client.lua: Entity targeting with ox_target

-- Create a shop NPC and add target
local model = joaat('a_m_m_business_01')
lib.requestModel(model)

local ped = CreatePed(0, model, 25.7, -1347.3, 29.5, 270.0, false, false)
FreezeEntityPosition(ped, true)
SetEntityInvincible(ped, true)
SetBlockingOfNonTemporaryEvents(ped, true)

-- Add target to this specific ped
exports.ox_target:addLocalEntity(ped, {
    {
        name = 'open_shop',
        icon = 'fas fa-store',
        label = 'Open General Store',
        distance = 2.5,
        onSelect = function(data)
            -- data.entity contains the entity handle
            TriggerEvent('shop:open', 'general')
        end,
    },
    {
        name = 'talk_to_clerk',
        icon = 'fas fa-comment',
        label = 'Talk to Clerk',
        distance = 2.0,
        canInteract = function(entity, distance, coords, name)
            -- Only show if player has completed a quest
            return PlayerData.questComplete == true
        end,
        onSelect = function()
            TriggerEvent('dialogue:start', 'clerk_01')
        end,
    },
})

-- Clean up on resource stop
AddEventHandler('onResourceStop', function(resource)
    if resource == GetCurrentResourceName() then
        exports.ox_target:removeLocalEntity(ped)
        DeleteEntity(ped)
    end
end)

मॉडल-आधारित लक्ष्य: सभी उदाहरणों को लक्षित करना

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

-- client.lua: Model-based targeting

-- ox_target: Target all ATM models
exports.ox_target:addModel({'prop_atm_01', 'prop_atm_02', 'prop_atm_03', 'prop_fleeca_atm'}, {
    {
        name = 'use_atm',
        icon = 'fas fa-credit-card',
        label = 'Use ATM',
        distance = 1.5,
        onSelect = function(data)
            TriggerEvent('banking:openATM')
        end,
    },
})

-- Target all vending machines
exports.ox_target:addModel({
    'prop_vend_coffe_01',
    'prop_vend_soda_01',
    'prop_vend_soda_02',
    'prop_vend_water_01',
}, {
    {
        name = 'buy_drink',
        icon = 'fas fa-mug-hot',
        label = 'Buy Drink ($5)',
        distance = 1.5,
        onSelect = function(data)
            local model = GetEntityModel(data.entity)
            TriggerServerEvent('vending:buy', model)
        end,
    },
})

-- qb-target equivalent for comparison
exports['qb-target']:AddTargetModel({'prop_atm_01', 'prop_atm_02'}, {
    options = {
        {
            type = 'client',
            event = 'banking:openATM',
            icon = 'fas fa-credit-card',
            label = 'Use ATM',
        },
    },
    distance = 1.5,
})

ज़ोन-आधारित टारगेट्स: अदृश्य इंटरैक्शन क्षेत्र

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

-- client.lua: Zone-based targeting

-- ox_target: Box zone for a reception desk
exports.ox_target:addBoxZone({
    coords = vec3(441.8, -981.0, 30.7),
    size = vec3(2.0, 1.0, 1.5),
    rotation = 0,
    debug = true,  -- Shows the box in-game, set false for production
    options = {
        {
            name = 'check_in',
            icon = 'fas fa-clipboard-check',
            label = 'Check In at Reception',
            onSelect = function()
                TriggerEvent('police:checkIn')
            end,
            canInteract = function()
                return PlayerData.job == 'police'
            end,
        },
    },
})

-- Sphere zone for a ground stash
local stashZone = exports.ox_target:addSphereZone({
    coords = vec3(128.4, -1280.5, 29.0),
    radius = 0.5,
    debug = false,
    options = {
        {
            name = 'open_stash',
            icon = 'fas fa-box-open',
            label = 'Open Stash',
            distance = 1.5,
            onSelect = function()
                TriggerServerEvent('stash:open', 'ground_stash_01')
            end,
        },
    },
})

-- Remove zone later if needed
exports.ox_target:removeZone(stashZone)

canInteract के साथ सशर्त दृश्यता

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

-- client.lua: Advanced canInteract examples

-- Vehicle interaction with multiple conditional options
exports.ox_target:addGlobalVehicle({
    {
        name = 'repair_vehicle',
        icon = 'fas fa-wrench',
        label = 'Repair Vehicle',
        distance = 3.0,
        bones = {'engine'},  -- Only when targeting the engine area
        canInteract = function(entity)
            local health = GetVehicleEngineHealth(entity)
            return health < 900.0  -- Only show if damaged
        end,
        onSelect = function(data)
            TriggerEvent('mechanic:repair', data.entity)
        end,
    },
    {
        name = 'lockpick_vehicle',
        icon = 'fas fa-key',
        label = 'Lockpick Door',
        distance = 2.0,
        bones = {'door_dside_f', 'door_pside_f'},
        canInteract = function(entity)
            local locked = GetVehicleDoorLockStatus(entity)
            local hasItem = exports.ox_inventory:Search('count', 'lockpick') > 0
            return locked == 2 and hasItem
        end,
        onSelect = function(data)
            TriggerEvent('lockpick:start', data.entity)
        end,
    },
    {
        name = 'open_trunk',
        icon = 'fas fa-box',
        label = 'Open Trunk',
        distance = 2.5,
        bones = {'boot'},
        canInteract = function(entity)
            return not IsVehicleDoorFullyOpen(entity, 5)
        end,
        onSelect = function(data)
            SetVehicleDoorOpen(data.entity, 5, false, false)
            TriggerEvent('inventory:openTrunk', data.entity)
        end,
    },
})

वैश्विक लक्ष्य: खिलाड़ी और वाहन इंटरैक्शन

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

-- client.lua: Global player and vehicle targets

-- Target any player for EMS interactions
exports.ox_target:addGlobalPlayer({
    {
        name = 'revive_player',
        icon = 'fas fa-heartbeat',
        label = 'Revive Player',
        distance = 2.0,
        canInteract = function(entity)
            -- Only show if player is EMS and target is downed
            local isEms = PlayerData.job == 'ambulance'
            local targetState = Entity(entity).state.isDead
            return isEms and targetState == true
        end,
        onSelect = function(data)
            local targetServerId = GetPlayerServerId(NetworkGetPlayerIndexFromPed(data.entity))
            TriggerServerEvent('ems:revive', targetServerId)
        end,
    },
    {
        name = 'give_item',
        icon = 'fas fa-hand-holding',
        label = 'Give Item',
        distance = 2.0,
        onSelect = function(data)
            local targetServerId = GetPlayerServerId(NetworkGetPlayerIndexFromPed(data.entity))
            TriggerEvent('inventory:giveItem', targetServerId)
        end,
    },
})

प्रदर्शन सुझाव और सामान्य गलतियाँ

लक्षित सिस्टम अच्छी तरह से अनुकूलित हैं लेकिन गलत उपयोग पर प्रदर्शन प्रभावित कर सकते हैं। सबसे आम गलती उत्पादन में डिबग मोड सक्षम करके बहुत सारे ज़ोन लक्ष्यों को रजिस्टर करना है। डिबग रेंडरिंग हर ज़ोन के लिए वायरफ्रेम आकृतियां बनाता है, जो दर्जनों होने पर महंगा होता है। हमेशा सेट करें debug = false तैनाती से पहले। एक और गलती महंगी लॉजिक को अंदर डालना है canInteract functions। चूंकि यह हर फ्रेम पर होवर करते समय चलता है, यहां तक कि एकल exports.ox_inventory:Search यदि आपके पास दस विकल्प हैं जो सभी एक साथ इन्वेंटरी जांच चला रहे हैं तो कॉल बढ़ सकता है। इन मानों को कैश करें और जब इन्वेंटरी बदलती है तब उन्हें अपडेट करें। अंत में, जब आपका संसाधन बंद हो तो हमेशा लक्ष्यों को साफ करें। उपयोग करें onResourceStop सभी ज़ोन, मॉडल, और एंटिटी लक्ष्यों को हटाने के लिए इवेंट हैंडलर। लीक हुए लक्ष्य मेमोरी में बने रहते हैं और यदि संसाधन पुनः आरंभ किया जाता है तो त्रुटियां या डुप्लिकेट विकल्प पैदा कर सकते हैं। ox_target स्थानीय एंटिटीज़ के लिए कुछ सफाई स्वचालित रूप से करता है, लेकिन स्पष्ट सफाई हमेशा सबसे सुरक्षित तरीका है।

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

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