BlackTimber: Folia İçin Akıllı Ağaç Kesimi
c/plugin Can Çebi u/can · · 6 dk · 24

BlackTimber: Folia İçin Akıllı Ağaç Kesimi

Tek bir kütüğü kır, bütün ağaç düşsün; ama evler, ağaç evler ve elle dikilmiş ağaçlar yerinde kalsın. Folia için sıfırdan yazdığım, hiçbir bağımlılığı olmayan bir Minecraft eklentisinin hem hikâyesi hem de kullanım kılavuzu.

Sürümler
  • v1.4.0 MC 26.1.2
    indir

Bu sayfayı çoğunlukla araştırma ve yazılım notlarıyla dolduruyorum. Bu sefer elimde biraz farklı bir konu var: küçük bir Minecraft eklentisi. Boş vakitlerimde bir sunucu kurcalarken çıktı ortaya. Fikir kulağa gayet basit geliyor, bir ağacın tek kütüğünü kırınca bütün ağaç deviriliyor. Ama aynı işi oyuncuların emeğine dokunmadan, üstelik Folia'nın çok çekirdekli yapısında doğru biçimde yapmak, başta sandığımdan çok daha keyifli bir uğraşa dönüştü.

Aşağıda hem eklentiyi neden bu şekilde kurduğumu anlattım hem de kurulumundan komutlarına kadar günlük kullanım için gereken her şeyi bir araya getirdim. Yani bu sayfa hem bir hikâye hem de bir başvuru kılavuzu olarak okunabilir. Kaynak kodu ve sürümler GitHub ile Modrinth üzerinde.

Neden Bir Ağaç Kesme Eklentisi?

İşin başında beni asıl rahatsız eden şey şuydu: o güne kadar denediğim ağaç kesme eklentilerinin hepsi, kütükten yapılmış ne varsa deviriyordu. Bir üssün dibinde baltayı yanlış savurduğunuz an bir duvar, bir zemin, hatta koca bir ağaç ev göz açıp kapayıncaya kadar yok oluyordu. İnsanın bir daha o eklentiyi açası gelmiyor.

Ben tam tersini istedim. Eklenti yalnızca doğanın büyüttüğü ağaçları kessin, oyuncunun eliyle koyduğu hiçbir şeye dokunmasın. Bunun için de bir kütük kümesini devirmeden önce, onun gerçekten vahşi bir ağaç olduğundan emin olması gerekiyordu. Yani önce kanıt, sonra balta.

Ağacı Yapıdan Ayırmak: Üç Kontrol

İşin püf noktası, Minecraft'ın yaprakları nasıl sakladığında gizliydi. Her yaprak bloğu persistent adında bir bayrak taşır. Doğal ya da büyüyen bir ağacın yaprakları bu bayrakta false görünür ve ağaç kesilince zamanla çürür. Oyuncunun elle yerleştirdiği yapraklar ise (İpeksi Dokunuş'la toplanıp tekrar konanlar da buna dahil) true olur ve hiç çürümez. İlk kontrolüm tam buradan doğdu.

Ağacı yapıdan ayıran üç kontrol

Bir kütük kümesi ancak üç kontrol birden "bu, dokunulmamış vahşi bir ağaç" dediğinde deviriliyor:

  1. Doğal yaprak. Kümenin çevresinde doğal yaprak yoksa orası bir yapıdır, eklenti dokunmaz. Sade bir tahta ev böylece güvende kalır.
  2. Yerleştirilmiş kütük. Oyuncunun elle koyduğu her kütüğü hatırlıyorum. Kümede tek bir tane bile varsa bütün ağaç korunuyor. Tepesinde hâlâ doğal yaprak duran bir ağaç ev bile bu sayede ayakta kalıyor.
  3. Bağlı yapı. Kütüklere tahta, merdiven, çit, kapı ya da cam gibi işlenmiş bloklar değiyorsa orası bir yapıdır. Bunlar zaten vahşi bir ağaçta kendiliğinden bitmez.

Kural aslında tek cümleye sığıyor: yalnızca doğal yaprak varsa, yerleştirilmiş kütük yoksa ve bağlı bir yapı yoksa kes. Diktiğiniz bir fidan normal şekilde devrilir, çünkü büyüyerek oluşan kütükler "yerleştirilmiş" sayılmaz. Ama bir ağaca bir şey inşa ettiğiniz anda o ağaç koruma altına giriyor.

Folia İçin Baştan Yazmak

En çok kafa yorduğum kısım burasıydı. Folia, dünyayı paralel işlenen bölgelere ayırıyor ve klasik anlamda tek bir ana iş parçacığı yok. Bir bloğun verisine yalnızca o bölgeyi tutan iş parçacığı dokunabiliyor. Eski Bukkit zamanlayıcısını çağıran bir eklenti bu modelde çöküyor.

Bu yüzden BlackTimber'ı baştan Folia'ya göre yazdım. Kırma olayı zaten kütüğün bölgesini tutan iş parçacığında çalıştığından, normal bir ağaç hiçbir iş parçacığı sınırını aşmadan yerinde deviriliyor. Çok büyük bir kesim söz konusuysa, mesela dev bir sekoya, işi bölge zamanlayıcısıyla tiklere yayıyorum. Her tikte sabit sayıda kütük kırılıyor ki tek bir bölge takılıp kalmasın.

