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

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

إضافة حيوانات أليفة ورفاق إلى خادم FiveM الخاص بك. متابعة الذكاء الاصطناعي، التغذية، المتاجر، النماذج المخصصة وأفضل سكربتات الحيوانات الأليفة لإعدادات QBCore وESX.

Agency Scripts

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

الحيوانات الأليفة كرفاق حياة في اللعب التمثيلي

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

نماذج الحيوانات المتاحة والتكوين

يحتوي GTA V على عدة نماذج حيوانات تعمل جيدًا كرفقاء. الكلاب هي الأكثر تنوعًا مع نماذج مثل a_c_shepherd لـ German Shepherds، a_c_husky لـ Huskies، a_c_poodle لـ Poodles، a_c_rottweiler لـ Rottweilers، a_c_retriever لـ Retrievers، و a_c_chop لنموذج Chop الشهير. القطط تستخدم a_c_cat_01. للخيارات الغريبة، هناك أرانب مع a_c_rabbit_01 وحتى الطيور مع a_c_crow. يجب أن يكون لكل نوع حيوان أليف معلمات سلوك مختلفة مكونة في ملف مشترك. تتبع الكلاب عن كثب ويمكنها الركض بجانب المركبات بسرعات معتدلة. القطط أكثر استقلالية، تتجول أحياناً لمسافات قصيرة قبل العودة. يمكن للطيور أن تقف على كتف اللاعب باستخدام تثبيت الكيان. عرّف مسافة التتبع، مضاعف سرعة الحركة، حركات الخمول، حركات التفاعل، والقدرات الخاصة لكل نوع حيوان أليف لخلق شخصيات مميزة لكل نوع.

-- shared/config.lua
Config = {}

Config.PetTypes = {
    shepherd = {
        model       = 'a_c_shepherd',
        label       = 'German Shepherd',
        price       = 5000,
        followDist  = 2.5,
        runDist     = 8.0,
        maxSpeed    = 7.0,
        category    = 'dog',
        abilities   = {'guard', 'fetch', 'search'},
        idleAnims   = {'sit', 'lie_down', 'sniff'},
    },
    husky = {
        model       = 'a_c_husky',
        label       = 'Husky',
        price       = 6000,
        followDist  = 3.0,
        runDist     = 10.0,
        maxSpeed    = 8.0,
        category    = 'dog',
        abilities   = {'fetch', 'howl'},
        idleAnims   = {'sit', 'lie_down', 'play'},
    },
    cat = {
        model       = 'a_c_cat_01',
        label       = 'Cat',
        price       = 2000,
        followDist  = 4.0,
        runDist     = 6.0,
        maxSpeed    = 5.0,
        category    = 'cat',
        abilities   = {'purr', 'hunt_rodent'},
        idleAnims   = {'sit', 'groom', 'sleep'},
    },
    poodle = {
        model       = 'a_c_poodle',
        label       = 'Poodle',
        price       = 4000,
        followDist  = 2.0,
        runDist     = 6.0,
        maxSpeed    = 5.5,
        category    = 'dog',
        abilities   = {'fetch', 'trick'},
        idleAnims   = {'sit', 'beg', 'spin'},
    },
    rottweiler = {
        model       = 'a_c_rottweiler',
        label       = 'Rottweiler',
        price       = 7000,
        followDist  = 2.0,
        runDist     = 8.0,
        maxSpeed    = 7.5,
        category    = 'dog',
        abilities   = {'guard', 'attack', 'intimidate'},
        idleAnims   = {'sit', 'lie_down', 'bark'},
    },
}

سلوك الظهور والمتابعة

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

-- client/pet_behavior.lua
local activePet = nil
local petData   = nil

function SpawnPet(petType, name)
    if activePet then DespawnPet() end

    local config = Config.PetTypes[petType]
    if not config then return end

    local ped = PlayerPedId()
    local coords = GetOffsetFromEntityInWorldCoords(ped, 1.5, 1.5, 0.0)

    RequestModel(config.model)
    while not HasModelLoaded(config.model) do Wait(10) end

    activePet = CreatePed(28, config.model,
        coords.x, coords.y, coords.z, 0.0, true, false)

    SetEntityAsMissionEntity(activePet, true, true)
    SetBlockingOfNonTemporaryEvents(activePet, true)
    SetPedCanBeTargetted(activePet, false)
    SetPedCanRagdoll(activePet, false)

    -- Set relationship so pet doesn't attack owner
    local playerGroup = GetHashKey('PLAYER')
    local petGroup = GetHashKey('PET_COMPANION')
    AddRelationshipGroup('PET_COMPANION')
    SetPedRelationshipGroupHash(activePet, petGroup)
    SetRelationshipBetweenGroups(0, petGroup, playerGroup)
    SetRelationshipBetweenGroups(0, playerGroup, petGroup)

    petData = {type = petType, name = name, config = config}

    -- Start follow loop
    CreateThread(PetFollowLoop)
end

function PetFollowLoop()
    while activePet and DoesEntityExist(activePet) do
        local ped = PlayerPedId()
        local petCoords = GetEntityCoords(activePet)
        local ownerCoords = GetEntityCoords(ped)
        local dist = #(petCoords - ownerCoords)

        if dist > 50.0 then
            -- Teleport if too far
            SetEntityCoords(activePet,
                ownerCoords.x, ownerCoords.y, ownerCoords.z)
        elseif dist > petData.config.runDist then
            -- Run to owner
            TaskFollowToOffsetOfEntity(activePet, ped,
                0.0, -1.5, 0.0, petData.config.maxSpeed,
                -1, 1.0, true)
        elseif dist > petData.config.followDist then
            -- Walk to owner
            TaskFollowToOffsetOfEntity(activePet, ped,
                0.0, -1.5, 0.0, 2.0, -1, 1.0, true)
        else
            -- Idle nearby
            if not IsEntityPlayingAnim(activePet, 'creatures@dog@amb@', 'sit_enter', 3) then
                if math.random() > 0.95 then
                    PlayIdleAnimation()
                end
            end
        end

        Wait(500)
    end
