บทนำเกี่ยวกับ
Features

เติมเต็มโลก Minecraft ของคุณด้วยของตกแต่งและรายละเอียดทางธรรมชาติ

Feature คือของตกแต่งที่ถูกสุ่มกระจายอยู่ทั่วโลกครับ สิ่งต่างๆ เช่น ต้นไม้, พืชพรรณ, ดอกไม้, แหล่งน้ำพุ, แร่ (Ore), และปะการัง ล้วนถูกจัดว่าเป็น Feature ทั้งหมด

โดยพื้นฐานแล้วหลักการจำง่ายๆ ก็คือ: ถ้าสิ่งนั้นไม่ใช่ภูมิประเทศ (Terrain) หรือ Entity สิ่งนั้นก็มักจะเป็น Feature ครับ


โครงสร้างของ Feature

Feature สามารถอยู่แบบเดี่ยวๆ (Standalone) หรือประกอบขึ้นจาก Feature ย่อย (Sub-features) หลายอันรวมกันก็ได้ครับ

ในทางปฏิบัติ Feature ส่วนใหญ่ใน Minecraft จะถูกกำหนดและสร้างขึ้นมาเป็น "สายโซ่" (Chain) ของ Feature ตั้งแต่สองอันขึ้นไปเชื่อมต่อกัน สายโซ่เหล่านี้มักจะไปจบลงที่ Feature ตัวสุดท้ายซึ่งทำหน้าที่ วาง Block ลงในโลก ครับ

การควบคุมลำดับการทำงาน

Feature ประเภทอื่นๆ จะถูกนำมาใช้เพื่อควบคุมกระแสการทำงานของสายโซ่ครับ ตัวอย่างเช่น:


รูปแบบ JSON

Feature ทั้งหมดต้องระบุเวอร์ชันผ่านฟิลด์ "format_version" เสมอครับ ข้อมูลส่วนที่เหลือจะถูกเก็บไว้ใน Objects ย่อยที่เป็นอิสระต่อกัน สำหรับแต่ละประเภท Feature (Feature type) ที่เกมรองรับ

ประเภท Feature เหล่านี้จะทำหน้าที่กำหนด Behavior ของ Feature นั้นๆ และประกอบด้วยคุณสมบัติ (Properties) ที่เฉพาะเจาะจงสำหรับพฤติกรรมนั้น และเพื่อให้ไฟล์ทำงานได้ถูกต้อง การกำหนดค่าจะต้องประกอบด้วย Objects ประเภทเหล่านี้ เพียงหนึ่งอันเท่านั้น ครับ (เช่น ในหนึ่งไฟล์ ต้องเลือกใช้ minecraft:scatter_feature หรือ minecraft:ore_feature อย่างใดอย่างหนึ่งเท่านั้น)

ตัวอย่าง

นี่คือตัวอย่างการใช้ minecraft:scatter_feature เพื่อตั้งค่าให้เกมสุ่มกระจายดอกไม้ครับ:

{
          "format_version": "1.21.10",
          "minecraft:scatter_feature": {
            "description": {
              "identifier": "example:scatter_flowers_feature"
            },
            "places_feature": "example:flower_feature",
            "distribution": {
              "iterations": 10,
              "scatter_chance": 50.0,
              "x": {
                "distribution": "uniform",
                "extent": [ 0, 15 ]
              },
              "y": 64,
              "z": {
                "distribution": "uniform",
                "extent": [ 0, 15 ]
              }
            }
          }
        }

การเพิ่ม Features

Feature ต่างๆ จะถูกอ่านจากไฟล์ JSON ที่อยู่ในโฟลเดอร์ย่อย features ของ Behavior packs ครับ ระบบบังคับให้ต้องมี หนึ่ง Feature ต่อหนึ่งไฟล์ โดยชื่อไฟล์และชื่อของFeatures (Identifier) จะต้องตรงกัน

ชื่อ Feature สามารถระบุ Namespace ในรูปแบบ "namespace:feature_name" เพื่อช่วยแยกแยะให้ต่างจาก Feature ที่อาจมีชื่อซ้ำกันใน Behavior packs อื่นๆ ได้ โดย Namespace นี้จะไม่ถูกนำมาพิจารณาตอนที่ระบบจับคู่ชื่อไฟล์ครับ ตัวอย่างเช่น ในไฟล์ที่ชื่อ my_tree_feature.json การตั้งชื่อ Identifier เป็น "my_tree_feature" หรือ "my_pack_name:my_tree_feature" ล้วนถือว่าถูกต้องตามหลักการ (Valid identifiers) ทั้งคู่ครับ

