
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.
- v1.4.0 MC 26.1.2indir
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.

Bir kütük kümesi ancak üç kontrol birden "bu, dokunulmamış vahşi bir ağaç" dediğinde deviriliyor:
- 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.
- 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.
- 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
- Son sürümden ya da Modrinth'ten
BlackTimber-1.4.0.jardosyasını indirin. - Jar'ı sunucunun
pluginsklasörüne koyun. - Sunucuyu başlatın. İlk açılışta bir
config.ymloluş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ı:
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.