end

نظام احتياجات الحيوانات الأليفة والتواصل

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

-- server/pet_needs.lua
local petStates = {}

function InitPetState(ownerId, petId)
    petStates[ownerId] = {
        petId     = petId,
        hunger    = 100,
        happiness = 80,
        health    = 100,
        bond      = 0,
        lastFed   = os.time(),
        lastPet   = os.time(),
    }
end

-- Decay loop runs every 60 seconds
CreateThread(function()
    while true do
        Wait(60000)
        local now = os.time()
        for ownerId, state in pairs(petStates) do
            -- Hunger decay: 1 point per 5 minutes
            local minutesSinceFed = (now - state.lastFed) / 60
            state.hunger = math.max(0,
                100 - math.floor(minutesSinceFed / 5))

            -- Happiness decay
            local minutesSincePet = (now - state.lastPet) / 60
            state.happiness = math.max(0,
                math.min(100, state.happiness -
                    math.floor(minutesSincePet / 10)))

            -- Health decays when starving
            if state.hunger < 20 then
                state.health = math.max(0,
                    state.health - 1)
            end

            -- Sync to client
            local player = GetPlayerFromIdentifier(ownerId)
            if player then
                TriggerClientEvent('pet:syncState', player, state)
            end
        end
    end
end)

RegisterNetEvent('pet:feed', function(foodItem)
    local src = source
    local id = GetPlayerIdentifier(src, 0)
    local state = petStates[id]
    if not state then return end

    local foodValues = {
        petfood        = {hunger = 30, happiness = 5},
        premium_food   = {hunger = 60, happiness = 10},
        pet_treat      = {hunger = 10, happiness = 15},
    }

    local food = foodValues[foodItem]
    if not food then return end

    -- Remove item from inventory
    local removed = exports['ox_inventory']:RemoveItem(src, foodItem, 1)
    if not removed then return end

    state.hunger = math.min(100, state.hunger + food.hunger)
    state.happiness = math.min(100, state.happiness + food.happiness)
    state.lastFed = os.time()
    state.bond = state.bond + 1

    TriggerClientEvent('pet:syncState', src, state)
    TriggerClientEvent('pet:feedAnimation', src)
end)

أوامر التفاعل والرسوم المتحركة

امنح اللاعبين مجموعة غنية من الأوامر للتفاعل مع حيواناتهم الأليفة. يجب أن يقدم نظام القائمة الدائرية أو الأوامر خيارات مثل الجلوس، البقاء، المتابعة، المجيء، الاستلقاء، المصافحة، الإحضار، والتحدث. كل أمر يُشغّل حركة مقابلة على شخصية الحيوان باستخدام قواميس الحركات المدمجة في GTA V. أمر الجلوس يستخدم الحركات من creatures@dog@amb@ مع مقاطع sit_enter و sit_loop. يستخدم الاستلقاء تحريكات محيطة مماثلة. لأمر الجلب، استدعِ دعامة كرة صغيرة، ارمها باستخدام مسار قوسي، وكلف الحيوان الأليف بالجري إلى موقع هبوط الكرة، التقاطها باستخدام إرفاق، وإعادتها للمالك. يطلق أمر التحدث صوت نباح باستخدام PlayPedAmbientSpeechNative. بالنسبة للملاطفة، قم بتشغيل حركة الركوع على شخصية اللاعب مع تشغيل حركة هز الذيل السعيد على الحيوان الأليف في نفس الوقت. هذه التفاعلات ليست تجميلية فقط؛ كل واحدة تزيد من إحصائيات السعادة والارتباط، مما يكافئ اللاعبين الذين يتفاعلون بنشاط مع رفيقهم بدلاً من معاملته كمتابع سلبي.

الاستمرارية وتكامل متجر الحيوانات الأليفة

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

-- SQL schema
CREATE TABLE IF NOT EXISTS pets (
    id          INT AUTO_INCREMENT PRIMARY KEY,
    owner_id    VARCHAR(64) NOT NULL,
    char_slot   INT DEFAULT 1,
    pet_type    VARCHAR(32) NOT NULL,
    pet_name    VARCHAR(64) NOT NULL,
    hunger      INT DEFAULT 100,
    happiness   INT DEFAULT 80,
    health      INT DEFAULT 100,
    bond        INT DEFAULT 0,
    tricks      JSON DEFAULT '[]',
    is_active   TINYINT DEFAULT 0,
    created_at  TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at  TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_owner (owner_id, char_slot)
);

-- server/persistence.lua
function SavePet(ownerId, charSlot, state)
    MySQL.update([[
        UPDATE pets SET
            hunger = ?, happiness = ?, health = ?,
            bond = ?, is_active = 1, updated_at = NOW()
        WHERE owner_id = ? AND char_slot = ?
    ]], {
        state.hunger, state.happiness, state.health,
        state.bond, ownerId, charSlot
    })
end

function LoadPet(ownerId, charSlot)
    return MySQL.single.await([[
        SELECT * FROM pets
        WHERE owner_id = ? AND char_slot = ?
        AND is_active = 1
    ]], {ownerId, charSlot})
end

تكامل شرطة الكلاب والأدوار الخاصة

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

جاهز للبدء؟

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