# EP 2: ตีบวกไอเทม ด้วย Extension Object

จากบทความที่เเล้วเราได้วิธีการสร้าง ไอเทม เเละกระเป๋าไปเรียบร้อยแล้ว หากใครยังไม่มีดาบ ไปสร้างมันมาสะบัดเดียวนี้ [https://onthemoveth.hashnode.dev/ep-1-game-item-with-sui-object](https://onthemoveth.hashnode.dev/ep-1-game-item-with-sui-object)

---

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

**ปัญหาที่ต้องแก้ก่อน**

Sui จะไม่ให้เรา เพิ่ม field ใหม่ ในโครงสร้างของไอเทมเดิมได้ตรงๆ เพราะจะทำให้ object เก่าพัง (layout ไม่ตรง) แต่ไม่ต้องกลัว! เรามีเวทมนตร์ที่ชื่อว่า Dynamic Field 🔮 ที่จะช่วยให้เพิ่มข้อมูลใหม่โดยไม่แตะ object เดิมเลย

พร้อมแล้วไปลุยกันเลย…

**เพิ่มพลังให้ Item ด้วย Extension**

เราจะสร้าง object ลูกชื่อ ItemExtra เพิ่มไปในไฟล์เดิมของเรา items.move โดยใช้ dynamic\_field ของ Sui Framework

```rust
use 0x2::dynamic_field as df;
    public struct ExtraKey has copy, drop, store {}

    public struct ItemExtra has key, store {
        id: UID,
        rarity: u8,
        durability: u64,
        parent: address,
    }

    public fun attach_extra_to_item(
        item: &mut Item,
        rarity: u8,
        durability: u64,
        ctx: &mut TxContext
    ) {
        let extra = ItemExtra {
            id: object::new(ctx),
            rarity,
            durability,
            parent: object::id_address(item),
        };
        df::add(&mut item.id, ExtraKey{}, extra);
    }

    public entry fun set_extra(item: &mut Item, new_rarity: u8, new_durability: u64) {
        let extra_ref = df::borrow_mut<ExtraKey, ItemExtra>(&mut item.id, ExtraKey{});
        extra_ref.rarity = new_rarity;
        extra_ref.durability = new_durability;
    }
```

ทำการอัพเกรด กันก่อนเลยเพื่อทำให้ตัว Object ของเรามีความสามารถเพิ่มเติมด้วยคำสั่งด้านล่างนี้

```bash
sui client upgrade --upgrade-capability $UPGRADE_CAP_ID --gas-budget 100000000
```

โดย `UPGRADE_CAP_ID` คือข้อมูล CAP\_ID จากบทความที่แล้ว ที่เราได้ deploy ขึ้นไปกันนั้นเอง

**เริ่มใช้งาน Extension Object**

ทำการเพิ่มคุณสมบัติเพิ่มเติมให้กับ item ของเราก่อนโดยใช้คำสั่ง

```bash
sui client call --package $PACKAGE_ID --module items --function attach_extra_to_item --args $ITEM_ID 5 1000 --gas-budget 50000000
```

หลังจากนั้นในฐานะ gm ของระบบ เราก็สามารถทำการเเก้ไขคุณสมบัติของ item ได้เต็มที่เลยโดยใช้คำสั่ง

```bash
sui client call --package $PACKAGE_ID --module items --function set_extra --args $ITEM_ID 6 1200 --gas-budget 50000000
```

ซึ่งในที้นี้เราได้ทำการเเก้ไข rarity และ durability เป็น 6, 1200 ตามลำดับนั้นเอง

**Diagram แสดงความสัมพันธ์**

```plaintext
classDiagram
    class Inventory {
        +UID id
        +address owner
    }

    class Item {
        +UID id
        +String name
        +String class
        +u64 power
        +String image_url
    }

    class ItemExtra {
        +UID id
        +u8 rarity
        +u64 durability
        +address parent
    }

    Inventory "1" o-- "many" Item : holds
    Item "1" o-- "1" ItemExtra : dynamic_field
```

จากตรงนี้ เราก็ได้เรียนรู้วิธีการอัพเดดไอเทมเป็นที่เรียบร้อยแล้ว

✅ อัปเกรดแพ็กเกจโดยไม่ทำของเก่าพัง  
✅ เพิ่ม field ใหม่ได้เรื่อย ๆ ผ่าน Extension  
✅ ใช้ Dynamic Field ทำให้ Item ขยายได้ไม่จำกัด

ตอนนี้เราก็มีระบบไอเทมที่ อัปเกรดได้ จริง ๆ แล้ว จะเพิ่มระบบตีบวก คราฟต์ของ หรือแม้แต่ marketplace ก็เริ่มต่อยอดได้เลย!

*By GANG | ContributionDAO*
