العودة إلى المدونة
Guide7 دقيقة قراءة

نظام مناطق العصابات في FiveM: برمجة حروب الأراضي

بناء نظام مناطق العصابات العامل في FiveM. المناطق، الاستيلاء، المكافآت، روابط السيطرة على المخدرات وأفضل سكربتات العصابات للحرب العميقة في الدور.

Agency Scripts

المؤسس والمطور الرئيسي في Agency Scripts

تصميم نظام الأراضي

تعد أنظمة مناطق العصابات من أكثر الآليات جاذبية التي يمكنك إضافتها إلى خادم FiveM للعب الأدوار لأنها تمنح المنظمات الإجرامية سبباً ملموساً للتنافس والتعاون والاستثمار في نمو فصيلهم. في جوهرها، يقسم نظام المناطق الخريطة إلى مناطق يمكن للعصابات المطالبة بها والسيطرة عليها، مما يمنح العصابة المالكة فوائد محددة داخل تلك الحدود. القرارات التصميمية التي تتخذها هنا تشكل تجربة لعب الأدوار الإجرامية بأكملها على خادمك. تحتاج إلى التفكير في عدد المناطق التي ستنشئها، وحجم كل منطقة، والفوائد التي توفرها السيطرة على المنطقة، وعدد مرات إمكانية التنافس على المناطق، وماذا يحدث عندما تخسر العصابة كل مناطقها. عدد قليل جداً من المناطق يعني أن أكبر العصابات فقط يمكنها المشاركة، بينما الكثير من المناطق يوزع الصراع بشكل ضعيف ويجعل المناطق الفردية تبدو بلا معنى. النهج المتوازن هو إنشاء 15-25 منطقة في مناطق لها أهمية في لعب الأدوار الإجرامية، مثل مواقع بيع المخدرات، ومناطق المستودعات، ومناطق السكن منخفض الدخل.

هيكل بيانات الإقليم

تحتاج طبقة البيانات إلى تتبع ملكية المناطق، حالة الاستيلاء، والمزايا المرتبطة بكل إقليم. خزّن تعريفات الأقاليم في ملف تكوين وبيانات الملكية في قاعدة البيانات بحيث يمكن تعديل تخطيطات المناطق دون المساس بالبيانات الدائمة. يحتاج كل منطقة إلى معرف فريد، إحداثيات الحدود التي تحدد مساحتها، المالك الحالي، وطابع زمني لآخر مرة تم الاستيلاء عليها. استخدام الحدود القائمة على المضلع يمنحك تحكمًا دقيقًا في أشكال المناطق التي تتبع الشوارع والمعالم بشكل طبيعي، رغم أن المناطق البسيطة القائمة على نصف القطر أسهل في التنفيذ وتؤدي أداءً أفضل:

Config.Territories = {
    ['grove_street'] = {
        label = 'Grove Street',
        center = vector3(105.5, -1942.5, 20.8),
        radius = 150.0,  -- Simple radius approach
        blip = { sprite = 543, scale = 1.2 },
        perks = { 'drug_selling_boost', 'reduced_police_alert' },
        captureTime = 300,  -- Seconds to capture
        cooldown = 3600,    -- Seconds before re-capture
    },
    ['ballas_territory'] = {
        label = 'Forum Drive',
        center = vector3(78.0, -1812.0, 29.0),
        radius = 120.0,
        blip = { sprite = 543, scale = 1.0 },
        perks = { 'weapon_discount', 'safe_stash' },
        captureTime = 300,
        cooldown = 3600,
    },
}

-- Database table for ownership
--[[
CREATE TABLE IF NOT EXISTS gang_territories (
    zone_id VARCHAR(50) PRIMARY KEY,
    owner_gang VARCHAR(50) DEFAULT NULL,
    captured_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    capture_count INT DEFAULT 0,
    last_war_at TIMESTAMP DEFAULT NULL
);
]]

فكر في إضافة capture_count عمود يتتبع عدد مرات تغير ملكية منطقة، يمكنك استخدامه للتحليلات ولتحديد المناطق التي تشهد تنافساً شديداً، مما يشير إلى حاجتك لضبط مؤقت التهدئة أو صعوبة الاستيلاء على تلك المناطق المحددة.

