Filosofia de Design de Sistema Agrícola
Um sistema agrícola traz um ritmo completamente diferente aos servidores de RPG FiveM, oferecendo aos jogadores uma alternativa relaxante às atividades criminosas de alta adrenalina e à aplicação da lei. Os melhores sistemas agrícolas criam um ciclo económico autossustentável onde os jogadores compram sementes, plantam culturas em terras agrícolas designadas, cuidam delas ao longo de ciclos de crescimento em tempo real, colhem os produtos e vendem-nos no mercado com lucro. O desafio do design reside em tornar o sistema envolvente o suficiente para que os jogadores retornem regularmente, sem torná-lo tão demorado a ponto de parecer uma tarefa árdua. Use ciclos de crescimento em tempo real que continuam mesmo quando o jogador está offline, para que os agricultores façam login para encontrar suas colheitas em diferentes estágios de crescimento. O modelo de dados principal precisa rastrear cada parcela de cultura individual com sua posição, tipo de cultura, estágio de crescimento atual, carimbo de data/hora plantado, nível de água e classificação de qualidade. Armazene tudo isso do lado do servidor em um banco de dados para que o estado do farm persista durante as reinicializações do servidor e fique protegido contra manipulação do lado do cliente.
Plantio de culturas e esquema de banco de dados
O sistema de plantio começa com um jogador selecionando sementes de seu inventário e colocando-as em zonas agrícolas válidas. Defina terras agrícolas como zonas poligonais configuráveis no mapa onde o plantio é permitido, evitando que os jogadores cultivem nas calçadas ou dentro de edifícios. Cada lote agrícola deve ter um número limitado de slots com base no tamanho do terreno, e os jogadores podem alugar ou comprar terras agrícolas através de um NPC ou sistema imobiliário. Quando um jogador planta uma semente, crie um registro de banco de dados que rastreie a colheita durante todo o seu ciclo de vida. Aqui está um esquema prático de banco de dados e o manipulador de plantio do lado do servidor:
CREATE TABLE IF NOT EXISTS farm_crops (
id INT AUTO_INCREMENT PRIMARY KEY,
owner VARCHAR(50) NOT NULL,
farm_id VARCHAR(50) NOT NULL,
crop_type VARCHAR(50) NOT NULL,
position_x FLOAT NOT NULL,
position_y FLOAT NOT NULL,
position_z FLOAT NOT NULL,
planted_at BIGINT NOT NULL,
growth_stage INT DEFAULT 0,
water_level FLOAT DEFAULT 100.0,
quality FLOAT DEFAULT 1.0,
is_harvestable TINYINT DEFAULT 0,
is_dead TINYINT DEFAULT 0,
last_watered BIGINT DEFAULT 0,
INDEX idx_owner (owner),
INDEX idx_farm (farm_id)
);
CREATE TABLE IF NOT EXISTS farm_plots (
id INT AUTO_INCREMENT PRIMARY KEY,
farm_id VARCHAR(50) NOT NULL UNIQUE,
owner VARCHAR(50) DEFAULT NULL,
max_slots INT DEFAULT 20,
rent_price INT DEFAULT 500,
coords_center_x FLOAT NOT NULL,
coords_center_y FLOAT NOT NULL,
coords_center_z FLOAT NOT NULL,
radius FLOAT DEFAULT 30.0
);
RegisterNetEvent('farming:server:plantCrop', function(cropType, position)
local src = source
local Player = QBCore.Functions.GetPlayer(src)
if not Player then return end
local citizenid = Player.PlayerData.citizenid
local seedItem = 'seed_' .. cropType
if not Player.Functions.GetItemByName(seedItem) then
return TriggerClientEvent('QBCore:Notify', src, 'You need seeds to plant', 'error')
end
local farmId = GetFarmAtPosition(position)
if not farmId then
return TriggerClientEvent('QBCore:Notify', src, 'You can only plant on farmland', 'error')
end
local currentCrops = MySQL.scalar.await(
'SELECT COUNT(*) FROM farm_crops WHERE farm_id = ? AND is_dead = 0',
{farmId}
)
local maxSlots = MySQL.scalar.await(
'SELECT max_slots FROM farm_plots WHERE farm_id = ?', {farmId}
)
if currentCrops >= maxSlots then
return TriggerClientEvent('QBCore:Notify', src, 'Farm is full', 'error')
end
Player.Functions.RemoveItem(seedItem, 1)
MySQL.insert(
'INSERT INTO farm_crops (owner, farm_id, crop_type, position_x, position_y, position_z, planted_at, last_watered) VALUES (?, ?, ?, ?, ?, ?, ?, ?)',
{citizenid, farmId, cropType, position.x, position.y, position.z, os.time(), os.time()}
)
TriggerClientEvent('QBCore:Notify', src, 'Planted ' .. cropType, 'success')
TriggerClientEvent('farming:client:spawnCropProp', -1, position, cropType, 0)
end)Cada tipo de cultivo deverá ter diferentes parâmetros de crescimento definidos em uma tabela de configuração. O trigo pode crescer em 30 minutos no mundo real em 4 estágios, enquanto a cannabis ou as uvas podem levar várias horas em 6 estágios, recompensando os agricultores pacientes com produtos de maior valor. O estágio de crescimento determina qual modelo de suporte é exibido no mundo, passando de um pequeno broto para uma planta adulta conforme o tempo passa.
Motor do Ciclo de Crescimento e Rega
O mecanismo do ciclo de crescimento é um loop do lado do servidor que verifica periodicamente todas as culturas plantadas e avança seus estágios de crescimento com base no tempo decorrido e em condições como o nível da água. Execute-o como um thread de servidor cronometrado que é executado a cada poucos minutos, calculando se cada cultura deve avançar para o próximo estágio com base na duração do crescimento do tipo de cultura e no tempo desde o plantio. O nível da água é a principal mecânica que mantém os jogadores envolvidos: as colheitas consomem água ao longo do tempo e, se o nível da água cair para zero, o crescimento é interrompido e a qualidade da colheita degrada-se. Os jogadores devem retornar à sua fazenda e usar um regador ou sistema de irrigação para reabastecer os níveis de água. Aqui está o mecanismo de crescimento do lado do servidor:
local CropConfig = {
wheat = {
stages = 4,
growthTime = 1800, -- 30 min total, ~7.5 min per stage
waterConsumption = 5, -- per cycle
baseYield = 5,
sellPrice = 50
},
corn = {
stages = 5,
growthTime = 3600,
waterConsumption = 7,
baseYield = 4,
sellPrice = 80
},
tomato = {
stages = 4,
growthTime = 2400,
waterConsumption = 8,
baseYield = 6,
sellPrice = 65
},
grape = {
stages = 6,
growthTime = 7200,
waterConsumption = 4,
baseYield = 8,
sellPrice = 120
}
}
CreateThread(function()
while true do
Wait(60000 * 5) -- Run every 5 minutes
local crops = MySQL.query.await(
'SELECT * FROM farm_crops WHERE is_dead = 0 AND is_harvestable = 0'
)
for _, crop in ipairs(crops or {}) do
local config = CropConfig[crop.crop_type]
if not config then goto continue end
local elapsed = os.time() - crop.planted_at
local stageTime = config.growthTime / config.stages
local expectedStage = math.min(math.floor(elapsed / stageTime), config.stages)
-- Degrade water
local newWater = math.max(0, crop.water_level - config.waterConsumption)
local newQuality = crop.quality
-- Quality degrades without water
if newWater <= 0 then
newQuality = math.max(0.3, crop.quality - 0.05)
expectedStage = crop.growth_stage -- Pause growth
end
local isHarvestable = expectedStage >= config.stages and newWater > 0
if expectedStage ~= crop.growth_stage or newWater ~= crop.water_level then
MySQL.update(
'UPDATE farm_crops SET growth_stage = ?, water_level = ?, quality = ?, is_harvestable = ? WHERE id = ?',
{expectedStage, newWater, newQuality, isHarvestable and 1 or 0, crop.id}
)
if expectedStage ~= crop.growth_stage then
TriggerClientEvent('farming:client:updateCropStage', -1,
crop.id, expectedStage, crop.crop_type,
vector3(crop.position_x, crop.position_y, crop.position_z))
end
end
::continue::
end
end
end)A mecânica de rega deve parecer interativa e não tediosa. Dê ao jogador um item de regador que aciona uma animação quando usado perto de plantações e regue várias plantações próximas em uma única ação, em vez de exigir rega uma por uma. Para explorações agrícolas maiores, introduza uma atualização do sistema de irrigação que regue automaticamente todas as culturas na parcela em intervalos regulares, reduzindo o trabalho manual, mas exigindo um investimento inicial em materiais. Exiba o nível de água de cada cultura e o progresso do crescimento através de um pequeno indicador acima do suporte quando o jogador olha para ele, usando texto 3D ou uma sobreposição do sistema de destino.
Colheita e Qualidade do Produto
A colheita é o momento de recompensa que torna satisfatório todo o ciclo agrícola. Quando uma cultura atinge a sua fase final de crescimento e é regada adequadamente, torna-se colhível. O jogador interage com a colheita, reproduz uma animação de colheita e recebe itens de produção em seu inventário. A quantidade e a qualidade dos produtos dependem de quão bem o jogador manteve a colheita durante o seu ciclo de crescimento: a rega consistente produz itens de maior qualidade que são vendidos por mais, enquanto as culturas negligenciadas produzem menos itens de qualidade inferior. Implemente um multiplicador de qualidade que afete tanto o rendimento como o preço de venda, criando um forte incentivo para uma agricultura atenta. Após a colheita, retire a cultura do banco de dados e exclua o adereço do mundo, liberando o espaço da parcela para replantio. Considere adicionar uma mecânica de compostagem onde as colheitas de baixa qualidade possam ser convertidas em fertilizantes que aumentem a qualidade das colheitas futuras, criando um ciclo de desperdício zero que recompensa a actividade agrícola contínua.
Sistema de Pecuária
Os animais acrescentam uma segunda dimensão à experiência agrícola e criam fontes de receitas adicionais. Implemente animais compráveis, como galinhas, vacas e ovelhas, que são colocados em currais designados para animais nas terras agrícolas. Cada tipo de animal tem seu próprio ciclo de produção: as galinhas produzem ovos a cada poucas horas, as vacas produzem leite diariamente e as ovelhas podem ser tosquiadas para obter lã periodicamente. Os animais necessitam de alimentação a partir do inventário de produção do jogador, ligando o sistema de cultivo directamente ao sistema animal e criando um ciclo económico fechado. Aqui está uma configuração e sistema de alimentação para animais de fazenda:
Config.Animals = {
chicken = {
model = 'a_c_hen',
purchasePrice = 500,
feedItem = 'wheat',
feedInterval = 3600, -- needs feeding every hour
productionItem = 'eggs',
productionAmount = 3,
productionInterval = 7200, -- produces every 2 hours
maxPerFarm = 10
},
cow = {
model = 'a_c_cow',
purchasePrice = 3000,
feedItem = 'corn',
feedInterval = 5400,
productionItem = 'milk',
productionAmount = 2,
productionInterval = 14400,
maxPerFarm = 5
},
sheep = {
model = 'a_c_sheep',
purchasePrice = 1500,
feedItem = 'wheat',
feedInterval = 4800,
productionItem = 'wool',
productionAmount = 1,
productionInterval = 21600,
maxPerFarm = 8
}
}
RegisterNetEvent('farming:server:feedAnimal', function(animalId)
local src = source
local Player = QBCore.Functions.GetPlayer(src)
if not Player then return end
local animal = MySQL.query.await(
'SELECT * FROM farm_animals WHERE id = ? AND owner = ?',
{animalId, Player.PlayerData.citizenid}
)
if not animal or not animal[1] then return end
animal = animal[1]
local config = Config.Animals[animal.animal_type]
if not Player.Functions.GetItemByName(config.feedItem) then
return TriggerClientEvent('QBCore:Notify', src, 'Need ' .. config.feedItem .. ' to feed', 'error')
end
Player.Functions.RemoveItem(config.feedItem, 1)
MySQL.update(
'UPDATE farm_animals SET last_fed = ?, hunger = 100 WHERE id = ?',
{os.time(), animalId}
)
TriggerClientEvent('QBCore:Notify', src, 'Animal fed successfully', 'success')
end)Os animais que não são alimentados a tempo tornam-se infelizes, reduzindo a sua produção. Se não forem alimentados por muito tempo, eles param totalmente de produzir. Exiba o status do animal por meio de uma interação alvo que mostra o nível de fome, felicidade e tempo até a próxima produção. Isso cria uma rotina diária de check-in para os agricultores que os mantém envolvidos com o servidor entre os ciclos de crescimento das culturas.
Sistema de mercado e venda de produtos
O sistema de mercado conecta os agricultores à economia de servidores mais ampla. Crie locais de fornecedores de NPCs em mercados de agricultores, mercearias e restaurantes ao redor do mapa, onde os jogadores possam vender seus produtos. Implementar um sistema de preços dinâmico onde os preços flutuem com base na oferta e na procura: se muitos agricultores cultivam trigo, os preços do trigo caem, incentivando a diversidade das culturas. Acompanhe o volume total de vendas por tipo de cultura ao longo das janelas de tempo e ajuste os preços de acordo. Os produtos premium provenientes de colheitas de alta qualidade são vendidos a um multiplicador acima do preço base, recompensando uma agricultura cuidadosa. Considere adicionar uma opção de negociação entre jogadores, onde os agricultores podem montar barracas de mercado em áreas designadas, vendendo diretamente a outros jogadores a preços personalizados. Isso cria interações orgânicas entre agricultores e compradores e permite que os jogadores empreendedores lucrem comprando produtos baratos no atacado e vendendo com preços de varejo em áreas de alto tráfego.
Efeitos climáticos na agricultura
A integração climática acrescenta imprevisibilidade e estratégia à agricultura. Conecte-se ao sistema climático do seu servidor para aplicar modificadores ao crescimento das colheitas e ao consumo de água. A chuva rega naturalmente todas as culturas ao ar livre, reduzindo a necessidade de rega manual durante os períodos de chuva. O calor extremo aumenta o consumo de água, forçando os agricultores a regar com mais frequência durante o tempo quente. As tempestades podem danificar as colheitas, reduzindo a qualidade ou mesmo destruindo produtos não colhidos que foram deixados durante muito tempo. Os eventos de geada durante o inverno podem matar completamente certos tipos de culturas, exigindo que os agricultores escolham variedades resistentes ao frio ou invistam em estruturas de estufas que protejam as culturas dos efeitos climáticos. Implemente um sistema de previsão do tempo acessível por meio de um aplicativo de telefone no jogo ou transmissão de TV para que os agricultores possam planejar seu cronograma de plantio de acordo com as condições futuras, adicionando uma camada de planejamento estratégico que eleva a experiência agrícola além da simples mecânica de clicar e esperar.
Atualizações e Progressão da Fazenda
Um sistema de progressão oferece aos agricultores objetivos de longo prazo e recompensa o jogo consistente. Comece os jogadores com um pequeno terreno que pode conter um punhado de colheitas e, em seguida, deixe-os ganhar expansões por meio de XP agrícola ou compra direta. Cada nível de atualização desbloqueia novos recursos: sistemas de irrigação automatizados que cuidam da irrigação, currais maiores para mais gado, um celeiro para armazenar produtos excedentes, estações de processamento que convertem itens crus em bens de maior valor, como trigo em farinha ou uvas em vinho, e um veículo trator que acelera o plantio e a colheita em grandes parcelas. Acompanhe a XP agrícola separadamente da progressão de outros servidores para criar uma habilidade agrícola dedicada que melhora a qualidade do rendimento e reduz o tempo de crescimento em níveis mais altos. O sistema de processamento é especialmente importante para a economia porque acrescenta etapas de valor acrescentado entre os produtos brutos e os produtos acabados, criando oportunidades para a dramatização da cadeia de abastecimento, onde os agricultores vendem matérias-primas a padarias, adegas ou restaurantes de propriedade dos jogadores que os convertem em produtos finais para os consumidores.
