X3D Daily Login (เช็คอินรายวัน)
เช็คอินรายวัน สตรีค + ตารางรางวัลแก้เองได้ทั้งหมด ฟรี ไม่ต้องลงฐานข้อมูล กระเป๋าเต็มไม่เสียของ ต่อกับเฟรมเวิร์กไหนก็ได้
ซื้อ / รับฟรีตั้งค่า configการติดตั้ง
- แตกไฟล์แล้ว เปลี่ยนชื่อโฟลเดอร์เป็น
x3d_dailylogin(สคริปต์อื่นเรียก export ด้วยชื่อนี้) - วางใน
resources/ - เพิ่มใน
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