آليات الالتقاط

آلية الالتقاط هي حلقة اللعب التي تدير نظام الأراضي بأكمله. عندما تدخل عصابة منافسة منطقة وتبدأ محاولة الالتقاط، يبدأ مؤقت يجب على المهاجمين البقاء على قيد الحياة حتى اكتماله بينما تتلقى العصابة المدافعة تنبيهات ويمكنها الرد. تتطلب أنظمة الالتقاط الأكثر جاذبية من العصابة المهاجمة الحفاظ على عدد أدنى من الأعضاء داخل المنطقة طوال مدة الالتقاط، مما يخلق نقاط مواجهة طبيعية. إذا انخفض عدد المهاجمين تحت الحد الأدنى، يتوقف تقدم الالتقاط أو يبدأ في التراجع. فيما يلي تنفيذ على جانب الخادم للمنطق الأساسي للالتقاط:

local activeCaptures = {}

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

    local gang = Player.PlayerData.gang.name
    if gang == 'none' then return end

    local zone = Config.Territories[zoneId]
    if not zone then return end

    -- Check cooldown
    local territory = MySQL.query.await(
        'SELECT * FROM gang_territories WHERE zone_id = ?', {zoneId}
    )
    if territory and territory[1] then
        local lastWar = territory[1].last_war_at
        if lastWar and (os.time() - lastWar) < zone.cooldown then
            TriggerClientEvent('QBCore:Notify', src, 'Territory on cooldown', 'error')
            return
        end
        if territory[1].owner_gang == gang then
            TriggerClientEvent('QBCore:Notify', src, 'You already own this', 'error')
            return
        end
    end

    -- Check minimum gang members in zone
    local membersInZone = GetGangMembersInZone(gang, zoneId)
    if #membersInZone < Config.MinCaptureMembers then
        TriggerClientEvent('QBCore:Notify', src,
            'Need ' .. Config.MinCaptureMembers .. ' members in zone', 'error')
        return
    end

    activeCaptures[zoneId] = {
        attackingGang = gang,
        startTime = os.time(),
        progress = 0,
    }

    -- Alert defending gang
    local defender = territory and territory[1] and territory[1].owner_gang
    if defender then
        AlertGangMembers(defender, 'Your territory is under attack: ' .. zone.label)
    end

    TriggerClientEvent('territory:client:captureStarted', -1, zoneId, gang)
end)

تشغيل خيط على جانب السيرفر يتكرر كل بضع ثوانٍ لتحديث تقدم الاستيلاء، مع التحقق من الحفاظ على الحد الأدنى لعدد المهاجمين وعدم حدوث انتهاكات فترة التهدئة. عند اكتمال الاستيلاء، تحديث قاعدة البيانات، إعلام جميع اللاعبين المعنيين، وتطبيق الملكية الجديدة عبر السيرفر. بث تغيير المنطقة لجميع العملاء المتصلين ليتمكنوا من تحديث علامات الخريطة في الوقت الحقيقي.

علامات الخريطة وردود الفعل البصرية

علامات الإقليم على الخريطة المصغرة وخريطة قائمة الإيقاف ضرورية لإظهار اللاعبين المناطق التي تسيطر عليها العصابات. يجب أن يعرض كل إقليم علامة ملونة تطابق لون العصابة المالكة، مع عرض الأقاليم غير المملوكة باللون الرمادي المحايد أو الأبيض. عند وجود استيلاء جارٍ، يجب أن تومض العلامة أو تتغير إلى لون متنازع عليه لجذب انتباه اللاعبين عبر الخادم. استخدم AddBlipForRadius لمناطق الأراضي لأنه ينشئ تراكب منطقة دائرية على الخريطة يوضح بوضوح حدود المنطقة:

