La pêche en haute mer comme système de gameplay
La pêche en haute mer étend la mécanique de pêche standard trouvée sur la plupart des serveurs FiveM en emmenant les joueurs au large en eaux libres où ils combattent des espèces de poissons plus grosses, naviguent dans les dangers océaniques et gèrent le carburant et la capacité de stockage des bateaux. Alors que la pêche à pied est une activité passive où les joueurs lancent une ligne et attendent, la pêche en haute mer est une expédition qui nécessite préparation, investissement et travail d'équipe. Les joueurs louent ou achètent des bateaux, achètent des appâts et du matériel, naviguent vers les zones de pêche indiquées sur la carte marine et utilisent un équipement sonar pour localiser les bancs de poissons sous la surface. La capture a plus de valeur que les poissons du rivage, mais les risques sont plus élevés : les tempêtes peuvent endommager les bateaux, le carburant peut s'épuiser loin du rivage et les poissons trophées rares nécessitent des combats prolongés qui mettent à l'épreuve la patience et l'habileté du joueur. Cet équilibre risque-récompense crée des moments de jeu véritablement passionnants lorsqu'un joueur attrape un énorme thon après avoir investi trente minutes de navigation jusqu'au bon endroit, et la dynamique sociale des sorties de pêche entre amis crée des souvenirs qui incitent les joueurs à revenir.
Configuration des bateaux et gestion de flotte
Définissez plusieurs classes de bateaux allant des petits dériveurs pour la pêche côtière aux grands navires affrétés pour les expéditions en eaux profondes. Chaque bateau doit avoir des propriétés configurables, notamment la vitesse, la capacité de carburant, les emplacements de stockage pour les poissons capturés, le nombre de supports de canne déterminant le nombre de lignes pouvant être lancées simultanément et un indice de durabilité qui se dégrade avec l'utilisation et l'exposition aux tempêtes. Stockez la propriété des bateaux dans la base de données et fournissez un emplacement de marina où les joueurs achètent, améliorent et entretiennent leurs navires. Permettez aux propriétaires de bateaux d'inviter d'autres joueurs à bord en tant que membres d'équipage qui peuvent pêcher depuis le pont, créant ainsi une expérience coopérative dans laquelle le capitaine navigue tandis que les membres d'équipage gèrent plusieurs lignes :
Config.Boats = {
['dinghy'] = {
label = 'Fishing Dinghy',
model = 'dinghy',
price = 15000,
fuelCapacity = 60,
storageSlots = 10,
maxWeight = 200,
rodHolders = 1,
maxCrew = 2,
durability = 100,
speed = 'slow',
fishingZones = { 'nearshore' },
},
['marquis'] = {
label = 'Sport Fisher',
model = 'marquis',
price = 85000,
fuelCapacity = 200,
storageSlots = 30,
maxWeight = 800,
rodHolders = 4,
maxCrew = 6,
durability = 250,
speed = 'medium',
fishingZones = { 'nearshore', 'offshore', 'deep_sea' },
},
['tug'] = {
label = 'Commercial Trawler',
model = 'tug',
price = 250000,
fuelCapacity = 500,
storageSlots = 60,
maxWeight = 3000,
rodHolders = 6,
maxCrew = 8,
durability = 500,
speed = 'slow',
fishingZones = { 'nearshore', 'offshore', 'deep_sea', 'abyssal' },
},
}
Config.FishingZones = {
['nearshore'] = {
areas = {
{ center = vector3(-1850.0, -1250.0, 0.0), radius = 300.0 },
{ center = vector3(-3420.0, 970.0, 0.0), radius = 400.0 },
},
fish = {
{ item = 'bass', weight = { 1, 8 }, chance = 35, price = 15 },
{ item = 'mackerel', weight = { 0.5, 4 }, chance = 40, price = 10 },
{ item = 'snapper', weight = { 2, 12 }, chance = 20, price = 25 },
{ item = 'grouper', weight = { 5, 25 }, chance = 5, price = 40 },
},
},
['deep_sea'] = {
areas = {
{ center = vector3(-4200.0, -800.0, 0.0), radius = 600.0 },
{ center = vector3(-3800.0, 2200.0, 0.0), radius = 500.0 },
},
fish = {
{ item = 'tuna', weight = { 20, 120 }, chance = 25, price = 80 },
{ item = 'swordfish', weight = { 30, 200 }, chance = 15, price = 120 },
{ item = 'marlin', weight = { 50, 350 }, chance = 8, price = 200 },
{ item = 'shark', weight = { 80, 500 }, chance = 2, price = 500 },
},
},
}
Le système de zones restreint les espèces de poissons disponibles dans chaque zone, obligeant les joueurs à s'aventurer plus loin du rivage pour des captures plus précieuses. Les petits bateaux ne peuvent accéder qu’aux zones côtières, tandis que les plus gros navires débloquent les zones offshore et les eaux profondes où nagent les poissons les plus rentables. Cela crée un chemin de progression naturel où les joueurs gagnent de l'argent grâce à de petites prises pour financer de meilleurs bateaux qui accèdent à des zones de pêche haut de gamme.
Mécanismes de sonar et de recherche de poissons
Ajoutez un écran sonar aux bateaux qui montre la densité des poissons dans les eaux environnantes. Implémentez le sonar sous la forme d'une superposition NUI qui apparaît lorsque le joueur active son équipement de recherche de poissons à partir du panneau de commande du bateau. Le sonar doit afficher un balayage circulaire avec des points représentant des bancs de poissons à différentes profondeurs, mis à jour toutes les quelques secondes avec de légers changements de position pour simuler le mouvement des poissons. La taille de chaque spot indique la densité des bancs et la qualité potentielle des captures. Les joueurs doivent naviguer sur leur bateau pour se positionner au-dessus d'un banc avant de lancer leurs lignes, ajoutant ainsi un élément de mini-jeu de navigation avant que la pêche elle-même ne commence. Les données du sonar doivent être générées côté serveur en fonction de la position réelle du bateau par rapport aux zones de pêche configurées, avec des positions d'école aléatoires qui changent au fil du temps afin que les joueurs ne puissent pas simplement mémoriser des points chauds fixes.
Mini-jeu de pêche et mécanismes de combat
Lorsqu'un poisson mord, lancez un mini-jeu de combat de pêche dont la difficulté varie en fonction de l'espèce et du poids du poisson. Le combat doit consister à gérer la tension de la ligne grâce à une barre dynamique qui se déplace en fonction du comportement du poisson. Le joueur remonte en tenant une clé, mais doit relâcher lorsque le poisson surgit pour empêcher la ligne de se casser. Les poissons plus gros se battent plus fort et plus longtemps, les espèces des grands fonds comme le marlin et les requins nécessitant plusieurs minutes de gestion minutieuse de la tension. Affichez le poids estimé du poisson, la silhouette de l'espèce et la progression du combat pour maintenir l'engagement pendant les batailles plus longues. Ajoutez à cela des facteurs environnementaux tels que la force du courant et les conditions météorologiques qui affectent la difficulté du combat, ce qui rend le temps calme idéal pour la pêche tandis que les tempêtes augmentent considérablement le défi :
local fishFight = {
active = false,
tension = 50, -- 0-100, snaps at 100
progress = 0, -- 0-100, fish landed at 100
fishStrength = 0,
fishBehavior = 'steady',
reeling = false,
}
function StartFishFight(fishData)
fishFight.active = true
fishFight.tension = 30
fishFight.progress = 0
fishFight.fishStrength = fishData.weight * 0.5
SendNUIMessage({
action = 'showFishFight',
species = fishData.item,
estimatedWeight = fishData.weight,
})
CreateThread(function()
while fishFight.active do
-- Fish behavior changes randomly
local behaviorRoll = math.random(100)
if behaviorRoll < 15 then
fishFight.fishBehavior = 'surge' -- strong pull
elseif behaviorRoll < 40 then
fishFight.fishBehavior = 'resist' -- moderate pull
else
fishFight.fishBehavior = 'steady' -- light pull
end
-- Apply fish force
local force = fishFight.fishStrength * 0.02
if fishFight.fishBehavior == 'surge' then
force = force * 3.0
fishFight.progress = math.max(0, fishFight.progress - 2)
elseif fishFight.fishBehavior == 'resist' then
force = force * 1.5
end
-- Reeling input
if IsControlPressed(0, 38) then -- E key
fishFight.reeling = true
fishFight.progress = fishFight.progress + 0.8
fishFight.tension = fishFight.tension + force + 1.5
else
fishFight.reeling = false
fishFight.tension = math.max(0, fishFight.tension - 3)
end
-- Check win/lose conditions
if fishFight.tension >= 100 then
EndFishFight(false, 'Line snapped!')
return
end
if fishFight.progress >= 100 then
EndFishFight(true, fishData)
return
end
-- Update HUD
SendNUIMessage({
action = 'updateFishFight',
tension = fishFight.tension,
progress = fishFight.progress,
behavior = fishFight.fishBehavior,
})
Wait(100)
end
end)
end
Conditions météorologiques et océaniques
Intégrez ton système de pêche à la météo du serveur pour créer des conditions océaniques dynamiques qui affectent le gameplay. Le temps calme offre des conditions de pêche idéales avec une faible intensité des vagues et une précision maximale du sonar. Les tempêtes augmentent la hauteur des vagues, réduisent l’efficacité du sonar, endommagent les bateaux au fil du temps et poussent les poissons à plonger plus profondément là où ils sont plus difficiles à attraper. Mettre en œuvre un système d'état de la mer qui passe progressivement entre des conditions calmes, modérées, agitées et tempêtes en fonction de la météo actuelle. Pendant les tempêtes, affichez des effets visuels tels qu'une hauteur de vague accrue à l'aide des ajustements natifs du niveau d'eau, des particules pulvérisées sur le pont du bateau et des tremblements de l'écran qui s'intensifient avec la gravité des vagues. Donnez aux joueurs des informations sur les prévisions météorologiques à la marina afin qu'ils puissent planifier des sorties de pêche dans des conditions favorables, et ajoutez un système d'avertissement de tempête qui alerte les bateaux en mer lorsque le temps se détériore afin qu'ils puissent rentrer au port avant que les conditions ne deviennent dangereuses.
Marché du poisson et intégration économique
Créez un marché aux poissons dans la marina où les joueurs vendent leurs prises à des prix qui fluctuent en fonction de l'offre et de la demande. Lorsque de nombreux acteurs vendent du thon, le prix du thon baisse. Lorsque personne n’a vendu d’espadon depuis un certain temps, le prix augmente. Cette tarification dynamique incite les acteurs à diversifier leurs captures et à cibler des espèces moins prisées lorsque le marché est saturé. Suivez le nombre total de poissons vendus par espèce sur des fenêtres temporelles glissantes et ajustez les prix dans les limites minimales et maximales configurées. Affichez les prix actuels du marché sur un tableau à la marina afin que les joueurs puissent prendre des décisions éclairées sur les espèces à cibler avant de partir. Pour une intégration avancée, permettez aux restaurants sur le serveur de passer des commandes groupées pour des espèces de poissons spécifiques à des prix plus élevés, créant ainsi une chaîne d'approvisionnement directe entre les acteurs de la pêche et les restaurateurs qui enrichit les deux boucles de jeu.
Gestion des performances et des entités
Les bateaux et les environnements océaniques présentent des défis de performances uniques, car le rendu de l'eau est déjà coûteux dans GTA V, et l'ajout d'entités de bateau, d'effets de combat de poissons et de superpositions de sonar augmente encore la charge. Générez des entités de poisson uniquement pendant les combats actifs et visibles uniquement par le joueur combattant pour éviter de créer des dizaines d'objets de poisson visibles par tous sur le serveur. Utilisez les effets de particules avec parcimonie pour les éclaboussures d'eau et les indicateurs de combat, en les désactivant pour les observateurs distants grâce au rendu basé sur la portée. Le carburant du bateau et l'état de stockage doivent être suivis côté serveur, le client demandant des mises à jour uniquement lorsque le joueur ouvre le panneau d'interface utilisateur approprié plutôt que de synchroniser en continu. Lorsque les joueurs amarrent leur bateau à la marina, faites disparaître l'entité du bateau et stockez son état dans la base de données, y compris le niveau de carburant, la durabilité et le poisson stocké. Cela empêche les marinas de se remplir d'entités de bateaux persistantes qui consomment les ressources du serveur même lorsque leurs propriétaires sont hors ligne. Testez ton système dans des scénarios multijoueurs où plusieurs bateaux pêchent simultanément dans la même zone, en tu assurant que les données des bancs de poissons, les affichages du sonar et les instances de combat restent correctement isolés par joueur.
