- Minecraft 26.3 Snapshot 4 เปลี่ยนแบ็กเอนด์สำหรับการจัดการหน้าต่าง อินพุต และการผสานกับแพลตฟอร์มจาก GLFW เป็น SDL3 และนำ SDL scancode กับ keycode มาใช้กับอินพุตคีย์บอร์ด
- การกำหนดปุ่มจะอิงตาม ตำแหน่งจริงของปุ่มบนคีย์บอร์ด แทนรหัสตามผังแป้นพิมพ์, บน Linux จะให้ความสำคัญกับ Wayland หากใช้ได้ และบน macOS รองรับหน้าต่างตัวเลือกการป้อนข้อมูลแบบเนทีฟ
- เพิ่ม data component สำหรับ เชื้อเพลิงเตาและการปรุงยาแบบกำหนดเอง ให้ตั้งเวลาการเผาไหม้ จำนวนครั้งการใช้งาน และความเร็วการปรุง/การปรุงยาได้ด้วย number provider
- ใน data pack 111.0 และ resource pack 92.0 มีการเปลี่ยนแปลงครั้งใหญ่กับอีเวนต์คลิกป้าย การอ้างอิงตารางของรางวัล ทริกเกอร์ความก้าวหน้า คุณสมบัติแวดล้อมการเกิดม็อบ การตั้งค่าการสร้างภูมิประเทศ และเชดเดอร์
- บน Windows แบบหลายจอและ Wayland มีปัญหา exclusive fullscreen ล่ม ที่ทราบอยู่ และเวอร์ชันทดสอบอาจทำให้โลกพังได้ จึงควรสำรองข้อมูลหรือรันในโฟลเดอร์แยกต่างหาก
ระบบหน้าต่างและอินพุตที่ใช้ SDL3
- เปลี่ยนไลบรารีสำหรับจัดการหน้าต่าง อินพุต และการผสานกับแพลตฟอร์ม จาก GLFW เป็น SDL3
- อินพุตคีย์บอร์ดใช้ SDL scancode ตามตำแหน่งจริงของปุ่ม
- คีย์ลัดสำหรับแก้ไขข้อความที่เปลี่ยนไปตามผังแป้นพิมพ์จะใช้ SDL keycode
- การกำหนดปุ่มจะทำงานโดยอิงจาก ปุ่มจริงบนคีย์บอร์ด ไม่ใช่ key code ตามผังแป้นพิมพ์
- เอาการตั้งค่าเมาส์ Raw Input ออก และระหว่างเล่นเกมจะใช้โหมดเมาส์แบบสัมพัทธ์เสมอ
- fullscreen แบบไร้ขอบกลายเป็นโหมด fullscreen เริ่มต้น และสามารถสลับระหว่างโหมดไร้ขอบกับโหมด exclusive ได้โดยไม่ต้องรีสตาร์ต
- บน macOS จะไม่รองรับ exclusive fullscreen อีกต่อไป
- ขนาดหน้าต่างต่ำสุดคือ 320×240 พิกเซล
- บน Linux จะ เลือกใช้ Wayland แบบเนทีฟก่อน หากใช้งานได้
- บน macOS เมื่อกดปุ่มค้างระหว่างป้อนข้อความ จะมีป๊อปอัปเครื่องหมายกำกับเสียง/ตัวเลือกแบบเนทีฟแสดงขึ้น
ปัญหา fullscreen ที่ทราบอยู่
- exclusive fullscreen บน Windows อาจทำให้เกมล่มในบางสถานการณ์ โดยเฉพาะใน สภาพแวดล้อมหลายจอ
- บน Wayland เกมจะล่มเมื่อเข้า exclusive fullscreen
การเล่นและการเปลี่ยนแปลงอินเทอร์เฟซ
- ผู้เล่นโหมด spectator สามารถโต้ตอบกับพอร์ทัลเพื่อเทเลพอร์ตได้
- Armadillo จะไม่พยายามขดตัวเมื่อจมอยู่ในของเหลว
- สามารถใช้สเกล GUI แยกต่างหากกับ debug overlay ได้
- ตั้งค่าได้ใน Debug Options ของ
F3 + F6 - ค่าเริ่มต้น
Autoจะคงความละเอียดสูงกว่าของ GUI ปกติ และUnchangedจะตรงกับสเกล GUI ปกติ - เพิ่ม
player_speedที่แสดงความเร็วการเคลื่อนที่เป็นบล็อกต่อติ๊กของผู้เล่น และการแสดงอัตรารีเฟรชของจอด้วย
- ตั้งค่าได้ใน Debug Options ของ
- จัดลำดับแร่ใน creative inventory ใหม่เป็น วัสดุไม่มี tier, วัสดุ tier แบบดิบ, วัสดุ tier แบบแปรรูป
- บล็อกก่อสร้างจะเรียงเป็น แร่ไม่มี tier, แร่ tier แบบแปรรูป, กลุ่ม Copper และบล็อก Copper ที่มีรายการมากจะถูกวางไว้ด้านหลัง
- แท็บ Natural Blocks ถูกจัดเป็นลำดับ Overworld → Nether → End
เชื้อเพลิงแบบกำหนดเองและ item component
minecraft:cooking_fuelใช้นิยามเชื้อเพลิงสำหรับ Furnace, Smoker และ Blast Furnaceburn_timeคือจำนวนติ๊กที่เผาไหม้ และspeed_multiplierคือความเร็วการปรุง/ถลุง โดยกำหนดเป็นminecraft:number_provider
minecraft:brewing_fuelใช้นิยาม จำนวนครั้งการใช้งานและความเร็วการปรุงยา ของเชื้อเพลิงสำหรับ Brewing Stand- item tag เดิม
#brewing_fuelถูกลบออก จึงไม่สามารถใช้ลงทะเบียนเชื้อเพลิงการปรุงยาแบบใหม่ได้
- item tag เดิม
- สูตรของ Smoker และ Blast Furnace จะใช้เวลาปรุงเท่ากับ Furnace และการเร่งความเร็วจะให้
minecraft:cooking/speed_defaultใน fuel component เป็นผู้กำหนด - ฟิลด์เวลาปรุงและเวลาเชื้อเพลิงของ Furnace, Smoker และ Blast Furnace เปลี่ยนจาก short เป็น integer และเพิ่ม
speed_multiplier BrewTimeและFuelของ Brewing Stand ก็เปลี่ยนเป็น integer เช่นกัน และเพิ่มtotal_brew_time,total_fuel,speed_multiplier- data component ที่เพิ่มเข้ามามีดังนี้
minecraft:sign_text_front,minecraft:sign_text_back: เก็บข้อความด้านหน้า/ด้านหลังของป้าย และแสดงใน tooltip ของไอเท็มminecraft:waxed: มาร์กเกอร์แบบไม่มีฟิลด์ที่ระบุว่าเนื้อหาถูกเคลือบแว็กซ์แล้วminecraft:cushion/color: ใช้สีสีย้อม 16 แบบกับ Cushion ที่วางแล้วminecraft:villager_food: นิยามไอเท็มที่ชาวบ้านกินได้และค่าทางโภชนาการminecraft:mob_visibility: กำหนดอัตราส่วนผลของอุปกรณ์ต่อระยะตรวจจับของม็อบเป็น 0.0~10.0 และแม้จะซ้อนกัน ค่าการมองเห็นสูงสุดจะไม่เกิน 10.0
ป้ายและความเข้ากันได้ของ data pack
- เวอร์ชัน data pack เพิ่มเป็น 111.0
- คำสั่งและอีเวนต์คลิกในข้อความป้ายแบบกำหนดเอง จะไม่ถูกรันโดยอัตโนมัติเมื่อคลิกบล็อกอีกต่อไป และ text component ของป้ายใหม่ก็จะไม่ถูกตีความอัตโนมัติ
- ฟิลด์ใหม่
allow_op_featuresมีค่าเริ่มต้นเป็นfalseและหากต้องการคืนพฤติกรรมเดิมต้องตั้งเป็นtrueอย่างชัดเจน - ป้ายที่บันทึกจากเวอร์ชันเก่า และ
minecraft:block_entity_dataที่มีข้อมูลป้าย จะถูกใช้allow_op_features=true
- ฟิลด์ใหม่
- หน้าจอแก้ไขป้ายหลังจากวาง จะปรากฏเฉพาะเมื่อสามารถเปิดหน้าจอแก้ไขได้ด้วยการคลิกปกติ เช่น ยังไม่ถูกเคลือบแว็กซ์ และแก้ไขข้อความด้านหน้าได้
- ป้ายจะรับส่ง component
minecraft:sign_text_front,minecraft:sign_text_back,minecraft:waxed - บล็อกที่ปลอดภัยสำหรับ
/spreadplayersในการวางผู้เล่น จะถูกควบคุมด้วย block tag#entities_can_teleport_to
การอ้างอิงรีจิสทรี และการเปลี่ยนแปลงของของรางวัล/ความก้าวหน้า
- ประเภท loot table ที่มีรีจิสทรีเฉพาะ รองรับ การอ้างอิง element และ tag ในรีจิสทรี
- ฟิลด์ element เดี่ยวสามารถรับ namespaced ID หรือค่า inline ได้
- ฟิลด์รายการสามารถรับค่า inline, namespaced ID เดี่ยว/หลายรายการ, รายการค่า inline หรือ tag ID แบบ
# - เป้าหมายได้แก่ advancement, item modifier, loot table, number provider, predicate, recipe, slot source
- ประเภท
referenceเดิมของ predicate, item modifier, slot source ไม่จำเป็นอีกต่อไปจึงถูกลบออก - หลายฟิลด์ของ advancement trigger สามารถรับทั้ง predicate แบบ inline และ namespaced predicate ID ได้
- พฤติกรรม
minecraft:all_ofแบบโดยนัยของรายการเงื่อนไขเดิมถูกลบออก ดังนั้นต้องระบุtypeเสมอ - หลายฟิลด์ของ
block,recipe_id,loot_tableเปลี่ยนเป็นรูปพหูพจน์ และรองรับ ID เดี่ยว รายการ หรือ tag
- พฤติกรรม
conditionsของ Loot Pool Entry เปลี่ยนชื่อเป็นconditionและfunctionsเปลี่ยนชื่อเป็นmodifierconditionsของ Loot Function เปลี่ยนชื่อเป็นconditionและfunctionที่เคยใช้บอกประเภทฟังก์ชัน เปลี่ยนเป็นtype- จะไม่รับรายการเงื่อนไขแบบ inline อีกต่อไป และหากต้องการพฤติกรรมเดิมต้องระบุ
minecraft:all_ofอย่างชัดเจน
- จะไม่รับรายการเงื่อนไขแบบ inline อีกต่อไป และหากต้องการพฤติกรรมเดิมต้องระบุ
- ฟิลด์ประเภท
conditionของ Predicate เปลี่ยนเป็นtypeและminecraft:referenceกับminecraft:block_state_propertyถูกลบออกminecraft:match_blockใหม่จะตรวจทั้ง block ID/tag, state, NBT, component และ component predicate พร้อมกัน
- number provider แบบ inline ต้องระบุ
typeเสมอ และจะไม่ใช้minecraft:uniformเป็นค่าเริ่มต้นอีกต่อไป - เพิ่ม Vanilla number provider หลายตัวที่ให้ค่าเวลาการเผาไหม้ตามเชื้อเพลิงทำอาหาร ความเร็วเริ่มต้นของการปรุง/การปรุงยา และจำนวนครั้งการปรุงยา
การเกิดม็อบและการสร้างโลก
- คุณสมบัติแวดล้อมใหม่
minecraft:gameplay/natural_mob_spawnsใช้นิยามการเกิดม็อบตามน้ำหนักรายหมวดหมู่และ spawn cost รายเอนทิตี- ระหว่างการวางโลกจาก world generation จะมีเพียง Dimension และ Biome ที่ใช้คุณสมบัตินี้
- ตัวแก้ไข
overlayจะให้ความสำคัญกับการตั้งค่าหมวดหมู่ของชั้นบนและ spawn cost ของเอนทิตีเดียวกันก่อน
minecraft:gameplay/creature_world_gen_spawn_probabilityกำหนดความน่าจะเป็นการวนซ้ำการเกิดม็อบหมวด creature ระหว่างสร้างโลกเป็น ตั้งแต่ 0 ขึ้นไปแต่น้อยกว่า 1 โดยค่าเริ่มต้นคือ 0.1spawners,spawn_costs,creature_spawn_probabilityของ Biome ถูกลบออกและย้ายไปยังคุณสมบัติแวดล้อมใหม่- คุณสมบัติแวดล้อมของอนุภาครอบข้างจะทำ interpolation ของความน่าจะเป็นระหว่าง timeline keyframe และรองรับตัวแก้ไข
appendที่ต่อรายการอนุภาคในชั้นล่าง - ใน Noise Settings การตั้งค่า aquifer และ ore vein ถูกจัดใหม่เป็นอ็อบเจ็กต์
aquifersแบบเลือกได้ และรายการore_veins- หากไม่มีการตั้งค่า จะไม่สร้าง aquifer หรือ ore vein นั้น
- ฟิลด์ density function ที่เกี่ยวข้องถูกย้ายจาก
noise_routerไปยังโครงสร้างใหม่
- เพิ่ม
sub,div,negate,lerp,floor,round,ceil,truncate,beardifierให้กับ Density Function- ชื่ออาร์กิวเมนต์เดิมหลายรายการถูกเปลี่ยนเป็น
value,left,right,input,noise invertถูกเปลี่ยนชื่อเป็นreciprocalfinal_densityจะไม่บวก beardifier แบบโดยนัยอีกต่อไป
- ชื่ออาร์กิวเมนต์เดิมหลายรายการถูกเปลี่ยนเป็น
กราฟิกและการแก้บั๊กสำคัญ
- เวอร์ชัน resource pack เพิ่มเป็น 92.0
- เพิ่มเชดเดอร์ที่รองรับ order-independent transparency และนิยาม
OIT_ALWAYS_WRITE_DEPTH core/integrate_depth.fshจะรวม depth buffer ของ 3D HUD และ gizmo ที่แสดงอยู่ด้านบนเสมอ เข้ากับ depth buffer หลัก- ปัญหาสำคัญที่แก้ไขมีดังนี้
- ปัญหาการกำหนดปุ่มและอินพุตที่เกี่ยวข้องกับคีย์บอร์ดที่ไม่ใช่ QWERTY รวมถึงการป้อนข้อมูลบน macOS/CJK
- ปัญหา Improved Transparency ที่ทำให้การเรนเดอร์แผนที่ล่ม รวมถึงปัญหาการแสดงผลของกระจก วัตถุกึ่งโปร่งใส อนุภาค และเส้นขอบโลก
- ปัญหาการล่มจาก projectile นอกความสูงของโลก และการวางรังผึ้งที่ความสูงต่ำสุด
- ปัญหาการบันทึก/โหลด heightmap ของ world generation และตำแหน่งม็อบไม่ซิงก์หลัง tick sprint
- ปัญหาเกี่ยวกับการวาง Cushion สี ชื่อแบบกำหนดเอง เวลาเชื้อเพลิง และการตรวจชน
- ปัญหาความเสียหาย/การบินของ Ender Dragon, การใช้พอร์ทัลของ spectator, และการตัดสินบล็อกปลอดภัยของ
/spreadplayers
ข้อควรระวังในการติดตั้งและทดสอบ
- Snapshot นี้สำหรับ Minecraft: Java Edition และติดตั้งได้โดยเปิดใช้ Snapshot ในแท็บ
Installationsของ Minecraft Launcher - เนื่องจากเวอร์ชันทดสอบ อาจทำให้โลกเสียหายได้ จึงควรสำรองข้อมูลหรือรันในโฟลเดอร์ที่แยกจากโลกหลัก
- มี Minecraft server jar สำหรับข้ามแพลตฟอร์มให้ด้วย
- สามารถส่งบั๊กได้ที่ Minecraft issue tracker และส่งความคิดเห็นได้ที่ เว็บไซต์ Feedback
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
อิมพลีเมนต์ LWJGL ของ binding นี้เขียนโดยสมาชิกทีม modpack GTNH ทำให้วงจร vanilla→modded→vanilla กลับมาครบอีกครั้ง https://github.com/LWJGL/lwjgl3/pull/1033
ช่วงหลังได้ย้ายเกม Tribal Trouble(https://github.com/bondolo/tribaltrouble) จาก GLFW ไปเป็น SDL3 ซึ่งโดยรวมแล้วเป็นการ refactor ที่ค่อนข้างราบรื่น มีปัญหาบางอย่างกับโหมด fullscreen แบบ exclusive และ desktop fullscreen แต่สุดท้ายก็แก้ได้
ผมยังเขียน เดโม ไว้เพื่อทดสอบและทำเอกสารเรื่องการจัดการโหมดหน้าจอที่ยุ่งยากด้วย ตัวเกมเป็น Java เหมือน Minecraft แต่เดโมใช้ C เพื่อให้เรียบง่ายที่สุด
fullscreen แบบ exclusive บน Windows มีปัญหาที่ทราบกันว่าสามารถทำให้เกมค้างได้ โดยเฉพาะในสภาพแวดล้อมหลายจอ และบน Wayland แค่เข้าสู่โหมดนี้ก็ทำให้ค้างได้ ทั้งสองอย่างดูเหมือน บั๊กระดับ blocker ที่ควรเลื่อน snapshot จึงหวังว่าจะได้รับการแก้ก่อนออกเวอร์ชันจริง
ผมมองว่าระดับความคาดหวังด้านเสถียรภาพเรียงประมาณนี้: รุ่น LTS, รุ่นจริง, release candidate, beta, alpha, snapshot, commit ที่เพิ่ง merge, PR ที่ยังไม่ merge, draft PR เป็นต้น ถ้าเป็นบั๊กใหญ่ก็ควรเลื่อน release candidate หรือ beta และถ้าเป็นบั๊กร้ายแรงก็ควรบล็อกการ merge เอง แต่ไม่มีเหตุผลต้องเลื่อน snapshot เพียงเพราะบั๊กที่ผ่าน CI แล้วถูก merge เข้ามา
snapshot ใกล้เคียงกับการตัดสถานะปัจจุบันออกมาเผยแพร่เป็นระยะ เพื่อให้ผู้ใช้รันและส่ง feedback ได้โดยไม่ต้อง build main เอง
snapshot ไม่เคยสัญญาว่าจะไม่มีบั๊ก ตรงกันข้ามด้วยซ้ำ นั่นคือสมมติฐานตั้งต้น
ในฐานะพ่อสายเทคนิคที่ไม่รู้จัก Minecraft เลย สงสัยว่าถ้าจะตั้งเซิร์ฟเวอร์ครอบครัวในปี 2026 ควรทำอย่างไร เด็ก ๆ ตอนนี้เล่นบน iPad และบางครั้งก็ใช้ MacBook เก่า ๆ กับพีซี Windows
สามารถรันเซิร์ฟเวอร์ Java มาตรฐาน แล้วใช้ Geyser แปลงโปรโตคอล Bedrock แบบเรียลไทม์ได้ สำหรับ client Bedrock ที่มีข้อจำกัดมากอาจต้องมีวิธี workaround บางอย่าง แต่จะทำให้บริหารจัดการโดยยึดเซิร์ฟเวอร์ Java ที่มีตัวเลือกมากกว่าเป็นศูนย์กลางได้
แค่ใช้ JVM รุ่นใหม่ ตั้งค่า maximum memory ให้สูงเท่าที่ยอมรับได้ แล้วใช้ ZGC ก็เพียงพอ มีคำแนะนำที่ให้ปรับ flag หลายตัวโดยไม่มีหลักฐาน หรือใส่ค่าที่ขัดกันเองอย่างขนาด Eden area กับเป้าหมาย pause time ไปพร้อมกันด้วย
ZGC มี latency ต่ำมาก และยิ่ง heap ใหญ่ ประสิทธิภาพที่ตกลงก็ยิ่งน้อยลง แต่ถ้าต้องการรักษา object header compression ไว้ ควรตั้งไว้ ต่ำกว่า 32GB JVM รุ่นใหม่ยังช่วยปรับปรุงการใช้หน่วยความจำและประสิทธิภาพโดยรวมด้วย
ถ้าต้องการประสิทธิภาพเพิ่ม ให้ติดตั้ง fabric และ lithium ส่วน mod อย่าง Paper, Spigot, Purpur อาจทำให้ระบบอัตโนมัติพัง จึงควรหลีกเลี่ยง
ผมใช้ itzg/docker-minecraft-server ได้อย่างเสถียรมาหลายปี และชอบตรงที่ image จัดการทุกอย่างให้โดยไม่ต้องติดตั้ง dependency ทีละตัว มี image สำหรับเซิร์ฟเวอร์ Bedrock ด้วย แต่ผมยังทำให้ทำงานได้ไม่สำเร็จ
ถ้าจะให้ดูแลง่ายที่สุด ทุกคนควรใช้ Java Edition บน Windows, Mac หรือ Linux ไม่เช่นนั้นก็มีทางเลือกคือจ่ายเงินใช้ Realms ซึ่งเป็นเซิร์ฟเวอร์โฮสติ้ง
อาจไม่เหมาะกับเป้าหมายของเซิร์ฟเวอร์ครอบครัวก็ได้ แต่เป็นวิธีที่ง่ายที่สุดสำหรับให้เด็ก ๆ เล่นด้วยกันได้เร็วและสะดวก ผมเคยเห็นเด็กบางคนที่ยืนกรานใช้ Bedrock มานาน พอย้ายมา Java แล้วก็เสียดายที่ไม่เปลี่ยนให้เร็วกว่านี้
Icculus โพสต์วิดีโอยอดเยี่ยมเกี่ยวกับ การพอร์ตเกมจาก SDL2 ไปเป็น SDL3 และวิดีโอพอร์ต Doom อยู่ที่นี่: https://www.youtube.com/watch?v=ixdeGhsoxy8
น่าทึ่งที่ Minecraft ดูจะค่อย ๆ กลายเป็น เกมเอนจินของตัวเอง มากกว่าเป็นแค่เกมธรรมดา
อยากรู้ว่ามีการบันทึกเหตุผลที่เลิกใช้ GLFW ไว้หรือไม่ มีโปรเจกต์ที่ใช้ GLFW อยู่ เลยต้องคิดอยู่เสมอว่า SDL เป็นตัวเลือกที่ดีกว่าหรือเปล่า
SDL3 รองรับ Wayland ได้แข็งแรงเป็นพื้นฐานอยู่แล้ว ใน Minecraft นั้น GLFW ใช้แค่สร้างหน้าต่าง, ไอคอนบนแถบงาน, โหมดเต็มจอ และอินพุต ส่วนที่เหลือจัดการด้วย OpenGL แบบดิบ ๆ ดังนั้นการย้ายจึงง่าย ตอนนี้ยังรองรับ Vulkan ด้วย ทำให้ใช้สแตกที่ทันสมัยเต็มรูปแบบได้บน Linux desktop และ Steam Deck
SDL3 ทำงานได้แม้บน Android 4.2 และเคยทำแอปด้วย SDL3 กับ ImGui โดยไม่ใช้ Java ด้วย
อาจไม่ใช่ความต่างใหญ่สำหรับทุกโปรเจกต์ แต่ SDL ให้ฟังก์ชันมากกว่าและพอร์ตข้ามแพลตฟอร์มได้ดีกว่า
เกมริธึม osu! ก็เพิ่งย้ายจาก SDL2 ไป SDL3 เมื่อไม่นานนี้ และประสิทธิภาพกับ latency ดีขึ้นอย่างมาก การนำ SDL3 มาใช้ดูค่อนข้างช้า และก็น่าแปลกใจที่ Minecraft ใช้ GLFW มาจนถึงตอนนี้
โดยเฉพาะหลังย้ายไป SDL3 แล้ว latency ที่เคยเกิดเมื่อเปิดไคลเอนต์ Discord ไว้ระหว่างรัน osu! หายไป จำได้ว่าเห็นจากวิดีโอพัฒนาบน YouTube
Ubuntu 24.04 ไม่ได้รวม SDL3 มาตั้งแต่แรก ซึ่งดูเหมือนเป็นหนึ่งในเหตุผลที่การนำมาใช้ช้ากว่าที่คาด เพราะ SDL3 ใหม่กว่าที่คิด
SDL2 เริ่มแสดงความล้าสมัย โดยเฉพาะในด้าน การ abstract GPU API ที่รวม Vulkan·Metal ด้วย ดังนั้นการย้ายไป SDL3 จึงสมเหตุสมผล อยากรู้ว่าปัญหา input lag และ Alt+Tab ที่มีมานานใน Java Edition บน Linux จะได้รับการแก้ไขจากการเปลี่ยนเลเยอร์หน้าต่าง·อินพุตหรือไม่
ถ้าต้องการรองรับม็อดอย่างจริงจัง ดูเหมือนว่าควรใช้ภาษาที่ ดีคอมไพล์และแก้ไขตอนรันไทม์ได้ง่าย อย่าง Java หรือ C# หรือใช้ JVM กับ .NET CLR
หากคำนึงถึงม็อดเดอร์ไปพร้อมกับการเปลี่ยนแปลงภายใน ก็แทบจะได้ modding API ที่ดีโดยไม่มีต้นทุนเพิ่ม