function CreateTerritoryBlip(zoneId, data, ownerGang)
    local zone = Config.Territories[zoneId]
    if not zone then return end

    -- Remove existing blip if any
    if territoryBlips[zoneId] then
        RemoveBlip(territoryBlips[zoneId].radius)
        RemoveBlip(territoryBlips[zoneId].icon)
    end

    -- Radius blip for territory area
    local radiusBlip = AddBlipForRadius(
        zone.center.x, zone.center.y, zone.center.z, zone.radius
    )
    local gangColor = GetGangBlipColor(ownerGang)  -- Returns blip color ID
    SetBlipColour(radiusBlip, gangColor)
    SetBlipAlpha(radiusBlip, 80)

    -- Center icon blip
    local iconBlip = AddBlipForCoord(zone.center.x, zone.center.y, zone.center.z)
    SetBlipSprite(iconBlip, zone.blip.sprite)
    SetBlipScale(iconBlip, zone.blip.scale)
    SetBlipColour(iconBlip, gangColor)
    SetBlipAsShortRange(iconBlip, true)
    BeginTextCommandSetBlipName('STRING')
    AddTextComponentSubstringPlayerName(zone.label .. ' [' .. (ownerGang or 'Unclaimed') .. ']')
    EndTextCommandSetBlipName(iconBlip)

    territoryBlips[zoneId] = { radius = radiusBlip, icon = iconBlip }
end

بعيداً عن علامات الخريطة، فكر في إضافة مؤشرات بصرية داخل العالم مثل الدخان الملون، دعامات الغرافيتي، أو أعلام العصابات التي تظهر في نقاط رئيسية داخل الإقليم عند الاستيلاء عليه. هذه الإشارات البيئية تغمر اللاعبين في سرد حرب العصابات وتجعل حدود الإقليم محسوسة حتى عندما لا تكون الخريطة المصغرة مرئية. يمكنك استخدام الـ CreateObject native لاستدعاء الدعائم الخاصة بالعصابات في مواقع محددة مسبقًا داخل كل منطقة.

مزايا ومكافآت العصابات

مزايا الإقليم هي ما تحفز العصابات على القتال والدفاع عن أراضيها. بدون مكافآت ذات معنى، يصبح التحكم في الإقليم مجرد ترفيه يشارك فيه اللاعبون مرة واحدة ثم يتجاهلونه. أفضل المزايا توفر مزايا اقتصادية واستراتيجية تتراكم مع سيطرة العصابة على المزيد من الأراضي. قد تشمل المزايا الاقتصادية زيادة نسبة أرباح بيع المخدرات داخل المنطقة، الوصول إلى بائعي السوق السوداء الحصريين، تخفيض الأسعار في متاجر العصابة، أو توليد دخل سلبي يودع المال في الحساب البنكي المشترك للعصابة بانتظام. قد تشمل المزايا الاستراتيجية أوقات إعادة ظهور أسرع داخل الإقليم، تقليل تنبيه الشرطة للجرائم المرتكبة في المنطقة، الوصول إلى مواقع مخبأة لتخزين الأسلحة والمخدرات، أو القدرة على وضع أفخاخ ودفاعات خاصة بالعصابة. نفذ المزايا كفحوصات على جانب الخادم تنشط عندما يقوم لاعب ينتمي للعصابة المناسبة بفعل داخل إقليم تملكه عصابته. اجعل نظام المزايا معياريًا بحيث يمكنك بسهولة إضافة مزايا جديدة أو تعديل الموجودة بناءً على ملاحظات اللاعبين دون إعادة هيكلة قاعدة الشفرة بالكامل.

أحداث وجدولة حرب المناطق

تضيف أحداث حرب الأراضي المنظمة عنصرًا تنافسيًا مجدولًا إلى نظام الأراضي، مما يمنع الاشتباكات المستمرة منخفضة المستوى التي قد تصبح مرهقة للاعبين. بدلاً من السماح بالاستيلاء في أي وقت، يمكنك تقييد معارك الأراضي لفترات زمنية محددة مثل مساء الجمعة والسبت، مما يخلق أحداثًا متوقعة يخطط لها اللاعبون ويحضرون كامل تشكيلاتهم. بدلاً من ذلك، نفذ نظام إعلان الحرب حيث يجب على عصابة إعلان الحرب رسميًا ضد عصابة أخرى من خلال آلية داخل اللعبة، مما يطلق فترة تحضير مدتها 30 دقيقة قبل أن تصبح الأراضي قابلة للنزاع. هذا يمنح العصابة المدافعة وقتًا لتجميع أعضائها وتحضير الدفاعات، مما يؤدي إلى معارك أكبر وأكثر درامية. تتبع إحصائيات الحرب مثل القتلى، الوفيات، الأراضي المكتسبة والمفقودة، والأضرار التي تم إلحاقها، ثم أعلن النتائج على مستوى الخادم عند انتهاء فترة الحرب. تضيف لوحة المتصدرين أو نظام تاريخ الحرب الذي يمكن للاعبين مراجعته عنصر ترتيب تنافسي يبقي العصابات منخرطة بين فترات الحرب النشطة ويخلق قصصًا تصبح جزءًا من تاريخ الخادم.

