ไฟล์ที่ใช้:
db/pre-re/item_group_db.yml — Pre-Renewal
db/re/item_group_db.yml — Renewal
db/import/item_group_db.yml — ไฟล์ import สำหรับเพิ่ม/override กลุ่มของตัวเอง
แนะนำให้เพิ่มกลุ่มใหม่ใน db/import/item_group_db.yml เพื่อไม่ทับไฟล์หลัก — รีสตาร์ท Map Server หลังแก้ไข
โครงสร้าง YAML
Body:
- Group: IG_MyBox
SubGroups:
- Algorithm: Random
List:
- Item: Red_Potion
Rate: 5
- Item: Blue_Potion
Rate: 1
- Algorithm: All
List:
- Item: Apple
Rate: 1
| ฟิลด์ | ความหมาย |
Group | ชื่อกลุ่ม (ใช้ใน Script เช่น IG_MyBox) |
SubGroups | ชุดย่อยภายในกลุ่ม — แต่ละชุดมี Algorithm ของตัวเอง |
Algorithm | วิธีเลือกไอเทม: Random, All หรือ SharedPool |
List | รายการไอเทมใน SubGroup |
Item | ชื่อไอเทม (AegisName จาก item_db) |
Rate | น้ำหนัก (weight) — ไม่ใช่เปอร์เซ็นต์ |
Algorithm
| Algorithm | พฤติกรรม |
Random | สุ่มเลือก 1 ชิ้นจาก List ตาม Rate |
All | ให้ทุกชิ้นใน List |
SharedPool | ใช้ pool ร่วมกัน — เมื่อชิ้นหนึ่งถูกสุ่มออก จะไม่ถูกสุ่มซ้ำจน pool หมด |
| ฟิลด์ | ความหมาย |
RandomOptionGroup | กำหนด Random Option ให้ไอเทมที่ได้ |
RefineMinimum / RefineMaximum | ระดับ refine ขั้นต่ำ/สูงสุดของไอเทมที่ได้ |
Announced | ประกาศทั้งเซิร์ฟเมื่อได้ไอเทมนี้ |
Duration | ระยะเวลาไอเทม (วินาที) สำหรับไอเทมชั่วคราว |
Bound | ผูกมัดไอเทม (Account/Char/Guild ฯลฯ) |
- Item: Excalibur
Rate: 1
RefineMinimum: 7
RefineMaximum: 10
Announced: true
Bound: Account
คำสั่ง Script
| คำสั่ง | การใช้งาน |
getgroupitem(IG_Name); | ให้ไอเทมตาม Algorithm ของทุก SubGroup |
getrandgroupitem(IG_Name); | สุ่ม 1 SubGroup แล้วให้ไอเทมตาม Algorithm ของ SubGroup นั้น |
groupranditem(IG_Name, SubGroupIndex); | สุ่มจาก SubGroup ที่ระบุ index (เริ่ม 0) |
// ตัวอย่างใน NPC Script
mes "เปิดกล่องสุ่ม?";
next;
if (select("เปิด:ยกเลิก") == 2) close;
getgroupitem(IG_MyBox);
mes "ได้รับไอเทมแล้ว!";
close;
สรุป
- สร้างกลุ่มใน
db/import/item_group_db.yml
- กำหนด
Group, SubGroups, Algorithm และ List
- ใช้
Rate เป็นน้ำหนัก — ไม่ใช่เปอร์เซ็นต์
- เรียกใช้ใน Script ด้วย
getgroupitem, getrandgroupitem หรือ groupranditem
- รีสตาร์ท Map Server แล้วทดสอบ