เอกสาร

X3D Daily Login (เช็คอินรายวัน)

เช็คอินรายวัน สตรีค + ตารางรางวัลแก้เองได้ทั้งหมด ฟรี ไม่ต้องลงฐานข้อมูล กระเป๋าเต็มไม่เสียของ ต่อกับเฟรมเวิร์กไหนก็ได้

ซื้อ / รับฟรีตั้งค่า config

การติดตั้ง

  1. แตกไฟล์แล้ว เปลี่ยนชื่อโฟลเดอร์เป็น x3d_dailylogin (สคริปต์อื่นเรียก export ด้วยชื่อนี้)
  2. วางใน resources/
  3. เพิ่มใน server.cfg:
ensure x3d_dailylogin

ไม่ต้องใช้ฐานข้อมูล ไม่มีไลเซนส์ · ทำงานกับ ESX ได้ทันที และทำงานแบบ standalone ได้ถ้าไม่มีเฟรมเวิร์ก (QBCore ต้องต่อ adapter เองก่อน)

เปิดหน้าต่างด้วย F6 หรือพิมพ์ /dailylogin — หรือปล่อยให้เปิดเอง (Config.AutoOpen = true ค่าเริ่มต้น) ตอนมีอะไรให้กด

ตัวเลือกเปิดหน้าต่างอัตโนมัติใน config.lua:

  • Config.AutoOpen = 'always' — เปิดครั้งเดียวต่อการเชื่อมต่อ (หลัง Config.AutoDelay) ไม่เปิดซ้ำทุกครั้งที่เกิดใหม่
  • Config.AutoDelay — เวลาหน่วงก่อนเปิด
  • Config.AutoNotify — แจ้งรางวัลที่รับอัตโนมัติทุกชิ้น (ชื่อรางวัล + แทร็กและวันที่)

ตารางรางวัล

แก้ที่ config.lua — จะกี่วันก็ได้ ใส่ items/money/weapon/token ผสมกันได้

Config.Rewards = {
    [1] = { money = { { account = 'money', amount = 500 } } },
    [2] = { items = { { item = 'bread', count = 2 } } },
    [3] = { weapon = { { name = 'WEAPON_PISTOL', ammo = 30 } } },
    [7] = { money = { { account = 'bank', amount = 5000 } }, label = 'รางวัลครบสัปดาห์' },
}

Config.LoopRewards = true   -- ครบตารางแล้ววนกลับไปรับของวันแรกอีกครั้ง (key ไม่ต้องเรียงติดกันก็ได้ — ตัวอย่างนี้มีแค่ 3 วัน วันที่ 7 จะมาถึงตอนกดรับครั้งที่ 3)
Config.ResetOnMiss = true   -- ขาดวันแล้วสตรีคกลับไปเริ่มที่ 1
Config.AutoClaim   = false  -- true = รับให้อัตโนมัติตอนเข้าเกม

อยากมีหลายชุดพร้อมกัน (ปฏิทินปกติ + กิจกรรมเปิดตัวจำกัดเวลา) ตั้ง Config.Tracks — แต่ละแทร็กมีสตรีค/รางวัลค้างรับเป็นของตัวเอง มี from/to (unix) กำหนดช่วงเวลาเปิดได้ ไม่ตั้งเลย = ทำงานแทร็กเดียวเหมือนเดิม

  • loop แยกต่อแทร็กใน Config.Tracks (ไม่ตั้ง = ใช้ Config.LoopRewards): ตั้ง loop = false ได้แทร็กแบบครั้งเดียว เช่นปฏิทิน 31 วันของผู้เล่นใหม่ที่จบหลังวันสุดท้าย
  • Config.TokenLabels — ชื่อที่อ่านง่ายสำหรับรางวัลโทเคน
  • Config.Mailbox + Reward.ToMailbox — ส่งไอเทม/เงินของรางวัลนั้นเข้ากล่องจดหมาย (ค่าเริ่มต้นคือตู้นิรภัยของ x3d_mailbox) แทนใส่กระเป๋า
  • ถ้าใช้ X3D Admin Panel: ที่แก้ในแผงเก็บไว้ใน storage key __admin และทับ Config.Rewards / Config.Tracks / Config.PlaytimeBonusHours ตอนเริ่มเซิร์ฟ — config ใช้เป็นค่าตั้งต้นครั้งแรกเท่านั้น ส่วน Daily.Rebuild() สร้างตารางรางวัลใหม่จาก Config ตอนรันไทม์