หากมี Behavior packs สองแพ็กกำหนดชื่อ Feature (รวมถึง Namespace) ตรงกันเป๊ะ Feature จากแพ็กที่อยู่บนสุด จะถูกนำมาใช้งาน สิ่งนี้ทำให้ผู้เล่นสามารถเขียนทับ (Override) Feature พื้นฐานของตัวเกมได้ครับ

การตั้งค่า Behavior Pack

ในการเพิ่ม Features คุณจำเป็นต้องจัดเตรียมโครงสร้างโฟลเดอร์ใน Behavior Pack ดังนี้:

Navigate Feature

*อย่างไรก็ตาม หากคุณใช้งาน Structures ภายใน Feature ที่มี Custom Block หรือ Custom Items คุณจะต้องตั้งค่า Resource Pack เข้ามาเป็น Dependency ด้วยครับ


Features ที่รองรับ

นี่คือรายชื่อประเภท Features ทั้งหมดที่คุณสามารถใช้งานได้ในปัจจุบันครับ:

ชื่อ คำอธิบาย
minecraft:aggregate_feature กลุ่มของคอลเลกชัน Feature ที่ทำงานแบบสุ่มลำดับ
minecraft:cave_carver_feature เจาะถ้ำ (Carves a cave) ทะลุโลกในชังก์ปัจจุบัน และชังก์รอบๆ ในรูปแบบรัศมี 8 Chunk
minecraft:fossil_feature สร้าง Structure โครงกระดูก ที่ประกอบด้วย Bone Block และ Ore Block แบบ Parameter
minecraft:geode_feature สร้างการก่อตัวของหินเพื่อจำลองรูปแบบของ Geode
minecraft:growing_plant_feature วางต้นพืชที่กำลังเติบโตลงในโลก
minecraft:nether_cave_carver_feature เจาะถ้ำทะลุ Nether ใน Chunk ปัจจุบัน และ Chunk รอบๆ
minecraft:multiface_feature วาง Block แบบหลายหน้า เช่นบนพื้น/ผนัง/เพดาน
minecraft:ore_feature วางสายแร่ เพื่อจำลองแหล่งกำเนิดแร่
minecraft:scatter_feature สุ่มกระจาย (Scatters) Features ไปทั่วทั้ง Chunk
minecraft:search_feature กวาดหาพื้นที่เพื่อค้นหาตำแหน่งการวางที่ถูกต้องสำหรับ Feature ที่มันอ้างอิง
minecraft:sequence_feature คอลเลกชันของ Feature ที่จะทำงานตามลำดับขั้นตอนอย่างเคร่งครัด
minecraft:single_block_feature วาง Block เดี่ยวๆ (Single Block) ลงในโลก
minecraft:snap_to_surface_feature ดึงแกน Y ของตำแหน่งที่จะวางให้ติดกับพื้นหรือเพดาน ภายในระยะ vertical_search_range ที่กำหนด
minecraft:surface_relative_threshold_feature ประเมินว่าตำแหน่งอยู่ต่ำกว่าระดับพื้นผิวโลกหรือไม่ และจะวาง Feature หากเป็นเช่นนั้น (ใช้งานได้กับเครื่องกำเนิด Overworld รุ่น 1.18 ขึ้นไปเท่านั้น)
minecraft:structure_template_feature วางโครงสร้าง (Structure) ลงในโลก โครงสร้างต้องเป็นไฟล์ .mcstructure ในโฟลเดอร์ structures
minecraft:tree_feature วางรูปแบบต้นไม้ (Tree) ลงในโลก
minecraft:underwater_cave_carver_feature เจาะถ้ำใต้น้ำ (Underwater cave)
minecraft:vegetation_patch_feature สร้างแพตช์พืชพรรณ (Vegetation patch) (หมายเหตุอ้างอิงจากต้นฉบับ: คำอธิบายเดียวกับ Cave carver)
minecraft:weighted_random_feature สุ่มเลือกและวาง Feature โดยอิงจากค่า Weight Value

Feature ที่ไม่รองรับแล้ว

⚠️ คำเตือน

Feature เหล่านี้เคยมีอยู่และใช้งานได้ในช่วงการทดลองรุ่นเก่า แต่ปัจจุบัน ถูกถอดออกและไม่สามารถใช้งานได้แล้วครับ

