Bloga Geri Dön
Guide9 dk. okuma

FiveM Evcil Hayvan ve Yoldaş Sistemi: Sadık Dostları Scriptleme

FiveM sunucunuza evcil hayvanlar ve yoldaşlar ekleyin. Takip yapay zekası, besleme, mağazalar, özel modeller ve QBCore ile ESX kurulumları için en iyi evcil hayvan scriptleri.

Agency Scripts

Agency Scripts Kurucusu ve Baş Geliştiricisi

Canlı Rol Yapma Yoldaşları Olarak Evcil Hayvanlar

Evcil hayvanlar, rol yapma sunucularına başka hiçbir sistemin kopyalayamayacağı benzersiz bir duygusal boyut kazandırır. Şehirde yanında köpeğiyle yürüyen bir oyuncu, her etkileşimi zenginleştiren görsel bir kişilik oluşturur. Evcil yoldaşlar, markete yürümek gibi sıradan aktiviteleri sürükleyici anlara dönüştürür. Diğer oyuncular Alman Çoban Köpeğinizi fark ettiğinde veya kedinizi sorduğunda doğal sohbet başlatıcıları yaratırlar. Sosyal boyutun ötesinde evcil hayvanlar, sahiplerini davetsiz misafirlere karşı uyaran bekçi köpekleri, aramalara yardımcı olan polis K-9 birimleri, hastane rolünde duygusal destek hayvanları veya av takibine yardımcı olan av yoldaşları gibi işlevsel roller de üstlenebilir. Bir evcil hayvan sistemi oluşturmak: ped oluşturma ve silme (spawn/despawn), yapay zeka takip davranışı, animasyon entegrasyonu, açlık ve mutluluk gibi ihtiyaç simülasyonları, oturumlar arası kalıcılık ve sahibinin yoldaşını doğal hareketler ve sesli komutlarla kontrol etmesini sağlayan etkileşim komutlarının yönetilmesini gerektirir.

Kullanılabilir Hayvan Modelleri ve Yapılandırma

GTA V, yoldaş olarak gayet iyi çalışan çeşitli hayvan ped modelleri içerir. Köpekler, şu modellerle en çok yönlü olanlarıdır: a_c_shepherd Alman Çoban Köpekleri için, a_c_husky Huskyler için, a_c_poodle Poodle'lar için, a_c_rottweiler Rottweiler'lar için, a_c_retriever Retriever'lar için ve a_c_chop ikonik Chop modeli için. Kediler şunu kullanır: a_c_cat_01. Egzotik seçenekler için şunlara sahip tavşanlar mevcuttur: a_c_rabbit_01 ve hatta şununla kuşları bile: a_c_crow. Her evcil hayvan türü, paylaşılan bir dosyada yapılandırılmış farklı davranış parametrelerine sahip olmalıdır. Köpekler yakından takip eder ve orta hızlarda araçların yanında koşabilir. Kediler daha bağımsızdır, geri dönmeden önce ara sıra kısa mesafelerde dolaşır. Kuşlar entity attachment kullanılarak oyuncunun omzuna tünenebilir. Her tür için farklı kişilikler oluşturmak amacıyla her evcil hayvan türünün takip mesafesini, hareket hızı çarpanını, idle animasyonlarını, etkileşim animasyonlarını ve özel yeteneklerini tanımlayın.

-- 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'},
    },
}

Oluşturma ve Takip Davranışı

Her evcil hayvan sisteminin temeli, hayvanın sahibini doğal bir şekilde takip etmesini sağlayan takip yapay zekasıdır. Bir oyuncu evcil hayvanını spawn ettiğinde, şu fonksiyonu kullanarak ped'i oyuncunun konumunda oluşturun: CreatePed uygun model ile. Aşağıdakini kullanarak ped'i kalıcı olmayan olarak ayarlayın: SetEntityAsMissionEntity ve relationship groups kullanarak sahibine karşı dost canlısı olacak şekilde yapılandırın. Takip davranışı, evcil hayvan ile sahibi arasındaki mesafeyi sürekli hesaplayan client tarafı bir döngü kullanır. Mesafe takip eşiğini aştığında, evcil hayvanı şu komutla sahibinin biraz arkasında ve yanındaki bir konuma koşacak şekilde görevlendirin: TaskFollowToOffsetOfEntity. Bu native yol bulma işlemini otomatik olarak yöneterek evcil hayvanın engellerin etrafından dolaşmasını, kaldırımlarda yürümesini ve trafikten kaçınmasını sağlar. Sahip hareket etmeyi bıraktığında ve evcil hayvan takip mesafesine ulaştığında, oturma veya uzanma gibi boşta durma animasyonu oynatın. Sahip bir araca binip uzaklaşırsa, uygun bir türdeyse evcil hayvanı aracın içine ışınlayın ya da haritada kaybolmasını önlemek için evcil hayvanı despawn edin ve sahip araçtan indiğinde yeniden spawn edin.

-- 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

Evcil Hayvan İhtiyaçları ve Bağ Kurma Sistemi

