System wędkarstwa z łodzi FiveM: oskryptuj realistyczne prace na oceanie
Stwórz kompletny system łowienia z łodzi w FiveM: miejscówki, logika połowu, łańcuchy sprzedaży, wynajem łodzi i najlepsze skrypty napędzające twój nadmorski roleplay.
Agency Scripts
Założyciel i główny deweloper w Agency Scripts
Wędkarstwo głębinowe jako system rozgrywki
Wędkarstwo głębinowe rozszerza standardową mechanikę łowienia ryb znaną z większości serwerów FiveM, zabierając graczy na otwarte wody, gdzie mierzą się z większymi gatunkami ryb, stawiają czoła zagrożeniom na oceanie oraz zarządzają paliwem i ładownością łodzi. Podczas gdy łowienie z brzegu jest pasywną czynnością, w której gracze zarzucają wędkę i czekają, wędkarstwo głębinowe to wyprawa wymagająca przygotowania, inwestycji i pracy zespołowej. Gracze wynajmują lub kupują łodzie, zaopatrują się w przynęty i sprzęt, płyną na łowiska zaznaczone na mapie nawigacyjnej i używają sonaru do lokalizowania ławic ryb pod powierzchnią. Złowione ryby są cenniejsze niż te z brzegu, ale ryzyko jest większe: sztormy mogą uszkodzić łodzie, paliwo może skończyć się daleko od brzegu, a rzadkie ryby trofeowe wymagają długich holi wystawiających na próbę cierpliwość i umiejętności gracza. Ten balans ryzyka i nagrody tworzy naprawdę ekscytujące momenty rozgrywki, gdy gracz zacina potężnego tuńczyka po trzydziestu minutach żeglugi na właściwe miejsce, a społeczny wymiar wspólnych wypraw ze znajomymi buduje wspomnienia przyciągające graczy z powrotem.
Konfiguracja łodzi i zarządzanie flotą
Zdefiniuj wiele klas łodzi, od małych pontonów do łowienia przybrzeżnego po duże jednostki czarterowe na wyprawy głębinowe. Każda łódź powinna mieć konfigurowalne właściwości, w tym prędkość, pojemność zbiornika paliwa, sloty w schowku na złowione ryby, liczbę uchwytów na wędki określającą, ile linii można zarzucić jednocześnie, a także poziom wytrzymałości spadający w miarę użytkowania i działania sztormów. Zapisuj własność łodzi w bazie danych i udostępnij marinę, w której gracze mogą kupować, ulepszać i serwisować swoje jednostki. Pozwól właścicielom łodzi zapraszać innych graczy na pokład jako członków załogi mogących łowić z pokładu, tworząc kooperacyjną rozgrywkę, w której kapitan steruje, podczas gdy załoga obsługuje wiele wędek:
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 },
},
},
}
System stref ogranicza gatunki ryb dostępne w każdym obszarze, zmuszając graczy do wypływania dalej od brzegu po cenniejsze zdobycze. Małe łodzie mają dostęp tylko do stref przybrzeżnych, podczas gdy większe jednostki odblokowują wody otwarte i strefy głębinowe z najbardziej opłacalnymi rybami. Tworzy to naturalną ścieżkę progresji, w której gracze zarabiają na mniejszych połowach, aby kupić lepsze łodzie dające dostęp do najlepszych łowisk.
Mechanika sonaru i wykrywania ryb
Dodaj do łodzi wyświetlacz sonaru, który pokazuje zagęszczenie ryb w otaczającej wodzie. Zaimplementuj sonar jako nakładkę NUI, która pojawia się, gdy gracz aktywuje echosondę z panelu sterowania łodzi. Sonar powinien wyświetlać kolisty zasięg z blipami reprezentującymi ławice ryb na różnych głębokościach, aktualizującymi się co kilka sekund z niewielkimi zmianami pozycji, aby symulować ruch ryb. Rozmiar każdego blipa wskazuje zagęszczenie ławicy i potencjalną jakość połowu. Gracze muszą ustawić łódź nad ławicą przed zarzuceniem wędek, co dodaje element minigry nawigacyjnej przed rozpoczęciem samego łowienia. Dane sonaru powinny być generowane po stronie serwera na podstawie rzeczywistej pozycji łodzi względem skonfigurowanych stref łowienia, z losowymi pozycjami ławic zmieniającymi się w czasie, dzięki czemu gracze nie mogą po prostu zapamiętać stałych miejscówek.
Minigra wędkarska i mechanika walki z rybą
Gdy ryba weźmie, uruchom minigrę holowania ryby, której poziom trudności skaluje się w zależności od gatunku i wagi ryby. Walka powinna polegać na kontrolowaniu napięcia żyłki za pomocą dynamicznego paska, który porusza się w zależności od zachowania ryby. Gracz zwija żyłkę, przytrzymując klawisz, ale musi go puścić, gdy ryba szarpie, aby żyłka nie pękła. Większe ryby walczą ciężej i dłużej, a gatunki głębinowe, takie jak marliny i rekiny, wymagają kilku minut ostrożnego kontrolowania napięcia. Wyświetlaj szacowaną wagę ryby, sylwetkę gatunku i postęp walki, aby utrzymać zaangażowanie podczas dłuższych starć. Dodaj czynniki środowiskowe, takie jak siła prądu i warunki pogodowe, które wpływają na trudność walki, sprawiając, że spokojna pogoda jest idealna do łowienia, a burze znacznie zwiększają wyzwanie:
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
Warunki pogodowe i oceaniczne
Zintegruj swój system wędkowania z pogodą na serwerze, aby stworzyć dynamiczne warunki na oceanie wpływające na rozgrywkę. Spokojna pogoda zapewnia idealne warunki do wędkowania z niską falą i maksymalną dokładnością sonaru. Burze zwiększają wysokość fal, obniżają skuteczność sonaru, z czasem uszkadzają łodzie i sprawiają, że ryby schodzą głębiej, gdzie trudniej je złowić. Wdróż system stanu morza, który płynnie przechodzi między warunkami spokojnymi, umiarkowanymi, wzburzonymi i sztormowymi w zależności od aktualnej pogody. Podczas burz wyświetlaj efekty wizualne, takie jak wyższe fale przy użyciu natywnych modyfikacji poziomu wody, cząsteczki piany morskiej na pokładzie łodzi oraz drżenie ekranu nasilające się wraz z siłą fal. Udostępnij graczom prognozę pogody w marinie, aby mogli planować wyprawy wędkarskie w sprzyjających warunkach, oraz dodaj system ostrzegania przed sztormem, który powiadamia łodzie na morzu o pogarszającej się pogodzie, aby mogły wrócić do portu, zanim warunki staną się niebezpieczne.
Targ rybny i integracja z ekonomią
Stwórz targ rybny w marinie, gdzie gracze sprzedają swoje połowy po cenach zależnych od popytu i podaży. Gdy wielu graczy sprzedaje tuńczyka, jego cena spada. Gdy nikt od dłuższego czasu nie sprzedał miecznika, cena rośnie. Ta dynamiczna wycena zachęca graczy do urozmaicania połowów i polowania na mniej popularne gatunki, gdy rynek jest nasycony. Śledź łączną liczbę sprzedanych ryb danego gatunku w ruchomych oknach czasowych i dostosowuj ceny w skonfigurowanych granicach minimalnych i maksymalnych. Wyświetlaj aktualne ceny rynkowe na tablicy w marinie, aby gracze mogli świadomie decydować, na jakie gatunki się nastawić przed wyruszeniem w rejs. W ramach zaawansowanej integracji pozwól restauracjom na serwerze składać hurtowe zamówienia na określone gatunki ryb po wyższych cenach, tworząc bezpośredni łańcuch dostaw między wędkarzami a właścicielami lokali, co wzbogaca pętlę rozgrywki obu stron.
Wydajność i zarządzanie bytami
Łodzie i środowisko oceaniczne stwarzają wyjątkowe wyzwania wydajnościowe, ponieważ renderowanie wody jest w GTA V wymagające, a dodanie entity łodzi, efektów holu ryb i nakładek sonaru jeszcze bardziej zwiększa obciążenie. Spawnuj entity ryb tylko podczas aktywnego holu i wyłącznie dla walczącego gracza, aby uniknąć tworzenia dziesiątek obiektów ryb widocznych dla wszystkich na serwerze. Efektów cząsteczkowych dla rozbryzgów wody i wskaźników walki używaj oszczędnie, wyłączając je dla odległych obserwatorów za pomocą renderowania opartego na zasięgu. Stan paliwa i schowka łodzi powinien być śledzony po stronie serwera, a klient powinien żądać aktualizacji tylko wtedy, gdy gracz otwiera odpowiedni panel UI, zamiast ciągłej synchronizacji. Gdy gracze dokują łódź w marinie, zdespawnuj entity łodzi i zapisz jej stan w bazie danych, w tym poziom paliwa, wytrzymałość oraz przechowane ryby. Zapobiega to zapełnianiu marin trwałymi entity łodzi, które zużywają zasoby serwera nawet wtedy, gdy ich właściciele są offline. Przetestuj swój system w scenariuszach multiplayer, gdzie wiele łodzi łowi w tej samej strefie jednocześnie, upewniając się, że dane ławic ryb, ekrany sonaru i instancje holu pozostają prawidłowo wyizolowane dla każdego gracza.