Skip to content

🚀 AFU.Fishing

ข้อมูลสคริปต์

  • Framework: ESX เท่านั้น (ไม่รองรับ QBCore โดยตรง)
  • Dependencies:
    • es_extended (ESX)บังคับ
    • oxmysqlบังคับ (ต้อง start ก่อน AFU.Fishing)
    • AFU.Notify — แนะนำ (ใช้แสดง Notification ทั้งหมด)
    • AFU.SoundInteract — แนะนำ (ใช้เล่นเสียงปลาหยิบเบ็ด)
  • เวอร์ชัน: 2.3.5 · fx_version cerulean · lua54

⚠️ ต้องใช้ License Token

สคริปต์นี้มีระบบตรวจสอบ License ผู้ซื้อต้องมี Token ที่ถูกต้อง และตั้งค่าใน server.cfg ก่อนเสมอ หากไม่มี Token ที่ถูกต้อง Resource จะไม่ทำงาน

ซื้อ Token ได้ที่ awayfromus.store


🛠️ Installation

1. Download & Placement

นำ Resource ทั้งหมดไปวางในโฟลเดอร์ resources/ ของเซิร์ฟเวอร์:

text
resources/
└── [afu]/
    ├── AFU.Fishing/
    ├── AFU.Notify/
    └── AFU.SoundInteract/

แนะนำ

การจัดโฟลเดอร์แบบ [afu] ช่วยให้ ensure ตามลำดับใน folder group ได้ง่าย

2. ตั้งค่า server.cfg

cfg
# License Token (จำเป็น) — ซื้อได้ที่ awayfromus.store
set afu_license "YOUR_TOKEN_HERE"

# ลำดับการ start ที่ถูกต้อง
ensure oxmysql
ensure es_extended
ensure AFU.Notify
ensure AFU.SoundInteract
ensure AFU.Fishing

ลำดับการ Start สำคัญมาก

  • oxmysql และ es_extended ต้อง start ก่อน AFU.Fishing เสมอ มิฉะนั้นสคริปต์จะค้างและไม่เริ่มทำงาน
  • หากไม่ใส่ set afu_license สคริปต์จะไม่ทำงาน

3. เพิ่ม Items ลงฐานข้อมูล

ไม่ต้อง Import SQL จากสคริปต์

AFU.Fishing ไม่มีไฟล์ SQL ให้ import และไม่สร้างตารางเอง — สคริปต์ทำงานผ่าน Config ทั้งหมด แต่คุณต้อง ลงทะเบียน Item ในระบบ Inventory (ESX) ด้วยตัวเอง ให้ครบตามรายการด้านล่าง

เพิ่ม Item ลงตาราง items ของ ESX (ปรับตาม schema ที่เซิร์ฟเวอร์คุณใช้):

sql
INSERT INTO `items` (`name`, `label`, `weight`) VALUES
  ('f_rod', 'เบ็ดตกปลา', 1),
  ('a_f_rod', 'เบ็ดตกปลา (พิเศษ)', 1),
  ('mine_orb', 'เหยื่อ Mine Orb', 0),
  ('bait_lv2', 'เหยื่อ Lv.2', 0);

และเพิ่ม Item ปลาตามที่กำหนดในโซนตกปลาของคุณ (ดูรายชื่อทั้งหมดใน Items Reference)

4. เตรียมภาพไอคอน Item

UI ของสคริปต์ดึงรูปไอคอน Item จาก path ที่ตั้งค่าไว้ใน Settings.inventoryImagePath

lua
Settings.inventoryImagePath = 'nui://inventory/web/assets/icons/'

WARNING

แก้ path นี้ให้ตรงกับโฟลเดอร์ไอคอนของ Inventory ที่คุณใช้จริง และต้องมีไฟล์ <item_name>.png ครบทุก Item ที่เกี่ยวข้อง (รวมถึงชื่อเบ็ด เช่น f_rod.png)

5. Restart เซิร์ฟเวอร์

