Zurück zum Blog
Guide9 Min. Lesezeit

FiveM-Haustier- und Begleitersystem: Treue Gefährten skripten

Füge deinem FiveM-Server Haustiere und Begleiter hinzu. Folge-KI, Fütterung, Shops, eigene Modelle und die besten Haustier-Skripte für QBCore und ESX.

Agency Scripts

Gründer und leitender Entwickler bei Agency Scripts

Haustiere als lebendige Rollenspielbegleiter

Haustiere bringen eine einzigartige emotionale Ebene ins Rollenspiel auf deinem Server, die kein anderes System bieten kann. Wenn ein Spieler mit seinem Hund an seiner Seite durch die Stadt läuft, verleiht das seinem Charakter eine sichtbare Persönlichkeit, die jede Begegnung bereichert. Haustierbegleiter machen alltägliche Aktivitäten wie den Weg zum Laden zu immersiven Erlebnissen. Sie sorgen für natürliche Gesprächseinstiege, wenn andere Spieler deinen Deutschen Schäferhund bemerken oder nach deiner Katze fragen. Neben ihrer sozialen Rolle können Haustiere auch praktische Aufgaben übernehmen: als Wachhunde, die ihre Besitzer vor Eindringlingen warnen, als Polizei-K9-Einheiten, die bei Durchsuchungen helfen, als emotionale Begleittiere im Krankenhaus-Rollenspiel oder als Jagdbegleiter, die beim Aufspüren von Beute helfen. Für ein Haustiersystem musst du das Spawnen und Despawnen von Peds, das KI-Folgeverhalten, die Einbindung von Animationen, die Simulation von Bedürfnissen wie Hunger und Zufriedenheit, die Persistenz über mehrere Sitzungen hinweg sowie Interaktionsbefehle berücksichtigen, mit denen der Besitzer seinen Begleiter durch natürliche Gesten und Sprachbefehle steuert.

Verfügbare Tiermodelle und Konfiguration

GTA V enthält mehrere Ped-Modelle von Tieren, die sich gut als Begleiter eignen. Hunde sind am vielseitigsten, darunter Modelle wie a_c_shepherd für Deutsche Schäferhunde, a_c_husky für Huskys, a_c_poodle für Pudel, a_c_rottweiler für Rottweiler, a_c_retriever für Retriever und a_c_chop für das bekannte Chop-Modell. Bei Katzen kommen a_c_cat_01. Bei exotischeren Optionen gibt es Kaninchen mit a_c_rabbit_01 und sogar Vögel mit a_c_crow. Für jeden Haustiertyp sollten in einer gemeinsamen Datei unterschiedliche Verhaltensparameter konfiguriert werden. Hunde bleiben dicht bei dir und können bei moderater Geschwindigkeit neben Fahrzeugen herlaufen. Katzen sind unabhängiger und streifen gelegentlich ein kurzes Stück umher, bevor sie zurückkehren. Vögel können mithilfe von Entity-Attachment auf der Schulter des Spielers sitzen. Lege für jeden Haustiertyp die Folgedistanz, den Multiplikator für die Bewegungsgeschwindigkeit, die Idle-Animationen, die Interaktionsanimationen und besondere Fähigkeiten fest, damit jede Tierart eine eigene Persönlichkeit erhält.

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

Spawn- und Folgeverhalten