İhtiyaç sistemi, evcil hayvan sahipliğine sürekli sorumluluk ve derinlik kazandırır. Açlık, mutluluk ve sağlığı, gerçek zamanla azalan 0 ile 100 arasındaki değerler olarak takip edin. Açlık, evcil hayvan aktif olduğu sürece her 5 dakikalık gerçek zamanda 1 puan azalır. Mutluluk her 10 dakikada 1 puan olarak daha yavaş azalır, ancak sahibi sevme, yakalamaç oynama veya ödül maması verme yoluyla evcil hayvanla etkileşime girdiğinde önemli ölçüde artar. Açlık 20'nin altına düşmediği sürece sağlık 100'de kalır, bu noktadan sonra ise azalmaya başlar. Açlık sıfıra ulaştığında evcil hayvan daha yavaş hareketler ve üzgün animasyonlarla halsizleşir. Sağlık çok düştüğünde evcil hayvanın iyileşmesi için veteriner bakımına ihtiyacı olur. Oyuncular, envanterlerindeki yiyecek eşyalarını evcil hayvan entity'si üzerinde kullanarak onları besler. Farklı yiyecek türleri farklı miktarlarda açlığı giderir: Temel evcil hayvan maması 30 puan, kaliteli mama 60 puan ve ödül mamaları 10 puan kazandırır ancak mutluluğu 15 artırır. Bağ seviyesi, sahip ile evcil hayvan arasındaki kümülatif ilişkiyi takip eder, olumlu etkileşimlerle artar ve ilgisizlikle azalır. Daha yüksek bağ seviyeleri özel etkileşimlerin kilidini açar ve evcil hayvanın komutlara yanıt verme hızını artırır.

-- 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)

Etkileşim Komutları ve Animasyonlar

Oyunculara evcil hayvanlarıyla etkileşime geçmeleri için zengin bir komut seti sunun. Bir radyal menü veya komut sistemi sit, stay, follow, come, lie down, shake, fetch ve speak gibi seçenekler sunmalıdır. Her komut, GTA V içinde yerleşik bulunan yaratık animasyon sözlüklerini kullanarak evcil hayvan ped üzerinde ilgili animasyonu tetikler. sit komutu şuradaki animasyonları kullanır: creatures@dog@amb@ sit_enter ve sit_loop klipleriyle. Yatma hareketi benzer ortam animasyonları kullanır. Top getirme için küçük bir top prop'u oluşturun, bunu parabolik bir yörüngeyle fırlatın ve evcil hayvanı topun düşüş konumuna koşması, bir attachment kullanarak onu alması ve sahibine geri getirmesi için görevlendirin. speak komutu aşağıdakini kullanarak bir havlama sesi tetikler: PlayPedAmbientSpeechNative. Sevme eylemi için, oyuncu ped'inde diz çökme animasyonu oynatırken aynı anda evcil hayvanda kuyruk sallama animasyonu oynatın. Bu etkileşimler yalnızca kozmetik değildir; her biri mutluluk ve bağ istatistiklerini artırarak, yol arkadaşına pasif bir takipçi gibi davranmak yerine onunla aktif olarak ilgilenen oyuncuları ödüllendirir.

Kalıcılık ve Pet Shop Entegrasyonu

Oyuncuların her yeniden başlatmada yoldaşlarını kaybetmemesi için evcil hayvanların sunucu oturumları boyunca kalıcı olması gerekir. Sahip kimliği (identifier), evcil hayvan türü, özel ad, mevcut ihtiyaç değerleri, bağ seviyesi ve kilidi açılmış numaralar veya yetenekler dahil olmak üzere evcil hayvan verilerini veritabanında saklayın. Sahip giriş yaptığında evcil hayvan verilerini sorgulayın ve bir komutla ya da son çıkışında aktifse otomatik olarak spawn etme seçeneği sunun. Evcil hayvan edinimini haritada mantıklı bir konumda bulunan oyun içi bir evcil hayvan dükkanı aracılığıyla entegre edin. Evcil hayvan dükkanı NUI ekranı, mevcut evcil hayvan türlerini bir önizleme alanında işlenen modelleri, fiyatları ve açıklamalarıyla birlikte görüntüler. Satın alma işleminden sonra oyuncu yeni evcil hayvanına bir isim verir ve hayvan yanında belirir. Daha düşük fiyatlı ancak rastgele evcil hayvan türleri sunan bir evcil hayvan sahiplendirme merkezi ekleyerek hayırsever bir rol yapma boyutu kazandırmayı da düşünebilirsiniz. Sunucu ekonomileri açısından evcil hayvanlar: sağlık yenilemesi için veteriner ziyaretleri, görünüm bonusları için bakım ve yeni komut animasyonlarının kilidini açan eğitim seansları gibi dönemsel harcamalar da gerektirebilir; bu da genel ekonomik sisteminizle entegre olan gerçekçi bir evcil hayvan sahipliği maliyeti yaratır.

-- 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

Polis K-9 Entegrasyonu ve Özel Roller

Kolluk kuvveti rolü için evcil hayvan sistemini tam bir K-9 birimi entegrasyonuna genişletin. Polis köpekleri sivil evcil hayvanlarda bulunmayan özel yetenekler kazanır. search komutu, K-9'un yakındaki araçları veya binaları koklamasını sağlar ve kaynağın yanında havlayıp oturarak yapılandırılabilir kaçak eşyalar için uyarı vermesini sağlar. Bunu, search komutu verildiğinde yakındaki oyuncuların envanterlerini veya araç bagajlarını işaretli eşyalar için kontrol ederek uygulayın. track komutu K-9'un bir koku izini takip etmesini sağlar; bunu kaçan bir şüphelinin konumlarından bir ekmek kırıntısı izi oluşturup köpeği bunları takip etmekle görevlendirerek uygulayabilirsiniz. apprehend komutu K-9'un bir hedefe doğru depar atmasını ve bir saldırı animasyonu oynatmasını sağlayarak memurlara şüphelileri etkisiz hale getirmek için ölümcül olmayan bir seçenek sunar. Bu yetenekleri polis mesleğine ve K-9 eğitmeni sertifikasına sahip oyuncularla sınırlandırın. K-9, sivil evcil hayvanlardan görsel olarak ayırt edilmek için ped bileşen varyasyonları veya prop eklentileri kullanılarak bir polis yeleği giymelidir. Bu uzmanlaşma, polis departmanı hiyerarşisi içinde benzersiz ve oldukça rağbet gören bir pozisyon 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.