Система рыбалки с лодки FiveM: скриптинг реалистичных океанских работ
Создайте полноценную систему рыбалки с лодками в FiveM. Места ловли, логика улова, цепочки продажи, аренда лодок и лучшие скрипты для прибрежной ролевой игры.
Agency Scripts
Основатель и ведущий разработчик Agency Scripts
Глубоководная рыбалка как игровая система
Глубоководная рыбалка расширяет стандартный рыболовный механизм, встречающийся на большинстве серверов FiveM, выводя игроков в открытое море, где они сражаются с крупными видами рыб, преодолевают морские опасности и управляют топливом и вместимостью лодки. В то время как береговая рыбалка , пассивное занятие, где игроки забрасывают удочку и ждут, глубоководная рыбалка , это экспедиция, требующая подготовки, вложений и командной работы. Игроки арендуют или покупают лодки, приобретают наживку и снасти, направляются к рыболовным местам, отмеченным на морской карте, и используют сонар для поиска косяков рыб под поверхностью. Улов ценнее береговой рыбы, но риски выше: штормы могут повредить лодки, топливо может закончиться далеко от берега, а редкие трофейные рыбы требуют длительной борьбы, проверяющей терпение и умения игрока. Этот баланс риска и награды создаёт по-настоящему захватывающие игровые моменты, когда игрок зацепляет огромного тунца после получаса плавания к нужному месту, а социальная динамика рыбалки с друзьями создаёт воспоминания, которые заставляют игроков возвращаться.
Настройка лодок и управление флотом
Определите несколько классов лодок от маленьких шлюпок для прибрежной рыбалки до больших чартерных судов для глубоководных экспедиций. Каждая лодка должна иметь настраиваемые свойства, включая скорость, ёмкость топлива, слоты для хранения пойманной рыбы, количество держателей удочек, определяющее, сколько лесок можно забросить одновременно, и рейтинг прочности, который уменьшается при использовании и воздействии штормов. Храните владение лодками в базе данных и предоставьте место в марине, где игроки могут покупать, улучшать и обслуживать свои суда. Позвольте владельцам лодок приглашать других игроков в качестве членов экипажа, которые могут рыбачить с палубы, создавая совместный опыт, где капитан управляет судном, а члены экипажа управляют несколькими лесками:
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 },
},
},
}
Система зон ограничивает виды рыб, доступных в каждой области, заставляя игроков уходить дальше от берега за более ценным уловом. Маленькие лодки могут заходить только в прибрежные зоны, а большие суда открывают доступ к оффшорным и глубоководным зонам, где плавают самые прибыльные рыбы. Это создает естественный путь прогрессии, когда игроки зарабатывают деньги на мелкой рыбе, чтобы финансировать покупку лучших лодок для доступа к премиальным рыболовным угодьям.
Механика сонара и поиска рыбы
Добавьте сонар для лодок, показывающий плотность рыбы в окружающей воде. Реализуйте сонар как NUI-оверлей, который появляется при активации рыболовного эхолота с панели управления лодкой. Сонар должен отображать круговой скан с отметками, представляющими косяки рыбы на разных глубинах, обновляясь каждые несколько секунд с небольшими изменениями положения для имитации движения рыбы. Размер каждой отметки указывает плотность косяка и качество потенциального улова. Игроки должны управлять лодкой, чтобы расположиться над косяком перед забросом удочек, добавляя элемент навигационной мини-игры перед самой рыбалкой. Данные сонара генерируются на сервере на основе реального положения лодки относительно настроенных рыболовных зон с рандомизированным смещением косяков, чтобы игроки не могли просто запомнить фиксированные места.
Мини-игра рыбалка и механика боя
Когда рыба клюет, запускается мини-игра рыбалки с боем, сложность которой зависит от вида и веса рыбы. В бою нужно управлять натяжением лески через динамическую шкалу, которая меняется в зависимости от поведения рыбы. Игрок наматывает леску, удерживая клавишу, но должен отпускать ее, когда рыба резко дергается, чтобы леска не порвалась. Крупные рыбы сражаются дольше и сильнее, глубоководные виды, такие как марлин и акулы, требуют нескольких минут тщательного управления натяжением. Отображайте примерный вес рыбы, силуэт вида и прогресс боя, чтобы поддерживать интерес во время длительных схваток. Добавьте факторы окружающей среды, такие как сила течения и погодные условия, которые влияют на сложность боя: спокойная погода идеальна для рыбалки, а штормы значительно усложняют задачу:
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
Погодные и океанские условия
Интегрируйте систему рыбалки с погодой сервера для создания динамических условий на море, влияющих на игровой процесс. Спокойная погода обеспечивает идеальные условия для рыбалки с низкой интенсивностью волн и максимальной точностью сонара. Штормы увеличивают высоту волн, снижают эффективность сонара, повреждают лодки со временем и заставляют рыбу нырять глубже, где её сложнее поймать. Реализуйте систему состояния моря, которая плавно переключается между спокойным, умеренным, бурным и штормовым состояниями в зависимости от текущей погоды. Во время штормов отображайте визуальные эффекты, такие как увеличение высоты волн с помощью нативных настроек уровня воды, частицы брызг на палубе лодки и тряску экрана, усиливающуюся с ростом волн. Предоставляйте игрокам информацию о прогнозе погоды в марине, чтобы они могли планировать рыбалку в благоприятных условиях, и добавьте систему предупреждения о шторме, которая оповещает лодки в море о ухудшении погоды, чтобы они могли вернуться в порт до того, как условия станут опасными.
Интеграция рыбного рынка и экономики
Создайте рыбный рынок на пристани, где игроки продают свой улов по ценам, которые меняются в зависимости от спроса и предложения. Когда много игроков продают тунца, цена на тунца падает. Когда долго никто не продавал меч-рыбу, цена растёт. Такая динамическая ценовая политика стимулирует игроков разнообразить улов и выбирать менее популярные виды, когда рынок насыщен. Отслеживайте общее количество проданной рыбы по видам за скользящие временные интервалы и корректируйте цены в пределах заданных минимальных и максимальных значений. Отображайте текущие рыночные цены на табло на пристани, чтобы игроки могли принимать обоснованные решения о том, какие виды ловить перед выходом. Для продвинутой интеграции разрешите ресторанам на сервере размещать оптовые заказы на определённые виды рыбы по премиальным ценам, создавая прямую цепочку поставок между рыбаками и операторами ресторанов, обогащающую оба игровых цикла.
Производительность и управление сущностями
Лодки и морская среда представляют уникальные проблемы производительности, так как рендеринг воды уже затратен в GTA V, а добавление сущностей лодок, эффектов рыбьих боёв и сонарных наложений увеличивает нагрузку. Создавайте сущности рыб только во время активных боёв и только видимыми для сражающегося игрока, чтобы избежать создания десятков рыб, видимых всем на сервере. Используйте эффекты частиц экономно для брызг воды и индикаторов боёв, отключая их для дальних наблюдателей через рендеринг на основе области видимости. Состояние топлива и хранения лодки должно отслеживаться на сервере, клиент запрашивает обновления только при открытии соответствующей панели UI, а не синхронизирует постоянно. Когда игроки швартуют лодку в марине, удаляйте сущность лодки и сохраняйте её состояние в базе данных, включая уровень топлива, прочность и хранящуюся рыбу. Это предотвращает переполнение марин постоянными сущностями лодок, которые потребляют ресурсы сервера, даже когда их владельцы офлайн. Тестируйте систему в мультиплеерных сценариях, где несколько лодок рыбачат в одной зоне одновременно, обеспечивая правильную изоляцию данных косяков рыб, отображений сонара и боёв для каждого игрока.