Feature คือของตกแต่งที่ถูกสุ่มกระจายอยู่ทั่วโลกครับ สิ่งต่างๆ
เช่น ต้นไม้, พืชพรรณ, ดอกไม้, แหล่งน้ำพุ, แร่ (Ore), และปะการัง ล้วนถูกจัดว่าเป็น Feature ทั้งหมด
โดยพื้นฐานแล้วหลักการจำง่ายๆ ก็คือ: ถ้าสิ่งนั้นไม่ใช่ภูมิประเทศ (Terrain) หรือ Entity
สิ่งนั้นก็มักจะเป็น Feature ครับ
โครงสร้างของ Feature
Feature สามารถอยู่แบบเดี่ยวๆ (Standalone) หรือประกอบขึ้นจาก Feature ย่อย (Sub-features) หลายอันรวมกันก็ได้ครับ
ในทางปฏิบัติ Feature ส่วนใหญ่ใน Minecraft จะถูกกำหนดและสร้างขึ้นมาเป็น "สายโซ่" (Chain) ของ Feature ตั้งแต่สองอันขึ้นไปเชื่อมต่อกัน สายโซ่เหล่านี้มักจะไปจบลงที่ Feature ตัวสุดท้ายซึ่งทำหน้าที่ วาง Block ลงในโลก ครับ
การควบคุมลำดับการทำงาน
Feature ประเภทอื่นๆ จะถูกนำมาใช้เพื่อควบคุมกระแสการทำงานของสายโซ่ครับ ตัวอย่างเช่น:
- แบบมีเงื่อนไข (Conditional): วาง Feature นี้ก็ต่อเมื่อตรงตามเงื่อนไขที่กำหนดเท่านั้น
- แบบเรียงลำดับ (Sequential): วาง Feature หลายๆ อันตามลำดับขั้นตอน
- แบบสุ่มกระจาย (Random distribution): สุ่มเปอร์เซ็นต์หรือตำแหน่งการเกิดของ 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 ดังนี้:
- ในโฟลเดอร์ Behavior Pack ของคุณ ให้สร้างโฟลเดอร์
featuresและfeature_rules(สองโฟลเดอร์นี้จะใช้เก็บไฟล์ JSON ทั้งหมดที่กำหนด Feature ของคุณ) - ค่า
"min_engine_version"ในไฟล์manifest.jsonจำเป็นต้องตั้งเป็น 1.20.20 ขึ้นไป - ระบบ Feature ไม่จำเป็น ต้องใช้ Resource Pack เสมอไป
*อย่างไรก็ตาม หากคุณใช้งาน 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
ที่มีให้ใช้งาน ได้แก่:
first_passbefore_underground_passunderground_passafter_underground_passbefore_surface_passsurface_passafter_surface_passbefore_sky_passsky_passafter_sky_passfinal_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)
ได้อีกด้วยครับ
การแกะโค้ดของเกมแท้จะช่วยให้คุณเห็นภาพชัดเจนที่สุด!