โบนัสเวลาเล่น

เล่นครบ N ชั่วโมงในวันนี้ปลดล็อกรางวัลอีกชุดให้กดเอง (แยกจากปฏิทิน, นับต่อได้ข้าม reconnect):

Config.PlaytimeBonusHours = {
    [2] = { money = { { account = 'money', amount = 300 } } },
    [5] = { money = { { account = 'bank', amount = 800 } } },
}

ว่างเปล่า = ปิดฟีเจอร์นี้ ไม่โชว์ในหน้าต่างเลย

Config.PlaytimeMode = 'extra_day' — แต่ละระดับของโบนัสเวลาเล่นจะรับวันถัดไปของทุกแทร็กที่เปิดอยู่พร้อมกัน แทนที่จะเป็นรางวัลแยก

เส้นแบ่งวัน

Config.TimezoneOffset = 7 * 3600   -- ไทย GMT+7

คิดจากเวลาเซิร์ฟเวอร์ ไม่ใช่เวลาเครื่องผู้เล่น — ผู้เล่นหมุนนาฬิกาเครื่องตัวเองไม่ช่วยอะไร

รับย้อนหลัง (ปิดไว้เป็นค่าเริ่มต้น)

ขาดไปหลายวันแล้วอยากให้ตามเก็บรางวัลวันที่พลาดได้ เปิดใน config.lua:

Config.BackClaim = {
    enabled = true,
    maxDays = 3,     -- ตามเก็บย้อนหลังได้ไกลสุด 3 วัน
}
สถานการณ์ ปิด (ค่าเริ่มต้น) เปิด maxDays = 3
ขาด 3 วันแล้วกลับมา กด 1 ครั้ง ได้รางวัลของวันนี้ วันที่ขาดหายไปเลย กดได้ 4 ครั้ง ไล่เก็บวันที่ขาดทีละวันจนถึงวันนี้
ขาด 9 วันแล้วกลับมา เหมือนเดิม กดครั้งเดียว ตามเก็บได้แค่ 3 วันหลังสุด + วันนี้
ผู้เล่นใหม่ที่เพิ่งกดครั้งแรก เริ่มวันนี้ เริ่มวันนี้เหมือนกัน ไม่แจกวันย้อนหลังที่ไม่เคยเล่น

ตามเก็บทีละวันแปลว่า สตรีคไม่ขาด เพราะวันถูกตัดต่อเนื่องกัน · หน้าต่างจะบอกว่าเหลือให้ตามเก็บอีกกี่วัน

กระเป๋าเต็มตอนกดรับ

รางวัลไม่หาย และไม่เสียวัน — ระบบเก็บไว้เป็น รางวัลค้างรับ ของผู้เล่นคนนั้น ไปกดรับทีหลังตอนมีที่ว่างได้จากหน้าต่างเดิม

ค่า ผลลัพธ์
Config.HoldWhenFull = true (ค่าเริ่มต้น) เก็บเป็นรางวัลค้างรับ ตัดวันตามปกติ สตรีคเดินต่อ
Config.HoldWhenFull = false ไม่ตัดวัน ผู้เล่นเคลียร์กระเป๋าแล้วมากดใหม่
Config.MaxPending เก็บค้างได้สูงสุดกี่ชุดต่อคน (ค่าเริ่มต้น 10) ถึงเพดานแล้วจะไม่ตัดวันให้

รางวัลค้างรับเก็บอยู่ในตัว x3d_dailylogin เอง ไม่ยุ่งกับกล่องจดหมาย (กล่องจดหมายเป็นของทีมงานและโค้ดรับของ)

