نظام صيد الأسماك بالقارب في 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، وإضافة كيانات القوارب، تأثيرات قتال الأسماك، وطبقات السونار يزيد الحمل أكثر. استدعِ كيانات الأسماك فقط أثناء القتال النشط ومرئية فقط للاعب القتال لتجنب إنشاء عشرات من كيانات الأسماك المرئية للجميع على الخادم. استخدم تأثيرات الجسيمات بشكل مقتصد لرشات الماء ومؤشرات القتال، مع تعطيلها للمراقبين البعيدين من خلال العرض القائم على النطاق. يجب تتبع حالة وقود القارب والتخزين على الخادم مع طلب العميل للتحديثات فقط عند فتح اللاعب للوحة واجهة المستخدم ذات الصلة بدلاً من المزامنة المستمرة. عندما يرسو اللاعبون قواربهم في المرسى، قم بإزالة كيان القارب وتخزين حالته في قاعدة البيانات بما في ذلك مستوى الوقود، المتانة، والأسماك المخزنة. هذا يمنع المراسي من الامتلاء بكيانات قوارب دائمة تستهلك موارد الخادم حتى عندما يكون أصحابها غير متصلين. اختبر نظامك في سيناريوهات متعددة اللاعبين حيث يصطاد عدة قوارب في نفس المنطقة في نفس الوقت، مع ضمان بقاء بيانات أسراب الأسماك، عروض السونار، وحالات القتال معزولة بشكل صحيح لكل لاعب.