Das Herzstück jedes Haustiersystems ist die Follow-KI, durch die das Tier seinem Besitzer auf natürliche Weise folgt. Wenn ein Spieler sein Haustier spawnt, erstellst du den Ped an dessen Position mit CreatePed und dem passenden Modell. Setze den Ped mit SetEntityAsMissionEntity auf nicht persistent und stelle mithilfe von Relationship Groups sicher, dass er seinem Besitzer gegenüber freundlich ist. Das Folgeverhalten wird über eine clientseitige Schleife gesteuert, die ständig die Entfernung zwischen Haustier und Besitzer berechnet. Überschreitet die Entfernung den festgelegten Schwellenwert, weist du das Haustier mit TaskFollowToOffsetOfEntityan, zu einer Position leicht hinter und seitlich vom Besitzer zu laufen. Diese Native übernimmt die Wegfindung automatisch. Dadurch kann das Haustier Hindernissen ausweichen, auf Gehwegen laufen und dem Verkehr ausweichen. Wenn der Besitzer stehen bleibt und das Haustier seine Folgedistanz erreicht, spielst du eine Idle-Animation ab, zum Beispiel Sitzen oder Liegen. Steigt der Besitzer in ein Fahrzeug und fährt los, teleportierst du das Haustier in das Fahrzeug, sofern es dafür geeignet ist. Andernfalls despawnst du es und spawnst es erneut, wenn der Besitzer das Fahrzeug verlässt, damit das Haustier nicht irgendwo auf der Karte zurückbleibt.

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

Bedürfnisse und Bindung zum Haustier

Ein Bedürfnissystem sorgt dafür, dass die Haltung eines Haustiers langfristig Verantwortung und Tiefe mit sich bringt. Verfolge Hunger, Zufriedenheit und Gesundheit als Werte zwischen 0 und 100, die im Laufe der Echtzeit abnehmen. Der Hunger sinkt um 1 Punkt pro 5 Minuten Echtzeit, während das Haustier gespawnt ist. Die Zufriedenheit sinkt langsamer, um 1 Punkt pro 10 Minuten, steigt aber deutlich, wenn der Besitzer mit dem Haustier interagiert, es streichelt, Apportieren spielt oder ihm Leckerlis gibt. Die Gesundheit bleibt bei 100, solange der Hunger nicht unter 20 sinkt. Ab dann nimmt sie ab. Bei Hunger 0 wird das Haustier träge, bewegt sich langsamer und zeigt traurige Animationen. Sinkt die Gesundheit zu weit, braucht das Haustier tierärztliche Behandlung, um sich zu erholen. Spieler füttern ihre Haustiere, indem sie Futter aus ihrem Inventar auf das Haustier-Entity anwenden. Verschiedene Futtersorten stellen unterschiedlich viele Hungerpunkte wieder her: Einfaches Haustierfutter stellt 30 Punkte wieder her, Premiumfutter 60 und Leckerlis 10, erhöhen die Zufriedenheit aber um 15. Die Bindungsstufe erfasst die gesamte Beziehung zwischen Besitzer und Haustier. Sie steigt durch positive Interaktionen und sinkt, wenn das Haustier vernachlässigt wird. Höhere Bindungsstufen schalten besondere Interaktionen frei und sorgen dafür, dass das Haustier besser auf Befehle reagiert.

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

Interaktionsbefehle und Animationen

Gib Spielern eine vielfältige Auswahl an Befehlen, um mit ihrem Haustier zu interagieren. Ein Radialmenü oder Befehlssystem sollte Optionen wie Sitz, Bleib, Folgen, Komm, Hinlegen, Pfote geben, Apportieren und Laut geben bieten. Jeder Befehl löst eine entsprechende Animation auf dem Pet-Ped aus, wobei die in GTA V integrierten Animations-Dictionaries für Tiere verwendet werden. Für den Sitz-Befehl verwendest du Animationen aus creatures@dog@amb@ mit den Clips sit_enter und sit_loop. Für das Hinlegen verwendest du ähnliche Umgebungsanimationen. Für Apportieren spawnst du einen kleinen Ball-Prop, wirfst ihn in einer parabolischen Flugbahn und weist das Haustier an, zur Landeposition des Balls zu laufen, ihn mithilfe eines Attachments aufzunehmen und zum Besitzer zurückzubringen. Der Befehl Laut geben löst mit PlayPedAmbientSpeechNativeeinen Bellton aus. Zum Streicheln spielst du auf dem Spieler-Ped eine kniende Animation ab und gleichzeitig auf dem Haustier eine fröhliche Animation mit wedelndem Schwanz. Diese Interaktionen sind nicht nur kosmetisch: Jede erhöht die Werte für Zufriedenheit und Bindung. So werden Spieler belohnt, die sich aktiv mit ihrem Begleiter beschäftigen, statt ihn nur als passiven Folger zu behandeln.

