โคลน Minecraft สำหรับ Windows, Mac OS X และ Linux C เพียงไม่กี่พันบรรทัดโดยใช้ OpenGL (เชเดอร์) สมัยใหม่ การสนับสนุนผู้เล่นหลายคนออนไลน์รวมอยู่ในเซิร์ฟเวอร์ที่ใช้ Python
http://www.michaelfogleman.com/craft/
ไบนารีของ Mac และ Windows มีอยู่บนเว็บไซต์
http://www.michaelfogleman.com/craft/
ดูด้านล่างเพื่อเรียกใช้จากแหล่งที่มา
ดาวน์โหลดและติดตั้ง CMake หากคุณยังไม่มี คุณสามารถใช้ Homebrew เพื่อทำให้การติดตั้งง่ายขึ้น:
brew install cmake
sudo apt-get install cmake libglew-dev xorg-dev libcurl4-openssl-dev
sudo apt-get build-dep glfw
ดาวน์โหลดและติดตั้ง CMake และ MinGW เพิ่ม C:MinGWbin
ไปยัง PATH
ของคุณ
ดาวน์โหลดและติดตั้ง cURL เพื่อให้ CURL/lib และ CURL/include อยู่ในไดเร็กทอรี Program Files ของคุณ
ใช้คำสั่งต่อไปนี้แทนคำสั่งที่อธิบายไว้ในส่วนถัดไป
cmake -G "MinGW Makefiles"
mingw32-make
เมื่อคุณมีการขึ้นต่อกัน (ดูด้านบน) ให้รันคำสั่งต่อไปนี้ในเทอร์มินัลของคุณ
git clone https://github.com/fogleman/Craft.git
cd Craft
cmake .
make
./craft
หลังจากผ่านไปหลายปี craft.michaelfogleman.com ได้ถูกถอดออกแล้ว ดูส่วนเซิร์ฟเวอร์สำหรับข้อมูลเกี่ยวกับการโฮสต์ด้วยตนเอง
คุณสามารถเชื่อมต่อกับเซิร์ฟเวอร์ด้วยอาร์กิวเมนต์บรรทัดคำสั่ง...
./craft [HOST [PORT]]
หรือใช้คำสั่ง "/online" ในเกมนั่นเอง
/online [HOST [PORT]]
คุณสามารถเรียกใช้เซิร์ฟเวอร์ของคุณเองหรือเชื่อมต่อกับเซิร์ฟเวอร์ของฉัน เซิร์ฟเวอร์เขียนด้วยภาษา Python แต่ต้องใช้ DLL ที่คอมไพล์แล้ว จึงสามารถดำเนินการสร้างภูมิประเทศได้เหมือนกับไคลเอนต์
gcc -std=c99 -O3 -fPIC -shared -o world -I src -I deps/noise deps/noise/noise.c src/world.c
python server.py [HOST [PORT]]
/goto [NAME]
เทเลพอร์ตไปยังผู้ใช้รายอื่น หากไม่ได้ระบุ NAME ระบบจะเลือกผู้ใช้แบบสุ่ม
/list
แสดงรายการผู้ใช้ที่เชื่อมต่อ
/login NAME
สลับไปยังชื่อผู้ใช้ที่ลงทะเบียนไว้อื่น เซิร์ฟเวอร์การเข้าสู่ระบบจะได้รับการติดต่ออีกครั้ง ชื่อผู้ใช้ต้องตรงตามตัวพิมพ์เล็กและตัวพิมพ์ใหญ่
/logout
ยกเลิกการพิสูจน์ตัวตนและเป็นผู้ใช้ทั่วไป การเข้าสู่ระบบอัตโนมัติจะไม่เกิดขึ้นอีกจนกว่าจะออกคำสั่ง /login ใหม่
/offline [FILE]
สลับไปที่โหมดออฟไลน์ FILE ระบุไฟล์บันทึกที่จะใช้และมีค่าเริ่มต้นเป็น "craft"
/online HOST [PORT]
เชื่อมต่อกับเซิร์ฟเวอร์ที่ระบุ
/pq P Q
เทเลพอร์ตไปยังก้อนที่ระบุ
/spawn
เทเลพอร์ตกลับไปยังจุดเกิด
ภูมิประเทศถูกสร้างขึ้นโดยใช้สัญญาณรบกวน Simplex ซึ่งเป็นฟังก์ชันสัญญาณรบกวนที่กำหนดขึ้นตามตำแหน่ง ดังนั้นโลกจะถูกสร้างขึ้นในลักษณะเดียวกันในสถานที่ที่กำหนดเสมอ
โลกถูกแบ่งออกเป็นบล็อกขนาด 32x32 ชิ้นในระนาบ XZ (Y อยู่ด้านบน) สิ่งนี้ทำให้โลกมีความ “ไม่มีที่สิ้นสุด” (ความแม่นยำของจุดลอยตัวในปัจจุบันเป็นปัญหาที่ค่า X หรือ Z มาก) และยังช่วยให้จัดการข้อมูลได้ง่ายขึ้น ต้องสอบถามเฉพาะส่วนที่มองเห็นได้จากฐานข้อมูล
แสดงผลเฉพาะใบหน้าที่ถูกเปิดเผยเท่านั้น นี่เป็นการปรับปรุงที่สำคัญ เนื่องจากบล็อกส่วนใหญ่ถูกซ่อนไว้อย่างสมบูรณ์หรือเปิดเผยเพียงใบหน้าเดียวหรือสองหน้าเท่านั้น แต่ละก้อนจะบันทึกความกว้างหนึ่งบล็อกที่ทับซ้อนกันสำหรับแต่ละก้อนที่อยู่ใกล้เคียง เพื่อที่จะรู้ว่าบล็อกใดตามแนวเส้นรอบวงที่ถูกเปิดเผย
แสดงผลเฉพาะส่วนที่มองเห็นได้เท่านั้น วิธีการคัดแยกแบบไร้เดียงสาใช้เพื่อทดสอบว่ามีก้อนเนื้ออยู่ในมุมมองของกล้องหรือไม่ ถ้าไม่ใช่ก็จะไม่เรนเดอร์ ซึ่งส่งผลให้มีการปรับปรุงประสิทธิภาพที่ค่อนข้างดีเช่นกัน
บัฟเฟอร์กลุ่มจะถูกสร้างขึ้นใหม่ทั้งหมดเมื่อบล็อกมีการเปลี่ยนแปลงในกลุ่มนั้น แทนที่จะพยายามอัปเดต VBO
ข้อความถูกแสดงผลโดยใช้แผนที่บิตแมป อักขระแต่ละตัวจะแสดงผลบนสามเหลี่ยมสองอันที่ก่อตัวเป็นรูปสี่เหลี่ยมผืนผ้า 2 มิติ
ใช้ OpenGL “สมัยใหม่” - ไม่มีการใช้ฟังก์ชันไปป์ไลน์ฟังก์ชันคงที่ที่เลิกใช้แล้ว ออบเจ็กต์บัฟเฟอร์ Vertex ใช้สำหรับพิกัดตำแหน่ง ปกติ และพื้นผิว มีการใช้จุดยอดและเชเดอร์แฟรกเมนต์ในการเรนเดอร์ ฟังก์ชันการจัดการเมทริกซ์อยู่ใน matrix.c สำหรับเมทริกซ์การแปล การหมุน เปอร์สเปคทีฟ ออโธกราฟิก ฯลฯ โมเดล 3 มิติประกอบด้วยวัตถุพื้นฐานที่เรียบง่าย ซึ่งส่วนใหญ่เป็นลูกบาศก์และสี่เหลี่ยม โมเดลเหล่านี้สร้างขึ้นในโค้ดใน cube.c
ความโปร่งใสในบล็อกแก้วและต้นไม้ (พืชไม่ได้ใช้รูปทรงสี่เหลี่ยมเต็มรูปแบบของรูปสามเหลี่ยมดั้งเดิม) ถูกนำมาใช้โดยการทิ้งพิกเซลสีม่วงแดงในแฟรกเมนต์เชเดอร์
การเปลี่ยนแปลงของผู้ใช้ในโลกจะถูกเก็บไว้ในฐานข้อมูล sqlite มีเพียงเดลต้าเท่านั้นที่ถูกจัดเก็บ ดังนั้นโลกเริ่มต้นจะถูกสร้างขึ้น จากนั้นการเปลี่ยนแปลงของผู้ใช้จะถูกนำไปใช้ที่ด้านบนเมื่อโหลด
ตารางฐานข้อมูลหลักชื่อ "บล็อก" และมีคอลัมน์ p, q, x, y, z, w (p, q) ระบุชิ้นส่วน (x, y, z) ระบุตำแหน่งบล็อก และ (w) ระบุประเภทบล็อก 0 หมายถึงบล็อกว่าง (อากาศ)
ในเกม ชิ้นส่วนต่างๆ จะเก็บบล็อกไว้ในแผนที่แฮช คีย์ (x, y, z) แมปกับค่า (w)
ตำแหน่ง y ของบล็อกถูกจำกัดไว้ที่ 0 <= y < 256 ขีดจำกัดบนส่วนใหญ่เป็นข้อจำกัดที่สร้างขึ้นเพื่อป้องกันไม่ให้ผู้ใช้สร้างโครงสร้างสูงโดยไม่จำเป็น ผู้ใช้ไม่ได้รับอนุญาตให้ทำลายบล็อกที่ y = 0 เพื่อหลีกเลี่ยงการตกอยู่ใต้โลก
โหมดผู้เล่นหลายคนถูกนำมาใช้โดยใช้ซ็อกเก็ตแบบเก่าธรรมดา ใช้โปรโตคอล ASCII แบบบรรทัดอย่างง่าย แต่ละบรรทัดประกอบด้วยโค้ดคำสั่งและอาร์กิวเมนต์ที่คั่นด้วยเครื่องหมายจุลภาคเป็นศูนย์หรือมากกว่า ไคลเอนต์ร้องขอชิ้นส่วนจากเซิร์ฟเวอร์ด้วยคำสั่งง่ายๆ: C,p,q,key “C” หมายถึง “ก้อน” และ (p, q) ระบุก้อน คีย์นี้ใช้สำหรับการแคช - เซิร์ฟเวอร์จะส่งเฉพาะการอัปเดตบล็อกที่ได้ดำเนินการตั้งแต่ไคลเอนต์ถามถึงชิ้นส่วนนั้นครั้งล่าสุด การอัปเดตบล็อก (แบบเรียลไทม์หรือเป็นส่วนหนึ่งของคำขอก้อน) จะถูกส่งไปยังไคลเอนต์ในรูปแบบ: B,p,q,x,y,z,w หลังจากส่งบล็อกทั้งหมดสำหรับชิ้นส่วนที่ร้องขอแล้ว เซิร์ฟเวอร์จะส่งคีย์แคชที่อัปเดตในรูปแบบ: K,p,q,key ลูกค้าจะเก็บคีย์นี้และใช้ในครั้งถัดไปที่ต้องการขอชิ้นส่วนนั้น ตำแหน่งผู้เล่นจะถูกส่งในรูปแบบ: P,pid,x,y,z,rx,ry pid คือ ID ผู้เล่น และค่า rx และ ry ระบุการหมุนของผู้เล่นในสองแกนที่แตกต่างกัน ไคลเอนต์แก้ไขตำแหน่งผู้เล่นจากการอัปเดตตำแหน่งสองตำแหน่งที่ผ่านมาเพื่อให้แอนิเมชั่นราบรื่นยิ่งขึ้น ไคลเอนต์ส่งตำแหน่งไปยังเซิร์ฟเวอร์มากที่สุดทุกๆ 0.1 วินาที (น้อยกว่านี้หากไม่เคลื่อนไหว)
การแคชฝั่งไคลเอ็นต์ไปยังฐานข้อมูล sqlite อาจต้องอาศัยประสิทธิภาพการทำงานสูงเมื่อเชื่อมต่อกับเซิร์ฟเวอร์เป็นครั้งแรก ด้วยเหตุนี้ การเขียน sqlite จึงดำเนินการบนเธรดพื้นหลัง การเขียนทั้งหมดเกิดขึ้นในธุรกรรมเพื่อประสิทธิภาพ การทำธุรกรรมเกิดขึ้นทุกๆ 5 วินาที ซึ่งตรงข้ามกับจำนวนงานที่เสร็จสมบูรณ์ตามตรรกะ บัฟเฟอร์แบบวงแหวน / แบบวงกลมถูกใช้เป็นคิวสำหรับข้อมูลที่จะเขียนลงในฐานข้อมูล
ในโหมดผู้เล่นหลายคน ผู้เล่นสามารถสังเกตกันและกันได้ในมุมมองหลักหรือในมุมมองภาพซ้อนภาพ การใช้งาน PnP ทำได้ง่ายมากอย่างน่าประหลาดใจ เพียงแค่เปลี่ยนวิวพอร์ตและเรนเดอร์ฉากอีกครั้งจากมุมมองของผู้เล่นคนอื่น
การทดสอบการตี (สิ่งที่บล็อกที่ผู้ใช้ชี้ไป) จะดำเนินการโดยการสแกนรังสีจากตำแหน่งของผู้เล่นออกไปด้านนอก ตามเวกเตอร์การมองเห็น นี่ไม่ใช่วิธีการที่แม่นยำ ดังนั้นอัตราขั้นตอนจึงอาจลดลงเพื่อให้แม่นยำยิ่งขึ้น
การทดสอบการชนจะปรับตำแหน่งของผู้เล่นให้อยู่ห่างจากบล็อกที่อยู่ติดกันซึ่งเป็นอุปสรรค (เมฆและต้นไม้ไม่ได้ถูกมองว่าเป็นสิ่งกีดขวาง ดังนั้นคุณจึงผ่านมันไปได้)
โดมท้องฟ้าที่มีพื้นผิวใช้สำหรับท้องฟ้า พิกัด X ของพื้นผิวแสดงถึงเวลาของวัน แผนที่ค่า Y จากด้านล่างสุดของทรงกลมท้องฟ้าไปจนถึงด้านบนของทรงกลมท้องฟ้า ผู้เล่นจะอยู่ตรงกลางทรงกลมเสมอ ตัวแบ่งส่วนสำหรับบล็อกยังเก็บตัวอย่างพื้นผิวท้องฟ้าเพื่อกำหนดสีหมอกที่เหมาะสมเพื่อผสมผสานตามตำแหน่งของบล็อกที่สัมพันธ์กับท้องฟ้าด้านหลัง
มีการใช้การบดเคี้ยวโดยรอบตามที่อธิบายไว้ในหน้านี้:
http://0fps.wordpress.com/2013/07/03/ambient-occlusion-for-minecraft-like-worlds/