إجراءات مكافحة الاستغلال

أنظمة الإقليم هي أهداف رئيسية للاستغلال لأنها تؤثر مباشرة على اقتصاد اللعبة وديناميكيات القوة. أكثر الاستغلالات شيوعًا هو الاستيلاء الزومبي، حيث يسجل عضو عصابة الدخول خلال ساعات انخفاض عدد اللاعبين ليأخذ الأقاليم بصمت دون معارضة. امنع ذلك بفرض حد أدنى لعدد اللاعبين على الخادم قبل بدء الاستيلاءات، وإرسال إشعارات ويب هوك على Discord عند بدء الاستيلاء حتى يتمكن المدافعون من الرد حتى لو لم يكونوا متصلين حاليًا. استغلال آخر يشمل التبديل السريع بين انتماءات العصابات للاستيلاء على الأقاليم لمجموعات متعددة. طبق فترة تبريد لتغيير العصابة لا تقل عن 24 ساعة حقيقية وازل أي أذونات متعلقة بالإقليم فور مغادرة العصابة. حدد معدل محاولات الاستيلاء لكل عصابة لمنع بدء الاستيلاءات بشكل متكرر كتكتيك إزعاج. من الناحية التقنية، تحقق من جميع تفاعلات الإقليم على جانب الخادم، لا تثق أبدًا بالعميل للإبلاغ عما إذا كان اللاعب داخل حدود المنطقة، واستخدم فحوصات موقع على جانب الخادم مع GetEntityCoords(GetPlayerPed(src)) للتحقق من مواقع اللاعبين أثناء نقاط الالتقاط. سجل كل محاولة التقاط، والنجاح، والفشل مع الطوابع الزمنية ومعرفات اللاعبين حتى تتمكن من التحقيق في الأنماط المشبوهة واتخاذ إجراءات ضد المستغلين بأدلة واضحة.

الدمج مع أنظمة أخرى

نظام الأراضي يصل إلى كامل إمكاناته عندما يرتبط بأنظمة اللعب الأخرى في سيرفرك. اربط الأراضي بنظام بيع المخدرات بحيث يزيد التحكم في منطقة مخدرات من أسعار البيع أو يقلل من خطر تدخل NPC. اربطه بنظام الإسكان بحيث تقدم الأراضي التي تملكها العصابات ضرائب عقارية مخفضة أو منازل آمنة حصرية. دمجه مع نظام الشرطة بحيث تؤثر الأراضي على أولوية الإرسال، حيث قد تولد الجرائم في الأراضي التي تسيطر عليها العصابات تنبيهات شرطة متأخرة أو مخفضة، محاكاة للتحدي الحقيقي في مراقبة أحياء تسيطر عليها العصابات. أدخل بيانات الأراضي في نظام الهاتف أو الإشعارات حتى يتمكن قادة العصابات من التحقق من حالة الأراضي، عرض تاريخ الاستيلاء، وتنسيق جهود الدفاع من أي مكان على الخريطة. إذا كان سيرفرك يحتوي على نظام تقدم أو سمعة، اربط السيطرة على الأراضي بمكاسب سمعة العصابة التي تفتح أنشطة ومعدات ذات مستوى أعلى. كلما زادت الأنظمة التي تشير إلى ملكية الأراضي، زادت تأثيرية وجاذبية الآلية، محولة إياها من لعبة صغيرة مستقلة إلى ركيزة مركزية في نظام RP الإجرامي لسيرفرك.

جاهز للبدء؟

احصل على السكربتات من متجرنا، أو انضم إلى Discord للدعم والتحديثات ونظرة على ما هو قادم.