Persistenz und Integration in den Tierladen

Haustiere müssen über mehrere Serversitzungen hinweg persistent bleiben, damit Spieler ihre Begleiter nicht bei jedem Neustart verlieren. Speichere die Haustierdaten in der Datenbank, darunter die Besitzer-ID, den Haustiertyp, den benutzerdefinierten Namen, die aktuellen Bedürfniswerte, die Bindungsstufe und alle freigeschalteten Tricks oder Fähigkeiten. Wenn sich der Besitzer anmeldet, rufst du seine Haustierdaten ab und bietest ihm an, das Haustier über einen Befehl zu spawnen, oder spawnst es automatisch, falls es beim letzten Disconnect aktiv war. Binde den Erwerb von Haustieren über einen Tierladen im Spiel an einer passenden Position auf der Karte ein. Das NUI des Tierladens zeigt verfügbare Haustiertypen mit ihren Modellen in einer Vorschau, Preisen und Beschreibungen. Nach dem Kauf gibt der Spieler seinem neuen Haustier einen Namen und es spawnt neben ihm. Als Alternative kannst du ein Tierheim mit niedrigeren Preisen und zufälligen Haustiertypen hinzufügen, das für einen karitativen Roleplay-Aspekt sorgt. Für die Serverwirtschaft können Haustiere außerdem regelmäßige Ausgaben verursachen, etwa Tierarztbesuche zur Wiederherstellung der Gesundheit, Fellpflege für optische Boni und Trainingseinheiten, die neue Befehlsanimationen freischalten. So entstehen realistische Haltungskosten, die sich in dein umfassenderes Wirtschaftssystem integrieren.

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

Integration von Polizei-K-9 und Spezialrollen

Für das Roleplay der Strafverfolgungsbehörden kannst du das Haustiersystem zu einer umfassenden K-9-Einheit erweitern. Polizeihunde erhalten besondere Fähigkeiten, die zivilen Haustieren nicht zur Verfügung stehen. Beim Suchbefehl schnüffelt der K-9 an Fahrzeugen oder Gebäuden in der Nähe und meldet konfigurierbare Schmuggelware, indem er bellt und sich neben die Quelle setzt. Implementiere das, indem du beim Ausführen des Suchbefehls die Inventare nahegelegener Spieler oder Fahrzeugkofferräume auf markierte Gegenstände prüfst. Beim Spurverfolgungsbefehl folgt der K-9 einer Geruchsspur. Dafür kannst du aus den Positionen eines flüchtenden Verdächtigen eine Spur aus Wegpunkten erstellen und den Hund anweisen, ihr zu folgen. Beim Festnahmebefehl sprintet der K-9 auf ein Ziel zu und spielt eine Angriffsanimation ab. So erhalten Beamte eine nicht tödliche Möglichkeit, Verdächtige zu überwältigen. Beschränke diese Fähigkeiten auf Spieler mit dem Polizeijob und einer K-9-Hundeführer-Zertifizierung. Der K-9 sollte mithilfe von Ped-Komponentenvariationen oder Prop-Attachments eine Polizeiweste tragen, damit er optisch von zivilen Haustieren zu unterscheiden ist. Diese Spezialisierung schafft eine einzigartige und äußerst begehrte Position innerhalb der Hierarchie der Polizeibehörde.

Bereit loszulegen?

Hol dir die Scripts in unserem Shop, oder komm auf den Discord für Support, Updates und einen Blick auf das, was kommt.