Animais de estimação como companheiros vivos de dramatização
Os animais de estimação trazem uma dimensão emocional única aos servidores de RPG que nenhum outro sistema pode replicar. Um jogador caminhando pela cidade com seu cachorro trotando ao lado cria uma personalidade visual que enriquece cada interação. Os companheiros de estimação transformam atividades mundanas, como caminhar até a loja, em momentos envolventes. Eles criam conversas orgânicas quando outros jogadores notam seu pastor alemão ou perguntam sobre seu gato. Além do elemento social, os animais de estimação podem desempenhar funções funcionais como cães de guarda que alertam os proprietários sobre intrusos, unidades policiais K-9 que auxiliam nas buscas, animais de apoio emocional em dramatizações hospitalares ou companheiros de caça que ajudam a rastrear presas. Construir um sistema de animal de estimação requer lidar com a desova e desova de ped, comportamento de acompanhamento de IA, integração de animação, simulação de necessidades como fome e felicidade, persistência entre sessões e comandos de interação que permitem ao proprietário controlar seu companheiro por meio de gestos naturais e comandos de voz.
Modelos e configurações animais disponíveis
GTA V inclui vários modelos de animais que funcionam bem como companheiros. Os cães são os mais versáteis com modelos como a_c_shepherd para pastores alemães, a_c_husky para Huskies, a_c_poodle para Poodles, a_c_rottweiler para Rottweilers, a_c_retriever para Retrievers e a_c_chop para o icônico modelo Chop. Gatos usam a_c_cat_01. Para opções exóticas, existem coelhos com a_c_rabbit_01 e até pássaros com a_c_crow. Cada tipo de animal de estimação deve ter parâmetros de comportamento diferentes configurados em um arquivo compartilhado. Os cães seguem de perto e podem correr ao lado dos veículos em velocidades moderadas. Os gatos são mais independentes, ocasionalmente vagando por curtas distâncias antes de retornar. Os pássaros podem pousar no ombro do jogador usando um acessório de entidade. Defina a distância de acompanhamento de cada tipo de animal de estimação, multiplicador de velocidade de movimento, animações de inatividade, animações de interação e habilidades especiais para criar personalidades distintas para cada espécie.
-- 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'},
},
}Desova e comportamento de acompanhamento
O núcleo de qualquer sistema de animal de estimação é a IA de acompanhamento que faz com que o animal siga naturalmente atrás de seu dono. Quando um jogador gera seu animal de estimação, crie o ped em sua posição usando CreatePed com o modelo apropriado. Defina o ped como não persistente usando SetEntityAsMissionEntity e configure-o para ser amigável ao proprietário usando grupos de relacionamento. O comportamento follow usa um loop do lado do cliente que calcula constantemente a distância entre o animal de estimação e o dono. Quando a distância exceder o limite de acompanhamento, peça ao animal de estimação que corra em direção a uma posição ligeiramente atrás e ao lado do dono usando TaskFollowToOffsetOfEntity. Este nativo lida com a localização de caminhos automaticamente, fazendo com que o animal contorne obstáculos, ande nas calçadas e evite o trânsito. Quando o dono parar de se mover e o animal atingir a distância de acompanhamento, reproduza uma animação ociosa, como sentar ou deitar. Se o proprietário entrar em um veículo e for embora, teletransporte o animal de estimação para o veículo, se for de um tipo adequado, ou desapareça o animal de estimação e reapareça quando o proprietário sair do veículo para evitar que o animal de estimação se perca no mapa.
-- 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
endNecessidades de animais de estimação e sistema de vínculo
Um sistema de necessidades confere responsabilidade e profundidade contínuas à propriedade de animais de estimação. Acompanhe a fome, a felicidade e a saúde como valores entre 0 e 100 que diminuem em tempo real. A fome diminui em 1 ponto a cada 5 minutos de tempo real em que o animal de estimação é gerado. A felicidade diminui mais lentamente em 1 ponto a cada 10 minutos, mas aumenta significativamente quando o dono interage com o animal de estimação através de carícias, brincadeiras ou dar guloseimas. A saúde permanece em 100, a menos que a fome caia abaixo de 20, momento em que começa a diminuir. Quando a fome chega a zero, o animal fica letárgico com movimentos mais lentos e animações tristes. Quando a saúde cai muito, o animal precisa de atenção veterinária para se recuperar. Os jogadores alimentam seus animais de estimação usando itens alimentares de seu inventário na entidade animal de estimação. Diferentes tipos de alimentos restauram diferentes quantidades de fome: a ração básica restaura 30 pontos, a ração premium restaura 60 e as guloseimas restauram 10, mas aumentam a felicidade em 15. O nível de vínculo acompanha a relação cumulativa entre o proprietário e o animal de estimação, aumentando através de interações positivas e diminuindo através da negligência. Níveis de vínculo mais altos desbloqueiam interações especiais e melhoram a capacidade de resposta do animal aos comandos.
-- 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)Comandos de interação e animações
Dê aos jogadores um rico conjunto de comandos para interagir com seus animais de estimação. Um menu radial ou sistema de comando deve oferecer opções como sentar, ficar, seguir, vir, deitar, agitar, buscar e falar. Cada comando aciona uma animação correspondente no pet ped usando os dicionários de animação de criaturas incorporados ao GTA V. O comando sit usa animações de creatures@dog@amb@ com os clipes sit_enter e sit_loop. Lie down usa animações ambientais semelhantes. Para buscar, gere uma pequena bola, jogue-a usando uma trajetória parabólica e peça ao animal de estimação para correr até a posição de pouso da bola, pegá-la usando um acessório e devolvê-la ao dono. O comando speak aciona um áudio de latido usando PlayPedAmbientSpeechNative. Para acariciar, reproduza uma animação de ajoelhar-se no jogador e, ao mesmo tempo, reproduza uma animação alegre de abanar o rabo no animal de estimação. Estas interações não são apenas cosméticas; cada um aumenta as estatísticas de felicidade e vínculo, recompensando os jogadores que se envolvem ativamente com seu companheiro, em vez de tratá-lo como um seguidor passivo.
Persistência e Integração com Pet Shop
Os animais de estimação precisam persistir durante as sessões do servidor para que os jogadores não percam seus companheiros a cada reinicialização. Armazene dados de animais de estimação no banco de dados, incluindo o identificador do proprietário, tipo de animal de estimação, nome personalizado, valores de necessidades atuais, nível de vínculo e quaisquer truques ou habilidades desbloqueados. Quando o proprietário fizer login, consulte os dados do animal de estimação e ofereça-se para gerá-lo por meio de um comando ou automaticamente, se ele estava ativo na última vez que se desconectou. Integre a aquisição de animais de estimação por meio de um pet shop no jogo localizado em uma posição lógica do mapa. O pet shop NUI exibe os tipos de animais de estimação disponíveis com seus modelos renderizados em uma área de visualização, preços e descrições. Após a compra, o jogador nomeia seu novo animal de estimação e ele aparece ao lado dele. Considere adicionar um centro de adoção de animais de estimação como uma alternativa com preços mais baixos, mas com tipos de animais de estimação aleatórios, adicionando um ângulo de dramatização de caridade. Para economias de servidores, os animais de estimação também podem exigir despesas periódicas, como visitas ao veterinário para restauração da saúde, preparação para bônus de aparência e sessões de treinamento que desbloqueiam novas animações de comando, criando um custo realista de propriedade de animais de estimação que se integra ao seu sistema econômico mais amplo.
-- 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})
endIntegração policial K-9 e funções especiais
Para dramatização de aplicação da lei, estenda o sistema de animais de estimação para uma integração completa da unidade K-9. Os cães policiais ganham habilidades especiais não disponíveis para animais de estimação civis. O comando de busca faz com que o K-9 cheire veículos ou edifícios próximos e alerte sobre itens contrabandeados configuráveis, latindo e sentando-se próximo à fonte. Implemente isso verificando os inventários de jogadores próximos ou porta-malas de veículos em busca de itens sinalizados quando o comando de busca for emitido. O comando de rastreamento faz com que o K-9 siga uma trilha de cheiro, que você pode implementar criando uma trilha de posições de um suspeito em fuga e incumbindo o cão de segui-lo. O comando de apreensão faz o K-9 correr em direção a um alvo e reproduzir uma animação de ataque, dando aos policiais uma opção não letal para derrubadas de suspeitos. Restrinja essas habilidades a jogadores com trabalho policial e certificação de manipulador K-9. O K-9 deve usar um colete policial usando variações de componentes pedais ou acessórios para distingui-lo visualmente dos animais de estimação civis. Esta especialização cria uma posição única e muito procurada dentro da hierarquia do departamento de polícia.