Restart เซิร์ฟเวอร์ 1 ครั้ง แล้วตรวจสอบ console ว่าไม่มี error และ Blip โซนตกปลาแสดงบนแผนที่


🎮 Usage & Controls

การกระทำวิธีใช้ปรับแก้ได้ที่
เริ่มตกปลาใช้ไอเท็มเบ็ด (f_rod / a_f_rod) ขณะอยู่ในรัศมีโซนตกปลาGears.rod
ยกเลิก / หยุดตกปลาปุ่ม X (Control ID 73)Settings.stopFishingKey
ตะขอปลา (โหมดปกติ)ปุ่ม SPACE หรือคลิกซ้ายเมื่อปลาติดเบ็ด
ตะขอปลา (โหมดปุ่มสุ่ม)กดปุ่มที่สุ่มขึ้นมา เช่น W/A/S/DSettings.minigameKey
เปลี่ยนเหยื่อใน UIปุ่มลูกศร /

🐌 โหมด AFK Fishing

  • โซนที่เปิด afkEnabled = true จะอนุญาตให้ผู้เล่นที่ AFK ตกปลาอัตโนมัติได้
  • Settings.afkSuccessAllTime = true → ติดตั้งได้ 100% ทุกครั้งในโหมด AFK / false → สุ่ม 50/50
  • รอบการหยิบเบ็ดของปลา (วินาที) ปรับได้ที่ Settings.randomFishTimer.afk / .nonAfk

🍞 Auto-Fishing ทุกโซน

หากผู้เล่นถือ Item ใดๆ ที่อยู่ใน Settings.autoItems (ค่าเริ่มต้น: bread, water, sandwich) จะบังคับใช้โหมดตกปลาอัตโนมัติ ในทุกโซน แม้โซนนั้นปิด afkEnabled

💡 ตัวอย่างการปรับแต่ง
lua
-- ให้ Item "coffee" เป็นตัวเปิดโหมดอัตโนมัติ
Settings.autoItems = { 'coffee' }

⚙️ Configuration

โครงสร้างไฟล์ Config

