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.