4 puan yazan GN⁺ 2024-03-04 | 1 yorum | WhatsApp'ta paylaş

Bash ile yazılmış bir Minecraft sunucusu üzerine düşünceler

  • Bash ile Minecraft sunucusu yazma üzerine değerlendirmeler.
  • Daha önce 2009 klasik protokolüyle denenmişti, ancak Bash'te ikili veri ayrıştırmada sınırlamalar olduğu görüldü.
  • Veriyi okumak ve onaltılık döküm üretmek için read ve xxd kullanma yöntemi geliştirildi.
  • Bash, null baytlarını yok sayıyor ve bunları algılamanın bir yolu olmadığı için veriler bozulabiliyor.

Bash'te null baytı okuma

  • dd ve xxd kullanarak null baytı içeren ikili verileri işleme yöntemi bulundu.
  • Bu yöntemle desen eşleme, veri çıkarma gibi işlemler yapılabiliyor.
  • ncat kullanılarak Minecraft'ın varsayılan TCP portunda dinleniyor ve bir bağlantı geldiğinde ana kabuk betiği (mc.sh) çalıştırılıyor.

Protokol aslında o kadar da iyi değil

  • Minecraft sunucusunun çalışması için uygulanması gereken ilk şey, sunucu listesi ping paketidir.
  • VarInt ve VarLong gibi veri tiplerini uygulamanın zorlukları anlatılıyor.
  • VarInt/VarLong sayıları uygulamak için LEB128 kodlama yöntemi kullanıldı.
  • IEEE754 kayan noktalı sayıları uygulamakta zorlanıldı ve bu sorun awk ile çözüldü.

"Position" veri tipi

  • Mojang'ın yaptığı Position veri tipi, X, Y, Z koordinatlarını 64 bitlik bir Long değerde saklıyor.
  • Bu veri tipi Bash'te nispeten kolay uygulanabiliyor.

Named Binary Tag

  • NBT, Mojang'ın ikili veriler için oluşturduğu JSON benzeri bir biçimidir.
  • NBT ayrıştırıcısı neredeyse tamamlanmıştı, ancak proje dizininin tmpfs olarak kullanılması ve sistem çökmesi nedeniyle kod kaybedildi.

Gerçek sunucuyu yazmak

  • Matematiksel kısmın ötesinde, gerçek bir sunucu oluşturmanın eğlenceli bölümüne geliniyor.
  • İstemcinin sunucuya katılabilmesi için el sıkışma sürecini tamamlaması ve birkaç paket göndermesi gerekiyor.
  • En büyük engeller, Join Game paketi ile Chunk paketi içindeki veri yapılarıdır.

"Eklenti" sistemi

  • Sunucunun basit chunk'ların ötesinde daha fazlasını yapabilmesi için, override edilebilir hook işlevleri ve sunucunun kullanıcı kodu yükleyebilmesini sağlayan bir seçenek oluşturuldu.
  • Böylece dünyanın görünümünü değiştirmekten, fareyi hareket ettirdiğinizde oyuncunun tık sesi çıkarmasına kadar çeşitli işlevler uygulanabiliyor.

Witchcraft'ın tuhaflıkları

  • Bash'in ondalıklı sayıları işlemede sınırlamaları vardır.
  • Çok oyunculu mod tamamen çalışmıyor.
  • Witchcraft çok iş parçacıklı bir sunucu, ancak iş parçacıkları arası iletişim için hack'ler kullanıyor.
  • Veri alışverişi hızı yavaş.
  • Yalnızca güncel BusyBox (1.35.0) kuruluysa çalışıyor.

SSS

  • Blok ID'lerinin nereden geldiği ve "WitchCraft" adının kökeni gibi sorular ve yanıtlar.

Kaynaklar

  • Witchcraft deposu, wiki.vg protokol belgeleri gibi kaynak bağlantıları sunuluyor.

GN⁺ görüşü

  • Bu proje, bir geliştiricinin Bash'in sınırlarını aşma konusundaki yaratıcılığını ve problem çözme becerisini gösteriyor.
  • Bash ile Minecraft sunucusu uygulamak çok verimsiz olabilir, ancak bu tür deneysel yaklaşımlar yeni çözümler bulmaya yardımcı olabilir.
  • Bu tekniğin gerçek oyun sunucularına uygulanması önerilmese de, betik dillerinin sınırlarını anlamak ve bunları aşma yollarını öğrenmek açısından faydalı olabilir.
  • Benzer işlevler sunan daha verimli sunucu uygulamaları arasında Java veya C++ ile yazılmış Minecraft sunucuları bulunur.
  • Bu proje, Bash kullanarak karmaşık ağ protokollerinin nasıl ele alınacağını anlamak için yararlı bir eğitim materyali olabilir.

1 yorum

 
GN⁺ 2024-03-04
Hacker News görüşleri
  • Betiklenebilir Minecraft sunucuları hakkında deneyim

    Java ve Bedrock (ScraM) için betiklenebilir Minecraft sunucuları üzerinde çok deneyimi olan bir kullanıcı, bunu etkileyici buluyor. Bir cümlede "duckduckgoing" kelimesini kullanmasına ayrıca puan vermek istediğini söylüyor. İlgili tartışmada 92 yorum var.

  • Negatif üslerin anlaşılması

    Negatif üslerin, yani 2^(-n)'in, 1/(2^n)'e eşit olduğunu belirtiyor ve yazarın kendi 2^-1 = 0.5 örneğini hatırlamayıp awk'tan yardım istemesine şaşırdığını ifade ediyor. ctypes.sh kütüphanesi kullanılsaydı bash içinden libm, poll(), select() ve benzerlerine erişilebileceğini öne sürüyor.

  • Gerçek bir hacker sitesine övgü

    Buranın gerçek bir hacker sitesi olduğunu söyleyip bunun çok harika olduğunu övüyor.

  • bash sevgisi

    bash'i sevdiğini, hatta vim ve lua kadar sevdiğini söylüyor. 2 MB'dan küçük tek bir binary olarak, çoğu insanın düşündüğünden çok daha yetenekli olduğunu vurguluyor. shellcheck ve iyi alışkanlıklarla bash'in de okunabilir ve güvenli olabileceğini belirtiyor. Ek işlevlere ihtiyaç duyulursa FFI gibi karmaşık yöntemlere başvurmadan C/C++ ile yardımcı araçlar eklenebileceğini, ayrıca pip/npm gibi araçlarla ne olduğu belirsiz tonla bağımlılığı içeri çekmek gerekmediğini açıklıyor.

  • bash programlamaya dair şaşkınlık

    bash programlamada çok yetkin olmadığını, ama pratikte ne kadar becerikli olabildiğine şaşırdığını ifade ediyor.

  • Özel sunucu yazımı hakkında merak

    Ticari oyunlar için özel sunucu yazmanın hâlâ yaygın olup olmadığını merak ediyor.

  • Minecraft'a övgü

    Minecraft'ı Quake'ten bu yana çıkan en büyük oyunlardan biri olarak değerlendiriyor.

  • Minecraft implementasyonuna hayranlık

    Minecraft'ın nasıl implement edildiğine dair çok sayıda makale okuduğunu, ancak bunun gerçekten olağanüstü olduğunu ve muhtemelen okudukları arasındaki en iyi teknik açıklamalardan biri olduğunu söylüyor. Birinci sınıf diye övüyor.