ไฟล์หน้าที่
Config/settings.config.luaตั้งค่าหลักของระบบ (minigame, key, timer, UI)
Config/gears.config.luaลงทะเบียนเบ็ด (rod) และเหยื่อ (bait)
Config/Zones/*.luaกำหนดโซนตกปลา, Blip, ช่วงเวลา, รายชื่อปลา
Config/events.config.luaชื่อ Event ของ Framework ที่สคริปต์ฟังอยู่
Config/notifications.config.luaแก้ไขข้อความ/ภาพ/ประเภทของ Notification
Config/client.functions.luaHook ฝั่ง Client (เงื่อนไขเริ่มตกปลา, เอฟเฟกต์)
Config/server.functions.luaHook ฝั่ง Server (จุดใส่รางวัล)
Config/suspects.config.luaHook สำหรับฝังระบบลงโทษผู้ทุจริต

📄 settings.config.lua

ตัวแปรTypeDefaultคำอธิบาย
Settings.debugModebooleanfalseเปิดโหมด Debug แสดงเส้น/วงกลมตรวจสอบพื้นที่น้ำ
Settings.debugRatebooleanfalseแสดง % ความสำเร็จของการสุ่มปลา (Debug)
Settings.debugTimeFishingbooleanfalseแสดงเวลาตกปลา (Debug)
Settings.afkSuccessAllTimebooleantruetrue = โหมด AFK ติด 100% / false = สุ่ม 50/50
Settings.stopFishingWhenSomeFishFullbooleantrueหยุดตกปลาอัตโนมัติเมื่อปลาชนิดใดถึง Limit ของ Inventory
Settings.stopFishingKeynumber73Control ID ปุ่มหยุดตกปลา (73 = X)
Settings.minigameSpinnerThresholdnumber4.0ความเร็ว/ความยากของ Spinner Minigame — ค่าต่ำสุดที่ใช้ได้คือ 4.0 (ต่ำกว่านี้ระบบจะปรับกลับเป็น 4.0 เสมอ), มากกว่า 6.0 ขึ้นไป = ยากมาก
Settings.stopWhenNotHaveBaitbooleantruetrue = หยุดตกปลาทันทีเมื่อเหยื่อหมด / false = ตาปลาได้แต่ปลาไม่กินเหยื่อ
Settings.inventoryImagePathstring'nui://inventory/web/assets/icons/'Path รูปไอคอน Item ที่แสดงใน UI
Settings.fontNamestring'Kanit'ชื่อ Font ที่ใช้ (เช่น บน Label ของ Blip)
Settings.autoItemsstring[]{ "bread", "water", "sandwich" }Item ที่ถือแล้วบังคับโหมดตกปลาอัตโนมัติทุกโซน
Settings.randomFishTimer.afk.min / .maxnumber (วินาที)1 / 2ช่วงเวลารอปลาหยิบเบ็ด (โหมด AFK)
Settings.randomFishTimer.nonAfk.min / .maxnumber (วินาที)3 / 4ช่วงเวลารอปลาหยิบเบ็ด (โหมดปกติ)

🎯 ตั้งค่า Minigame Key (ปุ่มสุ่ม)

ตัวแปรTypeDefaultคำอธิบาย
Settings.minigameKey.useFeatureKeybooleanfalsetrue = Minigame สุ่มปุ่ม / false = ใช้ SPACE เท่านั้น
Settings.minigameKey.keyListstring[]{ "W", "A", "S", "D" }รายชื่อปุ่มที่สุ่มได้ (เพิ่มปุ่มอื่นได้ตามต้องการ)

อย่าลืมปิด Debug ก่อนขึ้น Production

ตั้ง debugMode, debugRate, debugTimeFishing เป็น false ทั้งหมดในเซิร์ฟเวอร์จริง เพราะโหมด Debug จะเปิดเผยข้อมูลการสุ่มปลาให้ผู้เล่นเห็น


🎣 gears.config.lua — เบ็ดและเหยื่อ

Schema: Gears.rod

FieldTypeคำอธิบาย
namestringชื่อ Item เบ็ดใน Inventory (ต้องลงทะเบียนเป็น Usable Item — สคริปต์ทำให้อัตโนมัติ)
modelhashProp ของ GTA ที่แสดงตอนกำลังตกปลา เช่n `prop_fishing_rod_01`
percentnumber% โบนัสโอกาสติดปลาหายาก

Schema: Gears.bait

FieldTypeคำอธิบาย
namestringชื่อ Item เหยื่อใน Inventory (จะถูกใช้ 1 ชิ้นต่อการรอบหนึ่ง)
percentnumber% โบนัสโอกาสติดปลาหายาก
lua
-- ค่าเริ่มต้นในไฟล์
Gears.rod = {
    { name = 'f_rod',   model = `prop_fishing_rod_01`, percent = 50 },
    { name = 'a_f_rod', model = `prop_fishing_rod_01`, percent = 50 },
}

Gears.bait = {
    { name = 'mine_orb', percent = 50 },
    { name = 'bait_lv2', percent = 50 },
}

การ Stack โบนัส

โบนัสของ เบ็ด + เหยื่อ รวมกันแบบบวก เช่น เบ็ด percent = 20 + เหยื่อ percent = 30 = โบนัสรวม 50% ต่อโอกาสติดปลาหายาก

WARNING

ทุก name ที่เพิ่มเข้ามาต้องมี Item จริงในฐานข้อมูล Inventory และมีไอคอน <name>.png ใน inventoryImagePath ด้วย


🗺️ Zones — โซนตกปลา (Config/Zones/*.lua)

ทุกไฟล์ใน Config/Zones/ จะถูกโหลดอัตโนมัติ เพิ่มโซนใหม่ได้โดยสร้างไฟล์ใหม่แล้วปิดท้ายด้วย table.insert(Zones, fishingZone)

Schema

FieldTypeคำอธิบาย
namestringชื่อโซน (แสดงบน Blip)
coordvector3พิกัดจุดกึ่งกลางโซน
distancenumberรัศมีโซน (เมตร) นับจากจุดกึ่งกลาง
requireRodstring[](ไม่บังคับ) ชื่อเบ็ดที่ใช้ได้ในโซนนี้ — ถ้าไม่ใส่ = ใช้ได้ทุกเบ็ด
afkEnabledbooleanเปิดให้ตกปลาแบบ AFK ในโซนนี้
blip.spritenumberรูปแบบ Blip (ดูรายการ)
blip.scalenumberขนาด Blip
blip.colornumberสี Blip (ดูรายการ)
blip.radColornumberสีวงกลมรอบโซน (0 = ปิด)
schedule[].time.start / .stopstring 'HH:MM'ช่วงเวลาที่โซนเปิดให้ตก
schedule[].fishes[].namestringชื่อ Item ปลาที่ตกได้ในช่วงเวลานี้
schedule[].fishes[].ratenumberน้ำหนักโอกาสติด (ไม่จำเป็นต้องรวมเท่า 100)

schedule ใช้ "เวลาจริง" ของเซิร์ฟเวอร์

ช่วงเวลา start / stop อ้างอิง เวลาจริงตามนาฬิกาของเครื่อง Server (sync ทุก ~5 วินาที) ไม่ใช่เวลาในเกม GTA — เช่น 02:32–04:33 คือตีสองสามสิบสองถึงตีสี่สามสิบสามตามเวลาจริง

ตัวอย่างโซนเต็มรูปแบบ

lua
local fishingZone = {
    name = 'Pattaya',
    coord = vector3(-1453.8812, 2054.9783, 53.6622),
    requireRod = {              -- เบ็ดที่ใช้ได้ในโซนนี้ (ไม่ใส่ = ทุกเบ็ด)
        "a_f_rod"
    },
    distance = 200,             -- รัศมี 200 เมตร
    afkEnabled = false,
    blip = {
        sprite = 68,
        scale = 0.8,
        color = 77,
        radColor = 0
    },
    schedule = {
        {
            time = {
                start = '00:00',
                stop = '23:59'
            },
            fishes = {
                { name = 'salmon_fish',   rate = 25 },  -- ตัวอย่าง: แทนที่ด้วย
                { name = 'blue_fin_fish', rate = 220 }, -- ปลาของเซิร์ฟเวอร์คุณ
            }
        },
    }
}

table.insert(Zones, fishingZone)

แก้ไขโซนตัวอย่างก่อนใช้งาน

โซน Pattaya ที่ให้มาเป็น Demo Data — รายการ fishes ยังอ้างถึง mine_orb (ซึ่งเป็น Item เหยื่อ) ซ้ำ 2 รายการ คุณต้องแทนที่เป็นชื่อ Item ปลา ของเซิร์ฟเวอร์คุณเอง และปรับพิกัด/รัศมีให้เหมาะสม

ไฟล์ Config/Zones/special.config.lua เป็นเทมเพลตโซนแบบ Multi-Time Window (ปลาเปลี่ยนตามช่วงเวลา) — คัดลอกมาแก้ไขและเปิดคอมเมนต์ table.insert ได้

🌙 โซนแบบหลายช่วงเวลา (ปลาเปลี่ยนตามเวลา)
lua
schedule = {
    {
        time = { start = '02:32', stop = '04:33' },   -- เวลาจริง
        fishes = {
            { name = 'blue_fish',     rate = 25 },
            { name = 'wahoo_fish',    rate = 25 },
            { name = 'salmon_fish',   rate = 10 },
            { name = 'blue_fin_fish', rate = 10 },
            { name = 'roza',          rate = 5  },
        }
    },
    {
        time = { start = '18:00', stop = '22:00' },
        fishes = {
            { name = 'wahoo_fish', rate = 100 },      -- 100% ในช่วงนี้
        }
    },
}

📡 events.config.lua — Event ของ Framework

สคริปต์ฟัง Event ภายนอก 2 ตัว ซึ่งปรับชื่อได้ตาม Framework ของคุณ:

ตัวแปรDefaultคำอธิบาย
HandlerEvents.addInventoryItem'esx:addInventoryItem'เมื่อผู้เล่นได้รับ Item (ถ้าเป็นเหยื่อ UI จะรีเฟรชรายการเหยื่อให้อัตโนมัติ)
HandlerEvents.onDead'esx:onPlayerDeath'ยกเลิกการตกปลาทันทีเมื่อผู้เล่นตาย

TIP

หากคุณใช้ ESX Legacy มาตรฐาน ไม่ต้องแก้อะไรในไฟล์นี้ — แก้เฉพาะเมื่อปรับสคริปต์ไปใช้กับ Framework อื่น


🔔 notifications.config.lua — ข้อความแจ้งเตือน

Notification ทั้งหมดส่งผ่าน resource AFU.Notify — แก้ข้อความ/ภาพ/ประเภทได้ที่ฟังก์ชันในไฟล์นี้:

ฟังก์ชันสถานการณ์
Notify.RequireRod(...)ใช้เบ็ดที่โซนนี้ไม่อนุญาต
Notify.stopError()มีบางอย่างขัดขวางการตกปลา
Notify.noBait()เหยื่อหมด
Notify.tooFarFromWater()อยู่ห่างจากน้ำเกินไป
Notify.stopFishing()หยุดตกปลาสำเร็จ
Notify.dead()ตกปลาถูกยกเลิกเพราะผู้เล่นเสียชีวิต
Notify.timesUp()หมดเวลาโซนตกปลา
Notify.newFishesComes()รายชื่อปลาในโซนเปลี่ยนตามช่วงเวลา
Notify.fullInventory()Inventory เต็ม รับ Item ไม่ได้

ตัวเลือกต่อการแจ้งเตือนแต่ละครั้ง: title, description, image (ไฟล์ .png), type ('success' / 'warning' / 'alert'), position, time (ms, default 5000)

WARNING

ข้อความเริ่มต้นทั้งหมดเป็นภาษาไทย — แก้ไขได้อิสระ แต่ควรคง pcall ที่ครอบการเรียก AFU.Notify เอาไว้ เพื่อไม่ให้สคริปต์ crash หากยังไม่ได้ติดตั้ง AFU.Notify


🧩 Hooks ที่ผู้ใช้แก้ไขได้

Config/server.functions.lua (ฝั่ง Server — จุดใส่รางวัล)

HookParametersคำอธิบาย
Functions.caughtFish(xPlayer, zoneName, usingRodName, usingBaitName, fishName)ESX Player Object, ชื่อโซน, เบ็ด, เหยื่อ, ชื่อปลาHook หลัก — ถูกเรียกเมื่อผู้เล่นติดปลา ปลาจะเข้า Inventory ให้อัตโนมัติแล้ว ใช้ Hook นี้เพิ่มรางวัลอื่น เช่น เงิน, XP, Quest Progress
Functions.failedCatch(usingBaitName)ชื่อเหยื่อที่ใช้เรียกเมื่อผู้เล่นพลาดการตะขอ
Functions.canCarryItem(xPlayer, name, total)Player Object, ชื่อ Item, จำนวนเช็คว่ารับ Item เพิ่มได้ไหม — ค่าเริ่มต้นใช้ระบบ Limit ของ ESX (มีตัวอย่างระบบ Weight ให้เปิดใช้ในคอมเมนต์)
💡 ตัวอย่าง: ให้เงินรางวัลเมื่อติดปลา
lua
-- Config/server.functions.lua
Functions.caughtFish = function(xPlayer, zoneName, usingRodName, usingBaitName, fishName)
    -- ปลาเข้า inventory ให้อัตโนมัติแล้ว — เพิ่มรางวัลอื่นตรงนี้
    if zoneName == 'Pattaya' then
        xPlayer.addMoney(50) -- โบนัส $50 เฉพาะโซน Pattaya
    end
end

Config/client.functions.lua (ฝั่ง Client)

Hookคำอธิบาย
Functions.willStartFishing(zoneName)เงื่อนไขเริ่มตกปลา — return false เพื่อบล็อก (เช่น เช็ค Job/Item/Level)
Functions.startedFishing(zoneName)เรียกเมื่อเริ่มตกปลา (ว่างไว้ให้เติม Logic เอง)
Functions.stopFishing(zoneName)เรียกเมื่อหยุดตกปลา (ว่างไว้ให้เติม Logic เอง)
Functions.fishAppear(position)เรียกเมื่อปลาหยิบเบ็ด (default: เล่นเสียง pop.mp3 ผ่าน AFU.SoundInteract)
Functions.caughtFish() / Functions.failedCatch()จุดใส่ เอฟเฟกต์/เสียงฝั่ง Client เท่านั้น

ห้ามให้รางวัลใน client.functions.lua!

caughtFish() / failedCatch() ในไฟล์ Client มีไว้สำหรับเอฟเฟกต์และเสียงเท่านั้น การให้ไอเท็ม/เงินที่นี่คือ ช่องโหว่ถูก Exploit — ให้รางวัลที่ server.functions.lua เท่านั้น

💡 ตัวอย่าง: จำกัดโซนตามอาชีพ
lua
-- Config/client.functions.lua
Functions.willStartFishing = function(zoneName)
    local ESX = Functions.loadFramework()
    local playerData = ESX.GetPlayerData()
    if zoneName == 'Pattaya' and playerData.job.name ~= 'fisherman' then
        return false -- บล็อกคนที่ไม่ใช่ fisherman
    end
    return true
end

Config/suspects.config.lua — Hook ลงโทษผู้ทุจริต

สคริปต์มีระบบตรวจจับพฤติกรรมผิดปกติฝั่ง Server และเปิด Hook ให้เจ้าของเซิร์ฟเวอร์เลือกบทลงโทษเอง (ค่าเริ่มต้นว่างไว้):

Hookเหตุการณ์
Suspects.obviousCatchFish(playerId, xPlayer)ตรวจพบการตกปลาผิดปกติ
Suspects.invalidData(playerId, xPlayer)ส่งข้อมูลไม่ถูกต้อง
Suspects.spamEvent(playerId, xPlayer)ยิง Event ถี่ผิดปกติ
Suspects.speedCheating(playerId, xPlayer)ตรวจพบ Speed Hack

INFO

คุณสามารถเติม Logic เอง เช่น DropPlayer, TriggerEvent('ban', ...) ตามระบบ Ban ของเซิร์ฟเวอร์คุณ


🐟 Items Reference

Item ทั้งหมดที่สคริปต์อ้างอิง — ต้องลงทะเบียนใน Inventory + เตรียมไอคอน:

ประเภทSpawn Nameที่มา
🔫 เบ็ด (Usable)f_rodgears.config.lua
🔫 เบ็ด (Usable)a_f_rodgears.config.lua
🪱 เหยื่อmine_orbgears.config.lua
🪱 เหยื่อbait_lv2gears.config.lua
🍞 Trigger Auto-Fishbread, water, sandwichsettings.config.lua
🐟 ปลา (Demo)mine_orbโซน Pattaya (ควรแทนที่)
🐟 ปลา (Template)blue_fish, wahoo_fish, kahoo_fish, salmon_fish, blue_fin_fish, rozaspecial.config.lua

::: note

  • เบ็ดทุกตัวใน Gears.rod จะถูกลงทะเบียนเป็น Usable Item อัตโนมัติ — ผู้เล่นใช้เบ็ดจาก Inventory เพื่อเริ่มตกปลา
  • ปลาที่ตกได้จะถูกจำกัดจำนวนตามระบบ Limit ของ Item ใน ESX (stopFishingWhenSomeFishFull)
  • ไม่มีการเช็ค Job/Gang ในตัวสคริปต์ — ใช้ Hook willStartFishing หากต้องการจำกัดอาชีพ :::

❓ Troubleshooting

🔴 Resource ไม่ทำงาน / ค้างตั้งแต่เปิดเซิร์ฟเวอร์
  • ตรวจสอบว่า set afu_license "TOKEN" อยู่ใน server.cfg ก่อนบรรทัด ensure AFU.Fishing และ Token ยังไม่หมดอายุ
  • ตรวจสอบว่า oxmysql และ es_extended start ก่อน AFU.Fishing
  • ตรวจสอบว่า ESX ทำงานปกติ (สคริปต์รอ ESX ตลอดหากหาไม่เจอ)
🔴 กดใช้เบ็ดแล้วไม่มีอะไรเกิดขึ้น
  • ผู้เล่นต้องอยู่ใน รัศมีโซนตกปลา และอยู่ใกล้น้ำ
  • โซนอาจกำหนด requireRod — เช่น โซน Demo Pattaya รับเฉพาะ a_f_rod (จะมี Notification แจ้งเตือน)
  • ตรวจสอบว่าชื่อเบ็ดใน Gears.rod ตรงกับชื่อ Item ในฐานข้อมูลจริง (case-sensitive)
🔴 ปลาไม่ยอมกินเหยื่อ / ไม่เริ่มรอบใหม่
  • เหยื่อหมด — ตรวจสอบ Inventory (หรือเปลี่ยน stopWhenNotHaveBait = false เพื่อโหมด Realism)
  • อยู่นอกช่วงเวลา schedule ของโซน — จำไว้ว่า schedule ใช้ เวลาจริงของเซิร์ฟเวอร์
  • Inventory เต็ม หรือปลาบางชนิดถึง Limit แล้ว (stopFishingWhenSomeFishFull)
🔴 Minigame ยาก/ง่ายเกินไป
  • Settings.minigameSpinnerThreshold — ค่ามากขึ้น = ยากขึ้น (ค่าต่ำสุด 4.0, >6.0 = ยากมาก)
  • ต้องการปุ่มสุ่ม: Settings.minigameKey.useFeatureKey = true และแก้ keyList
🔴 รูปไอคอนใน UI ไม่แสดง
  • แก้ Settings.inventoryImagePath ให้ตรงกับโฟลเดอร์ไอคอนของ Inventory ที่ใช้
  • ตรวจสอบว่ามีไฟล์ <item_name>.png ครบทุก Item (รวมชื่อเบ็ด เช่น f_rod.png)
🔴 ไม่มีเสียงปลาหยิบเบ็ด / ไม่มี Notification
  • ติดตั้ง AFU.SoundInteract (เสียง) และ AFU.Notify (แจ้งเตือน) แล้ว ensure ก่อน AFU.Fishing
  • สคริปต์จะยังทำงานได้แม้ไม่มีทั้งสองตัว (มี guard ไว้) แต่ประสบการณ์จะไม่ครบ
🔴 เห็นเส้น/วงกลมแปลกๆ บนจอ
  • เปิด Settings.debugMode = true ค้างไว้ — ปิดเป็น false ก่อนขึ้น Production
🟡 ปรับ Framework เป็น QBCore ได้ไหม?

สคริปต์ถูกออกแบบมาสำหรับ ESX โดยตรง การพอร์ตต้องแก้จุดเชื่อมต่อเหล่านี้เอง:

  1. Functions.loadFramework() (client + server) — เปลี่ยนเป็น QBCore Object
  2. Functions.getInventory() / getInventoryItem() / getItemLabel() — โครงสร้าง Inventory ต่างกัน
  3. Functions.canCarryItem() — เปลี่ยนเป็น weight-based ของ QBCore
  4. HandlerEvents.addInventoryItem / onDead — เปลี่ยนเป็นชื่อ Event ของ QBCore