See more of Lion328's Minecraft Development by logging into Facebook
Message this Page, learn about upcoming events and more.
See more of Lion328's Minecraft Development by logging into Facebook
Message this Page, learn about upcoming events and more.
Not Now
Videos
ServerMauncher ตัวรันเกมเวอร์ชัน R03 ครับ
8
2
Posts

ThaiFixes 4.6-1.12

Changelog:
- รองรับ MinecraftForge 1.12-14.21.0.2382

... See More

ThaiFixes สำหรับ Minecraft Pocket Edition (ทำเล่นๆ)

Posts

ThaiFixes 4.5-1.11.2

Changelog
- เพิ่ม GUI ตั้งค่า ทำให้สามารถเปลี่ยนรูปแบบ (หรือปิด) font ThaiFixes ได้ในเกม
- ขยายกล่องแชทของ font MCPX ที่เคยทำไว้ใน ThaiFixes สำหรับ Minecraft 1.7.10 (ปิดได้ในตั้งค่า)...
- แก้บัค (อ่านในข้อความ commit ของ GitHub)

See More

ตอนนี้เจอ ServerMauncher R03 ทั้ง source code และ binary แล้วนะครับ หากใครยังสนใจอยู่ก็ตามนี้ครับ https://github.com/lion328/ServerMauncher

===========

ThaiFixes config GUI ครั้งหน้าจะเพิ่มให้ใช้กันครับ ส่วนวิธีตั้งค่าแบบเก่าคือแก้ใน .minecraft/config/thaifixes.cfg ครับ

ทดสอบหน้าตั้งค่า ThaiFixes
youtube.com

น่าสนใจดีครับ ระบบเปลี่ยน skin ที่สามารถ upload เองได้โดยผู้เล่นโดยไม่ต้องมีไอดีแท้

944 Views
Pluem Kitsada Sanewongnaaryutaya
March 26

test ระบบเปลี่ยน Skin คนับ ;w;
.
.
.
....
.
.
.
.
ไม่อ่ะอวด 5555555

See More

ThaiFixes 4.4-1.11.2

Changelog:
- ปรับปรุงให้เข้ากับ Minecraft Forge 1.11.2-13.20.0.2228

... See More

server Minecraft ในไทยที่รัน BungeeCord ช่วงนี้มีความทุกข์ไม่น้อยเมื่อมี server เพื่อนบ้านโดน hack

ผมลองตามเรื่องตั้งแต่เมื่อวานก็พบว่าน่าจะแก้กันได้แล้ว (แต่ไม่มีใครบอกผมเลยยย) เดี๋ยวผมจะเล่าให้ฟังว่ามันเกิดอะไรขึ้น

เรื่องมีอยู่ว่า มี server หนึ่งที่ใช้ BungeeCord (ที่ผมกับเพื่อนเข้าไปเล่นอยู่เมื่อไม่นานมานี้) โดนชาวต่างชาติ hack server มีอัดคลิปไว้ด้วย

...

BungeeCord คือเป็นตัวเชื่อม server Minecraft หลายๆ ตัวเข้าด้วยกัน โดยทำตัวเป็น proxy และการเข้าแต่ละ server โดย client ที่ต่อ BungeeCord จะเปรียบเสมือนเข้าโลกอื่นๆ โดยที่ client จะไม่รู้เลยว่าจะไปโผล่ที่ไอพีไหน มีเพียง BungeeCord เท่านั้นที่รู้

การที่ server ที่เชื่อมกับ BungeeCord นั้นจะต้องเป็น offline mode หรือไม่ได้เชื่อมต่อกับ Mojang เพื่อที่จะยืนยันตัวตนของผู้เล่น (ที่เป็นไอดีแท้) นั่นเอง

ปกติแล้ว server ต่างประเทศที่เห็นกันบ่อยๆ มักจะเป็น online mode และแน่นอนครับถ้า BungeeCord เป็น online mode แล้วจะทำให้ UUID ในแต่ละ server ที่เชื่อมต่อตรงกันได้ยังไง? ง่ายๆ เลยก็คือส่ง UUID ที่ BungeeCord ได้มาเอง (โดยการสร้างหรือดึงมาจาก Mojang) ไปให้ server อื่นๆ เมื่อ client ต้องการเชื่ิอมต่อกับ server นั้นๆ (server ที่ใช้มักจะเป็น Spigot เพราะเชื่อมกับ BungeeCord ได้)