Sıcak yolda gereksiz yere nesne üretmemeye de dikkat ettim. Blok türleri önbelleğe alınmış etiketlerle kontrol ediliyor, arama tek bir ArrayDeque üzerinde yürüyor, ziyaret edilen konumlar tek bir long içine paketleniyor. Oyuncunun koyduğu kütükleri hatırlamak için ayrıca bir veritabanı da kurmadım; konumlar doğrudan parçanın kendi veri kabında (chunk PersistentDataContainer) duruyor. Böylece parçayla birlikte diske yazılıyor ve sunucu yeniden başlasa bile kaybolmuyor.

Menüler ve Oyuncu Kontrolü

Eklentiyi tamamen yöneticinin config dosyasına hapsetmek istemedim. /blacktimber her oyuncuya dört anahtar açıyor: ağaç kesimi, yaprak kırma, otomatik toplama ve fidan dikimi. Yapılan seçimler oyuncu başına saklanıyor ve sunucu yeniden başlasa bile duruyor.

Yöneticiler içinse /blacktimber admin on sekiz ayarı doğrudan oyun içinde açıyor. Her değişiklik anında config.yml'ye yazılıyor, reload'a bile gerek kalmıyor. Bir de küçük bir sürükle-bırak loot editörü var; yaprak kırarken biyoma göre değişen bonus ödüller düşmesini isteyenler için. Hepsi tek bir komutun ardında, tek bir jar dosyasının içinde.

Kurulum, Komutlar ve İzinler

Kullanması fazlasıyla sade bir eklenti. Yanında başka bir kütüphane ya da veritabanı istemiyor, jar'ı atıp başlatmak yetiyor.

Gereksinimler

  • Folia veya Paper 26.1.2 (api-version: 26.1)
  • Java 25

Kurulum

  1. Son sürümden ya da Modrinth'ten BlackTimber-1.4.0.jar dosyasını indirin.
  2. Jar'ı sunucunun plugins klasörüne koyun.
  3. Sunucuyu başlatın. İlk açılışta bir config.yml oluşturulur.

Komutlar

Eklentinin tek bir komutu var: /blacktimber (kısayolu /bt).

Komut Ne yapar İzin
/blacktimber Kişisel ayar menünüzü açar blacktimber.use
/blacktimber on, off, toggle Size özel ağaç kesimini açıp kapatır blacktimber.use
/blacktimber leaves <on/off> Yaprak kırmayı açıp kapatır blacktimber.use
/blacktimber pickup <on/off> Otomatik toplamayı açıp kapatır blacktimber.use
/blacktimber replant <on/off> Fidan dikimini açıp kapatır blacktimber.use
/blacktimber admin Yönetici panelini açar blacktimber.admin
/blacktimber reload config.yml'yi yeniden yükler blacktimber.admin

İzinler

İzin Varsayılan Açıklama
blacktimber.use herkes Ağaç kesimi ve kişisel menü ile komutlar
blacktimber.admin operatörler Yönetici paneli ve yeniden yükleme

Yapılandırma

config.yml'yi /blacktimber reload ile yeniden yükleyebilir, aynı değerleri yönetici panelinden de değiştirebilirsiniz. Günlük kullanımda en çok işinize yarayacak birkaç ayar şunlar:

Anahtar Varsayılan Açıklama
require-natural-leaves true Yalnızca doğal yaprağı olan kümeleri kes, yapıları korur
max-logs 150 Tek seferde kesilecek kütük üst sınırı
require-axe true Yalnızca elde balta varken çalış
protect-player-built true İçinde yerleştirilmiş kütük olan kümeyi asla kesme
protect-structures true Kütüklere işlenmiş blok değiyorsa ağacı koru
leaf-loot-enabled true Kırılan yapraklardan bonus ödül
telemetry true Anonim kullanım istatistiği, aşağıda anlatıyorum

Ayarların tamamı, açıklamalarıyla birlikte config.yml dosyasının içinde yer alıyor.

Ne Kadar Kullanılıyor?

Açık kaynak bir işin ne kadar kullanıldığını görmenin tek yolu, sunucuların gönüllü olarak küçük bir sinyal göndermesi. BlackTimber on beş dakikada bir yalnızca şu kadarını yolluyor: sunucunun kendisi için ürettiği rastgele bir kimlik, o anki oyuncu sayısı ve yazılım ile sürüm bilgisi. IP saklanmıyor, oyuncu adı ya da kimliği asla gönderilmiyor. Veri tamamen anonim ve toplu; tıpkı bStats'ın yaptığı gibi, GDPR ve KVKK'nın kapsadığı kişisel veri sınıfına girmiyor. İstemeyen, config.yml'de telemetry: false diyerek her şeyi tek satırda kapatabiliyor.

Aşağıdaki sayılar canlı:

BlackTimber canlı ağ istatistikleri

Kapanış

Bunca yazının kısa özeti şu: bazen insana en çok keyif veren iş, küçük ama hakkıyla çözülmüş bir problemdir. Bir ağacın devrilişini izlemek bile, arkasındaki kuralı kendi elinizle kurduğunuzda başka bir tat veriyor. Eklenti açık kaynak; dilediğiniz gibi kurcalayın, kırın, geliştirin. Umarım sizin sunucunuzda da işinizi görür.

Bağlantılar

Kaynak kod ve sürümler, GitHub

Modrinth sayfası ve indirme

1.4.0 sürümünü indir