exports['x3d_dailylogin']:GetPending(src)            --> รายการค้างรับ
exports['x3d_dailylogin']:ClaimPending(src, 1)       --> ok, reason

AddEventHandler('x3d_dailylogin:onPending', function(src, entry, ok, trackId) end)

เซิร์ฟที่ใช้ inventory ของตัวเอง

ค่า ใช้ทำอะไร
Config.CanCarryExport export ของ inventory จริงที่ใช้เช็กว่ากระเป๋ารับไหว — ขึ้น "กระเป๋าเต็ม" ทั้งที่ยังว่าง ให้ตั้งค่านี้ (ตัวเลขน้ำหนักของ ESX จะเพี้ยนเมื่อ inventory อื่นเป็นคนคุม)
Config.ItemImage path รูปไอเทมของ inventory ที่ใช้ ({item} = ชื่อไอเทม), ว่าง = ไม่โชว์รูป
Config.ItemLabels / Config.AccountLabels ชื่อไทยของไอเทมและบัญชีเงิน

ตัวอย่างที่เตรียมไว้ให้แล้วใน config.lua: x3d_inventory, ox_inventory, qb-inventory

เรียกจาก resource อื่น

exports['x3d_dailylogin']:GetStreak(src, trackId)   --> number — trackId ไม่ใส่ = 'default'
exports['x3d_dailylogin']:CanClaim(src, trackId)    --> true / false
exports['x3d_dailylogin']:Claim(src, trackId)       --> ok, reason
exports['x3d_dailylogin']:ClaimPlaytime(src, hours) --> ok, reason

AddEventHandler('x3d_dailylogin:onClaim', function(src, streak, reward, ok, trackId)
    -- ok = false แปลว่าจ่ายได้ไม่ครบ (บางชิ้นไม่เข้า) — จดหมายเหตุไว้เช็กได้ (listener เก่าที่ไม่รับ trackId ยังใช้ได้ปกติ)
    print(('ผู้เล่น %s รับรางวัลวันที่ %d ของแทร็ก %s (ครบ: %s)'):format(src, streak, trackId, tostring(ok)))
end)

คำสั่งแอดมิน

/dailyreset <server id> — ล้างสตรีค วันล่าสุด และรางวัลค้างรับทั้งหมดของผู้เล่นคนนั้นทิ้ง ใช้ตอนต้องแก้ปัญหาให้ผู้เล่น ไม่ใช่ของเล่น เรียกจากคอนโซลได้เสมอ เรียกจากผู้เล่นในเกมต้องมี ace Config.AdminAce (ค่าเริ่มต้น x3d_dailylogin.admin) คำสั่งส่งข้อมูลที่ล้างแล้วไปอัปเดตหน้าจอเป้าหมายเฉย ๆ ไม่แย่งโฟกัส — ปฏิทินจะโชว์ข้อมูลใหม่ก็ต่อเมื่อผู้เล่นคนนั้นเปิดหน้าต่างอยู่ก่อนแล้วเท่านั้น ไม่ได้เปิดปฏิทินขึ้นมาให้เอง

เก็บข้อมูลด้วย oxmysql แทนไฟล์ JSON

ค่าเริ่มต้นเก็บใน data/dailylogin.json ไม่ต้องใช้ฐานข้อมูลเลย · อยากใช้ฐานข้อมูล: เปิด addons/storage/server.lua คัดลอกบล็อก oxmysql ท้ายไฟล์ทับสี่ฟังก์ชันด้านบน แล้วรัน install.sql

การเซฟ: ทุก 30 วินาที (Config.Storage.FlushSeconds), ตอนผู้เล่นออก และตอนปิด resource แบบปกติ · เซิร์ฟดับกะทันหันจะเสียได้มากที่สุดแค่ช่วงที่ยังไม่ได้เซฟ

ช่วยเหลือ

Discord: discord.gg/x3d-developer · เว็บ: x3d-developer.com

ดูหน้าสินค้า