ชื่อ คำอธิบาย
minecraft:beards_and_shavers ใช้สร้างพื้นที่เคลียร์ให้โล่ง เพื่อเตรียมพื้นที่ว่างสำหรับวาง Feature
minecraft:conditional_list วาง Feature อันแรกที่เหมาะสมที่สุดภายในคอลเลกชัน
minecraft:rect_layout สแกนพื้นผิวของ Chunk และสั่งทำงานการวาง บนพื้นผิวของทุกๆ คอลัมน์ Block
minecraft:scan_surface สแกนพื้นผิวของ Chunk และสั่งทำงานการวาง บนพื้นผิวของทุกๆ คอลัมน์ Block

Feature Rules

Feature จำเป็นต้องผูกไว้กับ Biome อย่างน้อยหนึ่งแห่ง เพื่อให้มันสามารถปรากฏขึ้นมาในโลกได้ครับ ในระหว่างการสร้างโลก (World Generation) Biome ต่างๆ จะพยายามวาง Feature ที่ถูกผูกไว้แบบทีละ Chunk ซึ่งเราสามารถผูก Feature เข้ากับ Biome ได้ผ่านการตั้งค่า Feature Rules ครับ

Feature Rules ซึ่งเราสามารถผูก Feature เข้ากับ Biome ได้ผ่านการตั้งค่า Feature Rules ครับ จะเป็นไฟล์ JSON แยกต่างหากที่เก็บไว้ในโฟลเดอร์ feature_rules ของ Behavior Packs โดยใช้กฎการตั้งชื่อไฟล์แบบเดียวกับ Feature กฎหนึ่งไฟล์จะควบคุม Featureเพียง หนึ่งอันเท่านั้น และทำหน้าที่เป็นจุดเริ่มต้น (Root) ของสายโซ่ข้อมูล Feature

ในการผูก Feature เข้ากับ Biome Objects "conditions" จะต้องมีฟิลด์ "minecraft:biome_filter" รวมอยู่ด้วย ซึ่งมันคือรายการของการทดสอบตัวกรอง (Filter) ที่ใช้ตรวจสอบแต่ละ Biome ว่าควรจะให้ Feature นี้ไปเกิดหรือไม่ ตัวทดสอบที่ใช้บ่อยที่สุดคือ "has_biome_tag" ครับ

*คุณสามารถหารายชื่อแท็ก Biome สำหรับใช้ในฟิลด์ tag ได้ที่หน้าเอกสาร Entity Documentation - minecraft:biome_filter ครับ

รอบการวาง Feature (Placement Pass)

คุณสามารถควบคุมได้ว่ากฎของ Feature นี้จะถูกนำไปใช้ในรอบการสร้างโลกช่วงไหนโดยการตั้งค่า "placement_pass" (ทั้งนี้ ลำดับการเกิดภายใน Pass เดียวกันจะไม่ถูกการันตีว่าจะเกิดก่อนหลังครับ) ประเภทของ Placement pass ที่มีให้ใช้งาน ได้แก่:


ตัวอย่าง: Birch Forest

นี่คือตัวอย่างการตั้งค่า Feature Rule ให้ Feature ต้น Birch ไปเกิดเฉพาะใน Biome Birch Forest ที่ไม่ใช่แบบกลายพันธุ์:

{
          "format_version": "1.13.0",
          "minecraft:feature_rules": {
            "description": {
              "identifier": "minecraft:birch_forest_surface_trees_feature",
              "places_feature": "minecraft:legacy:birch_forest_tree_feature"
            },
            "conditions": {
              "placement_pass": "surface_pass",
              "minecraft:biome_filter": [
                {
                  "test": "has_biome_tag",
                  "operator": "==",
                  "value": "forest"
                },
                {
                  "all_of": [
                    {
                      "test": "has_biome_tag",
                      "operator": "==",
                      "value": "birch"
                    },
                    {
                      "test": "has_biome_tag",
                      "operator": "!=",
                      "value": "mutated"
                    }
                  ]
                }
              ]
            },
            "distribution": {
              "iterations": 1,
              "x": 0,
              "y": 0,
              "z": 0
            }
          }
        }

โครงสร้างอ้างอิงของ Feature Rule Schema

เพื่อให้เข้าใจภาพรวม นี่คือโครงสร้างพื้นฐานทั้งหมดที่คุณสามารถใช้งานได้ในไฟล์ Feature Rule ครับ:

1. คำอธิบายและเงื่อนไขหลัก

Parameter จำเป็น คำอธิบาย
identifier บังคับ ชื่อของกฎนี้ (รูปแบบ namespace:rule_name) ต้องตั้งชื่อให้ตรงกับชื่อไฟล์
places_feature บังคับ อ้างอิงชื่อ Feature identifier ที่จะถูกสั่งการโดยกฎข้อนี้
placement_pass บังคับ ระยะเวลาที่ Feature จะถูกวางเมื่อเทียบกับตัวอื่นๆ (Pass ที่มาก่อน จะเกิดก่อนอย่างแน่นอน)
minecraft:biome_filter ทางเลือก รายการของเงื่อนไขที่จะตัดสินว่ากฎนี้ถูกผูกเข้ากับ Biome ไหนบ้าง

2. กลุ่มการกรองเงื่อนไข

ตัวกรอง (Filters) ใช้กำหนดเกณฑ์การทดสอบ คุณสามารถใช้ตัวกรองแบบเดี่ยวหรือรวมเป็นกลุ่มก็ได้

ชื่อกลุ่ม คำอธิบายการประเมิน
AND, all, all_of ประเมินทุกๆ การทดสอบในกลุ่มนี้ ทุกอันต้องเป็นจริง (Pass) กลุ่มถึงจะถือว่าผ่าน
OR, any, any_of ประเมินการทดสอบในกลุ่มนี้ หาก ผ่านแค่หนึ่งอันหรือมากกว่า กลุ่มก็ถือว่าผ่าน
NOT, none_of ประเมินทุกๆ การทดสอบในกลุ่ม ทุกอันต้องล้มเหลว (Fail) กลุ่มถึงจะถือว่าผ่าน

*ภายใน Filter Test แต่ละอัน จะประกอบด้วย: test (ชื่อการทดสอบ เช่น has_biome_tag), operator (ตัวดำเนินการ เช่น == หรือ !=), และ value (ค่าที่ใช้เปรียบเทียบ)

3. Scatter Distribution

ใช้ควบคุมตำแหน่งและการกระจาย (Scatter distribution) ของ Object

Parameter จำเป็น คำอธิบาย
iterations บังคับ จำนวนครั้งที่ระบบจะพยายามวาง (พยายามมากชิ้นยิ่งกระจุกตัวกันเยอะ)
scatter_chance ทางเลือก ความน่าจะเป็นที่จะเกิดการกระจายนี้ (ใช้เศษส่วนเป็น numerator และ denominator)
x, y, z (Coordinate Range) บังคับ กำหนดรูปแบบการกระจายบนแต่ละพิกัด เช่น distribution (รูปแบบ), extent (ขอบเขต), grid_offset, step_size
coordinate_eval_order ทางเลือก ลำดับการประเมินพิกัด หากแกนใดแกนหนึ่งต้องอิงจากแกนอื่น (ค่าตั้งต้น: xzy รองรับ: xyz, xzy, yxz, yzx, zxy, zyx)

*รูปแบบของการกระจายสุ่ม (Random Distribution Type) ที่รองรับ ได้แก่: uniform, gaussian, inverse_gaussian, triangle, fixed_grid, jittered_grid


Feature Samples

Feature ทั้งหมดที่ถูกระบุไว้ในปัจจุบัน (อ้างอิง ณ เวอร์ชัน 1.20.40) ได้ถูกรวบรวมไว้ใน Sample Pack เป็นที่เรียบร้อยแล้วครับ

คุณสามารถดาวน์โหลดและนำแพ็กนี้ไปเปิดใช้ในโลกของคุณ เสมือนเป็นบทช่วยสอน (Tutorial) ส่วนตัว เพื่อเรียนรู้เพิ่มเติมว่า Feature และ Feature Rules ทำงานร่วมกันอย่างไรในสภาพแวดล้อมจริง

*นอกจากนี้ เราขอแนะนำให้คุณลองเข้าไปตรวจสอบในโฟลเดอร์ feature และ feature_rules ของ Minecraft Dedicated Server เวอร์ชันล่าสุด เพื่อดูตัวอย่างโค้ด Feature Rules ต้นฉบับจากตัวเกม (Vanilla) ได้อีกด้วยครับ การแกะโค้ดของเกมแท้จะช่วยให้คุณเห็นภาพชัดเจนที่สุด!