บางคนอาจไม่รู้ว่า UUID คืออะไร มันก็เหมือนชื่อผู้เล่นตรงที่สามารถระบุตัวผู้เล่นได้ หรือเป็นเอกลักษณ์ของผู้เล่นครับ (ในเชิงของข้อมูลที่เก็บบน server)

ซึ่งวิธีการที่ BungeeCord ใช้คือการแก้รูปแบบของ packet ที่ทำการบอกข้อมูลพื้นฐานของ client ให้กับ server หรือเรียกว่า handshake (http://wiki.vg/Protocol#Handshake) โดยจะแก้ field ที่ส่ง server address ให้สามาถเพิ่มข้อมูลเพิ่มเติมลงไปได้ (เพราะปกติ server vanilla ไม่ได้ใช้ข้อมูลนั้น) และข้อมูลนั้นก็คือ UUID นั่นเองครับ

อันนี้คือโค้ดของ Spigot ที่แก้ UUID ได้โดยเมื่อเปิดการเชื่อมต่อกับ BungeeCord: https://hub.spigotmc.org/…/C…/0046-BungeeCord-Support.patch…

ปกติแล้ว UUID จะส่งให้โดย BungeeCord แต่ก็มีช่องโหว่นิดหน่อยคือถ้าใช้ client ที่ดัดแปลงเข้าไปยัง server ที่เชื่อมต่อกับ BungeeCord (แต่ไม่ใช่ตัว BungeeCord) ซึ่งเป็น offline mode ทำให้ไม่ต้องยืนยันอะไร (ถ้าไม่ได้ลง plugin ยืนยันอย่างอื่นเช่น AuthMe) แล้ว plugin ส่วนใหญ่จะยึดกับ UUID (เช่นที่ทำงานเกี่ยวกับ permission) ทำให้ผู้เล่นนั้นๆ ทำได้เหมือนที่ UUID นั้น (ไม่ว่าจะเป็นผู้ใช้ทั่วไป หรือเป็นทีมงานที่ใช้ permission อื่นๆ ได้) ทำได้

วิธีการดูด UUID นั้นไม่ยากเลย คือใช้ packet ที่อัพเดทเวลาที่เรากดปุ่ม tab แล้วมีรายชื่อผู้เล่นขึ้นมานั่นแหละครับ (ไม่ใช่ command autocomplete) มันจะส่ง UUID มาด้วย ถ้ามีแอดมินเข้ามาก็จะได้ UUID ของแอดมินไปได้เลย (http://wiki.vg/Protocol#Player_List_Item)

วิธีแก้ก็คือให้ server ที่ BungeeCord ไว้เชื่อมเปิดให้แค่ BungeeCord ใช้ได้อย่างเดียว หรือเครื่องที่เปิด BungeeCord ไว้อยู่ใช้ได้เครื่องเดียว โดยไม่ให้ภายนอกเข้ามาใช้ได้ ปกติแล้วจะใช้พวก firewall ไม่ก็ปิด IP forwarding กับ port นั้นๆ หรือจะปิด support ของ BungeeCord ของ Spigot เลยก็ได้ (แต่ระวัง เพราะ UUID อาจเปลี่ยนได้)

ส่วนเรื่อง plugin ที่ใช้แก้อันนี้ก็แล้วแต่นะครับ ผมคิดว่าปิด port น่าจะพอเอาอยู่

See More

ThaiFixes 4.3-1.11

- ปรับปรุงให้เข้ากับ Minecraft Forge 1.11-13.19.0.2188

https://github.com/lion328/ThaiFixes/releases/tag/4.3-1.11

No automatic alt text available.

ขาย launcher ครับ ติดต่อได้ผ่าน inbox

Minecraft Launcher ตัวใหม่มีอะไรเปลี่ยนแปลงบ้าง

หลังจากที่ Mojang ปล่อย Minecraft Launcher ตัวใหม่ออกมาให้กับ Windows และ macOS (Linux รอไปก่อน) เลยลองแกะดูเล็กน้อย

launcher ตัวใหม่นี้ใช้ C++ เขียนโค้ดของการรันและดาวน์โหลดเกม ส่วน UI จะใช้ HTML, CSS, JS เขียน โดยใช้ผ่าน library CEF (Chromium) ซึ่งแตกต่างจากเดิมคือใช้ Java ทั้งหมดเลย

...

ส่วน Java นั้นก็จะใช้ของที่ Mojang ลงให้เอง ซึ่งโหลดมาในช่วงกำลังติดตั้ง launcher

โครงสร้างของ .minecraft ก็ยังเหมือนเดิม แต่มีการเพิ่ม assets/log_configs ไว้เก็บการตั้งค่าของ log4j ในแต่ละเวอร์ชัน และ launcher_log.txt ก็ตามชื่อมันเลยคือเก็บ log ของ launcher ตัวใหม่

ถ้าอ่านตาม comment ของ Reddit จะเห็นได้ว่ามีคนบ่นเรื่อง block ไม่ให้เปิดเกิน 1 instance ได้ แต่ตอนนี้ก็ใช้ launcher ตัวเก่าไปก่อน หรือถ้าออกมาเป็นตัวเต็มแล้วแต่อยากใช้แบบเดิม SKCraft Launcher น่าจะช่วยบรรเทาได้บ้าง

See More

ทาง Mojang ได้เปิดให้ทดลองใช้ Minecraft Launcher รุ่นใหม่แล้วนะครับ ไปลองกันได้

โพสที่แล้วผมแจกตัวไฟล์ที่แก้สระลอยโดยไม่ต้องใช้ mod

ถ้าใครดูรูปดีๆ จะเห็นได้ว่าป้ายมันแสดงผลยังไม่ถูก ก็คือมันแสดงผลให้มันอยู่ตรงกลางไม่ได้

การแสดงผลข้อความหรืออะไรต่างๆ ก็จะทำได้โดยการตั้งจุดที่จะต้องการแสดงผลที่ต้องการให้จุดนั้นอยู่ตรงกลาง

...

ภาษาไทยจะเขียนจากซ้ายไปขวา ถ้าแสดงผลปกติของข้อความ ตัวอักษรจะแสดงผลไปทางขวา แต่ถ้าอยากให้อยู่ตรงกลางก็ต้องขยับมาครึ่งหนึ่งของความยาวที่แสดงผลไปนั่นเอง

ถ้าใครอ่านโพสที่แล้ว ตัวอักษรพิเศษไม่ใช่ตัวอักษรที่แสดงผลแล้วเคลื่อนที่ไปข้างหน้า แต่จะทำตรงกันข้ามแทน พวกนี้จะแก้ไขใน glyph_sizes.bin

ปัญหามันอยู่ตรงที่การหาความยาวของตัวอักษรนี่แหละ เพราะมันมาจาก glyph_sizes.bin เหมือนกัน ตัวอักษรพิเศษนี่แหละที่มันมีปัญหา ที่ต้องการคือให้สระหรือตัวอักษรพิเศษมีขนาดเป็นศูนย์ แต่ผมคิดว่าไม่น่าจะเป็นไปได้

ถ้ามองที่ละอักษรผมคิดว่าวิธีแก้ไม่น่าจะมี แต่อย่างที่บอก การทำให้อยู่ตรงกลางคือการตั้งตำแหน่งของตัวอักษรในแกนนอนเป็นตำแหน่งที่ต้องการอยู่ตรงกลางในแนวแกนนอนลบด้วยผลรวมของขนาดตัวอักษรทุกตัวที่ถูกแสดงผลมาหารด้วยสอง ดังนั้นวิธีแก้แบบนี้ก็ง่ายๆ พิมพ์วรรคเข้าไปด้านหน้าแค่นั้นเอง

แต่เว้นวรรคมันมีความกว้าง 8 หน่วย จะทำให้น้อยกว่านี้ได้ยังไง ก็เพิ่มตัวอักษรพิเศษไปสิง่ายมาก... หรือจะสร้างตัวอักษรพิเศษที่เหมือนวรรคก็ได้นะ น่าจะประหยัดกว่าด้วย

เคยเห็นป้ายชื่อไหม? นั่นก็อีกปัญหาหนึ่ง ถ้าทำแบบนี้กับป้ายปกติ มันจะไม่เห็นวรรค แต่ถ้าเป็นป้ายชื่อคงดูไม่สวยแน่ๆ ตอนนี้ผมยังไม่มีวิธีแก้นะ

ส่วนเรื่องจะดักเปลี่ยนตัวอักษรยังไงให้หมดทั้งเซิร์ฟเวอร์ ผมคิดว่า ProtocolLib น่าจะให้คำตอบเรื่องนี้ได้ เช่นตอนส่งข้อความออกไปก็ดักแทรกตัวอักษรพิเศษที่ตรงนั้นเลย พอผู้เล่นส่งเข้ามาก็ลบตัวอักษรพิเศษออก ผมคิดว่ามันน่าจะใช้ได้อยู่ แต่ยังไม่ลองนะ ลองกันเองได้

สำหรับใครที่สงสัยว่า ProtocolLib คืออะไร มันก็คือ plugin ที่ทำตัวเหมือนเป็น library ให้ plugin ตัวอื่น ซึ่ง plugin นี้จะช่วยทำให้แก้ไขหรือส่ง packet (ข้อมูลที่ส่งระหว่างเซิร์ฟเวอร์และผู้เล่น) ได้ง่ายขึ้นและรองรับกับเซิร์ฟเวอร์รุ่นต่างๆ ง่ายขึ้น (เพราะคนที่ใช้ ProtocolLib ไม่ต้องแก้บ่อย แต่คนทำ ProtocolLib จะแก้บ่อยกว่า)

ผมว่าจะเขียนโพสนี้ตั้งแต่วันที่โพสโพสที่แล้ว แต่ผมเอาเวลาไปพัฒนาตัวนี้ต่อ ซึ่งตอนนี้ผมก็ปล่อยไว้อย่างนั้นแหละ ไม่คิดว่าจะเสร็จภายในเร็วๆ นี้ แต่ผมก็ขอโพสหลักการไว้เผื่อมีใครอยากพัฒนาต่อ หรือใครมีข้อสงสัยอะไรก็ถามได้ครับ

See More

มาลองเล่นดูครับ แก้ภาษาไทยโดยไม่ต้องลง mod แต่ใช้ resource pack และ plugin บน server แทน

หลักการก็ง่ายมาก แค่สร้างตัวอักษรใหม่ขึ้นมา แต่รูปร่างจะไม่มีนะครับ จะมีแค่สิ่งที่บอกขนาดของมันเท่านั้น โดยแก้ที่ glyph_sizes.bin (ตัวอักษรหมายเลข 0x0E60 อยู่ในส่วนของช่วงตัวอักษรที่ไม่ได้ใช้ของภาษาไทย มี glyph size เป็น 0x50) โดยหน้าที่ของมันจะลากตัวอักษรจากทางขวามาใกล้กัน 2 หน่วย ผมขอเรียกว่า "ตัวอักษรพิเศษ" นะครับ

จากนั้นก็ลบวงกลมด้านล่างตัวสระออกใน unicode_page_0e.png อันนี้ก็จบไปแล้ว...สำหรับส่วนของ resource pack

มาดูที่ plugin กันบ้าง ก็ง่ายๆ ครับ ดักข้อความเช่นแชท, ป้าย แล้วเอาขนาดของสระมาคำนวณจำนวนตัวอักษรพิเศษที่ต้องใช้ จากนั้นก็แทนที่ในข้อความ บู้ม! ก็จะได้ข้อความที่สระไม่ลอยแล้ว

ซึ่งหลักการแบบละเอียดก็ตามโพสก่อนๆ นั่นแหละครับ แสดงให้เห็นว่าสามารถใช้งานได้จริง

มีปัญหาอยู่สามที่ ที่แรกคือมันต้องส่งไปให้ server ก่อน ดังนั้นทุกอย่างในเกมตัวสระจะเหมือนเดิม เว้นแต่ server จะทำการแก้ ซึ่งอันนี้สามารถบรรเทาได้โดยการแก้ไฟล์ th_TH.lang แล้วเพิ่มตัวอักษรพิเศษเข้าไป

อีกปัญหาคือเกมคำนวณขนาดผิด ผมคิดว่าน่าจะแก้ได้ โดยหาวิธีปรับขนาดของตัวอักษรพิเศษให้มันไม่เละมากกว่านี้

และปัญหาในตำนานคือเกมไม่สามารถ reload glyph_sizes.bin ทำให้ต้องลง resource pack ก่อนเริ่มเกม สำหรับบัคนี้แก้แล้วในเวอร์ชัน 16w36a ซึ่งเป็น snapshot ของเวอร์ชัน 1.11 แต่ตอนนี้เวอร์ชัน 1.11 ยังไม่ออกมาเลย

ตัวนี้ผมให้แก้แค่แชทกับป้ายเท่านั้นนะครับ แต่ก็สามารถแก้ไขให้อย่างอื่นใช้ได้ด้วยก็ไม่ยาก

ถ้าไม่ได้ลง resource pack ก็จะเป็นสระลอยเหมือนเดิมนะครับ ข้อความตัวหนังสือจะเป็นเหมือนเดิมไม่พัง ดังนั้นผู้เล่นก็สามารถเลือกได้ครับว่าจะใช้ไหม

วิธีการคำนวณที่ผมใช้ก็ดังนี้นะครับ

ตำแหน่งเริ่มต้นของ texture = (2 * ขนาดตัวอักษรที่ต้องการ) + 3

โดยที่ขนาดของตัวอักษรจะตามขนาดของตัวอักษร ASCII (แบบ Unicode จะใหญ่ขึ้นจาก ASCII 1 เท่า) สำหรับก่อนเวอร์ชัน 1.9 ตำแหน่งเริ่มต้นของ texture ต้องไม่เกิน 7

ดาวน์โหลด: https://www.dropbox.com/…/wlw60c…/AABIurkiKl8d2-o9LZ8MQtosa…

thaifixes_hc_pack.zip คือ resource pack ส่วน thaifixes_hc_0.1.jar คือ plugin ของ Bukkit API (มีโค้ดอยู่ในนั้นด้วยลองแงะดูได้)

See More
No automatic alt text available.

ตอนนี้ ThaiFixes สำหรับ Forge 4.2-1.10.2 ลงมาไม่สามารถใช้งานกับ Immersive Engineering และ OptiFine พร้อมกันได้นะครับ ต้องลบ ThaiFixes หรือ OptiFine ออกตัวใดตัวหนึ่ง

สาเหตุ
- ThaiFixes แก้ modifier ของ OptiFine ใน method FontRenderer.getCharWidthFloat จาก private เป็น protected เพื่อให้รองรับ OptiFine
- ใน Immersive Engineering มี method getCharWidthFloat ใน child class ของ FontRenderer ซึ่งไม่ได้เกี่ยวกับ OptiFine แม้แต่น้อย (ไม่เจอการเปลี่ยน modifer ใน access transformer และ...ของ OptiFine จะเป็น private ซึ่งมันจะ override ไม่ได้)
- method getCharWidthFloat ของ Immersive Engineering จะเรียก method FontRenderer.getCharWidth ของ OptiFine
- method FontRenderer.getCharWidth ของ OptiFine จะเรียก FontRenderer.getCharWidthFloat
- เมื่อ FontRenderer.getCharWidthFloat สามารถถูก override โดย child class ได้ ดังนั้นการเรียก getCharWidthFloat ของ OptiFine ใน getCharWidth เมื่อมี method getCharWidthFloat ของ Immersive Engineering override อยู่ ก็จะเรียกใช้ getCharWidthFloat ของ Immersive Engineering
- ทำให้มันเรียกวนไปเรื่อยๆ จนเกิด StackOverflowError

See More

ThaiFixes 4.2-1.10.2 สำหรับ Minecraft Forge

- ปรับปรุงให้เข้ากับ Minecraft Forge 1.10.2-12.18.1.2020

ดาวน์โหลด: https://github.com/lion328/ThaiFixes/releases/tag/4.2-1.10.2

Image may contain: text and outdoor

ThaiFixes สำหรับ Minecraft 1.10.2 รุ่น Forge จะมีปัญหาเมื่อใช้กับ Minecraft Forge 1.10.2-12.18.1.2020 ขึ้นไปนะครับ เนื่องจากมีการเปลี่ยนแปลงระบบ class remap ของ Forge เอง ทำให้เกิด NullPointerException เพราะ map ของ class ต่างๆ ยังไม่ถูกโหลดขึ้นมา ทางแก้คือใช้รุ่นที่ต่ำกว่านั้นไปก่อนครับ