
CoreProtect — Minecraft Java Edition 1.16 - 1.21.11+
Bağımlılıklar: · Yükleyici: Bukkit, Spigot, Paper, Purpur, Folia · Minecraft sürümü: 1.16 - 1.21.11+ · Mod sürümü: 23.2 Minecraft çok…
Bağımlılıklar: · Yükleyici: Bukkit, Spigot, Paper, Purpur, Folia · Minecraft sürümü: 1.16 - 1.21.11+ · Mod sürümü: 23.2 Minecraft çok oyunculu sunucuları, haritada yetkisiz değişiklikleri ve oyun içi değerli eşyaların ç
Bağımlılıklar:
· Yükleyici: Bukkit, Spigot, Paper, Purpur, Folia
· Minecraft sürümü: 1.16 - 1.21.11+
· Mod sürümü: 23.2
Minecraft çok oyunculu sunucuları, haritada yetkisiz değişiklikleri ve oyun içi değerli eşyaların çalınmasını önlemek için oyuncu eylemlerinin ayrıntılı bir denetimine ihtiyaç duyar. Sunucunun vanilla çekirdeği ne arazinin düzenleme geçmişini ne de eşyaların kaplardaki hareketini kaydeder; bu nedenle yöneticiler, harita dosyalarını yedeklerden tamamen geri yüklemeden ihlalcileri belirleme veya yıkımları geri alma olanağından yoksun kalır. CoreProtect sunucu eklentisi, dünyayı değiştiren tüm olayları kaydeder, kullanıcı eylemlerinin ayrıntılı dizinlerini oluşturur ve karmaşık parametrik sorgulara dayanarak alanın noktasal geri almalarını (rollback) gerçekleştirir. Araç, sunucunun ana iş parçacığını gecikmelerden korumak için işlemleri bir kuyruğa yazarak asenkron modda çalışır.
1. Veritabanları ve asenkron günlükleme mimarisi
CoreProtect eklentisi, sunucu olaylarını Bukkit/Paper API'nin olay işleyicileri aracılığıyla yakalar. Saniyede binlerce kaydın işlenmesi sırasında sunucunun ana iş parçacığının (Server Thread) bloke olmasını önlemek için eklenti, asenkron bir günlükleme modeli kullanır. Olaylar (bir bloğun yıkılması, sandık envanterinin değiştirilmesi, bir komutun kullanılması) önce dahili dinamik bir ara bellek olan DataQueue içine yerleştirilir. Arka planda çalışan bir tüketici iş parçacığı (Consumer Thread), işlemleri ara bellekten okur ve bunları toplu işlemler (Batch processing) hâlinde veritabanına yazar; bu da depolama birimi üzerindeki yükü azaltır.
Eklenti, iki veritabanı yönetim sistemiyle (VTYS) çalışmayı destekler:
1. SQLite (varsayılan olarak yerel): Tüm bilgiler, eklentinin dizinindeki database.db dosyasına yazılır. SQLite, üçüncü taraf hizmetlerin kurulmasını gerektirmez; bu da onu düşük işlem hacmine sahip küçük yerel sunucular için kullanışlı kılar.
2. MySQL / MariaDB (harici sunucu): Ayrı bir veritabanı sunucusuna ağ bağlantısı kullanır. Bu çözüm, yüksek çevrimiçi oyuncu sayısına (50 oyuncudan itibaren) sahip büyük sunucular ve sunucu ağları için endüstri standardıdır. MySQL, dizinli sorguların yüksek yürütme hızını sağlar ve yerel depolamanın parçalanmasını ortadan kaldırır.
Veritabanı tablolarının şeması
CoreProtect, veri depolamayı optimize etmek için bir dizi ilişkisel tablo oluşturur. Her kayıt için tam metin dizeleri saklamak yerine eklenti, oyuncuların, dünyaların, blok türlerinin ve varlıkların benzersiz adları için sözlük tabloları kullanır.
Tablo | Amaç | Ana alanlar |
|---|---|---|
| Kullanıcı adları sözlüğü |
|
| Oyun dünyaları sözlüğü |
|
| Dünyadaki blok değişiklikleri kaydı |
|
| Kaplardaki eşya işlemleri |
|
| Oturum açma kayıtları günlüğü (giriş/çıkış) |
|
| Metin tabelalarının içeriği |
|
| Yaratıkların ölümü ve doğması hakkında kayıtlar |
|
Tüm x, y, z koordinatları, belirli bir yarıçap içindeki işlemlerin anında aranmasını sağlamak için dünya tanımlayıcısı wid ile birlikte dizinlenir.
2. Komut sözdizimi ve filtreleme parametreleri
CoreProtect veritabanıyla etkileşim, metin komutları aracılığıyla gerçekleşir. Başlıca işlemler şunlardır: inceleme, arama, geri alma ve geri almanın iptali.
Müfettiş modu /co inspect veya /co i)
Komut, istemciyi yerel denetim moduna geçirir. Etkinleştirildikten sonra oyuncu, günlükleri almak için dünyayla etkileşime girebilir:
· Mevcut bir bloğa sol tıklamak, onu yerleştiren kişinin takma adını, tarihi, saati ve koordinatları sohbete yazar.
· Boş bir yüzeye (veya bloğa) sağ tıklamak, daha önce bu alanı kaplayan veya sökülen blokların geçmişini gösterir.
· Bir kaba (sandık, fırın, fıçı, shulker) sağ tıklamak, eşyaların hareket günlüğünü gösterir.
Sorgu filtreleme parametreleri /co rollback, /co restore, /co lookup)
Veri seçimi için eklenti, parametre:değer biçiminde birleşik parametreler kullanır. Parametreler boşluklarla ayrılır:
1. Kullanıcı u:<ad>): Kontrol edilecek oyuncuyu belirtir. Virgülle ayrılmış birden fazla ad belirtilebilir (örneğin, u:Stevie,Alex). Doğal olayları geri almak için teknik tanımlayıcılar kullanılır:
· u:#fire – ateşin yayılması.
· u:#lava – lavın yayılması.
· u:#water – suyun yayılması.
· u:#creeper – bir creeper'ın patlaması.
· u:#tnt – TNT patlaması.
· u:#enderman – bir enderman'ın blokları taşıması.
2. Zaman t:<değer>): Analiz için zaman aralığı. Şu ölçü birimlerini destekler: s (saniye), m (dakika), h (saat), d (gün), w (hafta), y (yıl). Birimleri birleştirmeye izin verilir, örneğin: t:2w4d6h (2 hafta, 4 gün ve 6 saat).
3. Yarıçap r:<sayı>): Komutu çalıştıran kişinin etrafındaki blok cinsinden arama bölgesinin yarıçapı. Ayrıca özel değerleri de destekler:
· r:#global – tüm veritabanında arama (yüklenmiş tüm chunk'lar içinde).
· r:#world – mevcut oyun dünyası içinde arama.
· r:#chunk – oyuncunun mevcut chunk'ında arama.
· r:#selection (veya r:#we) – aramayı WorldEdit'in mevcut seçim ızgarasının sınırlarıyla kısıtlar.
4. Eylem a:<tür>): Kayıtları işlem türüne göre filtreler:
· a:block – blokların yerleştirilmesi ve yıkılması.
· a:+block – yalnızca blokların yerleştirilmesi.
· a:-block – yalnızca blokların yıkılması.
· a:container – envanter işlemleri.
· a:+container – bir kaba eşya ekleme.
· a:-container – bir kaptan eşya çıkarma.
· a:kill – hayvanların ve canavarların ölümü.
· a:spawn – varlıkların doğması.
· a:chat – sohbetteki mesajlar.
· a:command – girilen komutlar.
· a:session – oyuncuların oturum açması.
5. Bloklar b:<malzeme>): Aramayı belirtilen malzemelerle sınırlar (örneğin, b:stone,oak_planks).
6. Hariç tutma e:<malzeme>): Malzemeleri işlemden hariç tutar (örneğin, e:tnt).
Geri almanın önizlemesi ve işlemlerin iptali
Büyük ölçekli geri almalar sırasında hataları en aza indirmek için CoreProtect, görsel bir simülasyon sistemini destekler:
1. Geri alma komutunun #preview bayrağıyla çalıştırılması (örneğin, /co rollback u:Griefer t:2h r:20 #preview) harita dosyalarını değiştirmez. Bunun yerine istemci, mevcut işleme oturumunda blok değişikliği paketlerini alır. Yönetici dünyayı "geri alma sonrası" durumunda görürken, diğer oyuncular için bloklar değişmeden kalır.
#preview
/co apply
2. Sonucu uygulamak için /co apply komutu kullanılır.
3. Önizlemeyi iptal etmek için /co cancel komutu kullanılır.
4. Zaten gerçekleştirilmiş fiziksel bir geri almayı iptal etmek için, koordinatları /co rollback komutunun çalıştırılmasından önceki duruma döndüren /co undo komutu uygulanır.
3. config.yml yapılandırma dosyasının tam açıklaması
Yapılandırma dosyası, limitleri, günlükleme parametrelerini ve veritabanlarına bağlantıyı yönetir.
Genel parametreler bloğu (General Settings)
· verbose: true – geri almaların yürütülmesi sırasında değiştirilen her koordinat hakkında konsola ayrıntılı bir rapor yazar. false olarak ayarlanırsa yalnızca değiştirilen blokların toplam sayısı gösterilir.
· check-updates: true – başlatma sırasında geliştiricinin sunucularında eklentinin yeni sürümlerinin olup olmadığını denetler.
· api-enabled: true – üçüncü taraf eklentilerin CoreProtect verileriyle etkileşime girmesine izin verir.
· default-radius: 10 – bu parametre komutta belirtilmezse varsayılan geri alma yarıçapı.
· max-radius: 250 – tek bir komut için maksimum yarıçapı sınırlar. 0 değeri sınırlamayı kaldırır.
Günlükleme parametreleri bloğu (Logging Settings)
Bu parametreler, tam olarak hangi olayların veritabanına yazılacağını belirler. Gereksiz günlüklerin devre dışı bırakılması, veritabanının boyutunu küçültmeye yardımcı olur:
· block-place: true / block-break: true – oyuncuların blokları olağan biçimde yerleştirmesi ve yıkmasının günlüklenmesi.
· natural-break: true – kaymalar veya destek bloklarının yıkılması sonucu blokların düşmesinin günlüklenmesi (örneğin, üzerinde bir meşalenin tutunduğu bloğun kırılması).
· block-movement: true – kum, çakıl veya betonun yer çekimiyle düşmesinin günlüklenmesi.
· pistons: true – blokların pistonlar yardımıyla taşınmasının günlüklenmesi.
· block-burn: true – blokların ateşle yok edilmesinin günlüklenmesi.
· block-ignite: true – oyuncuların blokları çakmak taşı veya ateş topları yardımıyla tutuşturmasının günlüklenmesi.
· explosions: true – TNT, creeper, Nether'daki yataklar veya End kristallerinin patlamalarının günlüklenmesi.
· entity-kills: true – köylülerin, hayvanların, canavarların ve zırh askılıklarının ölümünün kaydedilmesi.
· player-chat: true / player-command: true – sohbet mesajlarının ve konsol komutlarının günlüklenmesi.
· player-session: true – oyuncuların sunucuya giriş ve çıkış zamanlarının günlüklenmesi.
· container-transactions: true – sandık, fırın, huni ve shulker'lardaki eşya hareket işlemlerinin günlüklenmesi.
Veritabanı bloğu (Database Settings)
· use-mysql: false – veritabanı türü anahtarı. true olarak ayarlanırsa eklenti, harici bir MySQL VTYS'ye bağlanır.
· table-prefix: co_ – SQL tablolarının adları için ön ek.
· mysql-host: localhost – MySQL veritabanı sunucusunun IP adresi veya alan adı.
· mysql-port: 3306 – bağlantı için ağ portu.
· mysql-database: minecraft – hedef veritabanının adı.
· mysql-username: root – veritabanı kullanıcı adı.
· mysql-password: password – kullanıcının parolası.
· mysql-ssl: false – veritabanı sunucusuna bağlantının SSL şifrelemesini etkinleştirir.
4. Eklenti geliştiricileri için API
CoreProtect, geliştiricilere CoreProtectAPI sınıfı aracılığıyla veritabanına erişim sağlar. Bu, diğer eklentilerin (örneğin WorldEdit veya koruma sistemleri) kendi değişikliklerini kaydetmesine veya geçmişte otomatik arama yapmasına olanak tanır.
API'nin başlatılması
API'ye bağlanmak için başlatma yöntemi kullanılır:
import net.coreprotect.CoreProtect; |
API arabiriminin başlıca yöntemleri
· boolean logPlacement(String user, Location location, Material type, BlockData blockData) – belirtilen kullanıcı adına bir bloğun yerleştirilmesini veritabanına kaydeder.
· boolean logRemoval(String user, Location location, Material type, BlockData blockData) – bir bloğun yıkılmasını kaydeder.
· boolean logContainerTransaction(String user, Location location, Material type, ItemStack itemStack, boolean isAdded) – bir kaba eşya ekleme (true) veya kaptan eşya çıkarma (false) işlemini kaydeder.
· List<String[]> performLookup(int time, List<String> restrictUsers, List<String> excludeUsers, List<Object> restrictBlocks, List<Object> excludeBlocks, List<Integer> restrictActions, int radius, Location location) – belirtilen filtrelere göre bir arama gerçekleştirir ve sonuç dizisini döndürür.
· List<String[]> performRollback(int time, List<String> restrictUsers, List<String> excludeUsers, List<Object> restrictBlocks, List<Object> excludeBlocks, List<Integer> restrictActions, int radius, Location location) – dünyadaki değişikliklerin asenkron bir geri almasını başlatır.
· List<String[]> performRestore(int time, List<String> restrictUsers, List<String> excludeUsers, List<Object> restrictBlocks, List<Object> excludeBlocks, List<Integer> restrictActions, int radius, Location location) – değişikliklerin asenkron bir geri yüklemesini başlatır.
· boolean hasPlaced(String user, Block block, int time, int offset) – belirtilen oyuncunun bu bloğu belirli bir süre içinde yerleştirip yerleştirmediğini denetler.
· boolean hasRemoved(String user, Block block, int time, int offset) – belirtilen oyuncunun bu bloğu yıkıp yıkmadığını denetler.
5. Performans, uyumluluk ve bakım
CoreProtect ile yüksek çevrimiçi oyuncu sayısına sahip sunucularda çalışırken yöneticiler, modern sunucu mimarileriyle etkileşimin özelliklerini göz önünde bulundurur:
· Folia desteği: Folia sunucu çekirdeği, bölgeselleştirilmiş çok iş parçacıklı zamanlama (Regionized multithreading) kullanır; bu da dünyayla çalışırken eklentilerden katı bir iş parçacığı güvenliği gerektirir. CoreProtect, Folia'da çalışmak üzere uyarlanmıştır: /co rollback ve /co restore işlemlerinin yürütülmesi, bölge zamanlayıcısı (Region Scheduler) aracılığıyla gerçekleşir; bu da chunk'lara erişim çakışmalarını ve ConcurrentModificationException türündeki kritik hataları önler.
· MultiPaper kümelemesi: MultiPaper türündeki sunucularda CoreProtect, tek bir harici MySQL veritabanını kullanacak şekilde yapılandırılır. Bu, oyuncu eylemlerinin geçmişini kümenin farklı düğümlerinde senkronize etmeye yardımcı olur.
· Veritabanı temizliği (Purge): Yerel SQLite veritabanı zamanla parçalanır ve büyür, böylece komutların yürütülmesini yavaşlatır. /co purge t:30d komutu, 30 günden eski kayıtları siler. SQLite veritabanı temizlendikten sonra database.db dosyası otomatik olarak küçülmez, çünkü SQLite VTYS, gelecekteki kayıtlar için boş sayfaları saklar. Dosyayı disk üzerinde fiziksel olarak küçültmek için veritabanı konsolu aracılığıyla VACUUM komutunun çalıştırılması veya sunucunun durdurulup üçüncü taraf yardımcı programlarla sıkıştırmanın yapılması gerekir. MySQL kullanımı bu sorunu ortadan kaldırır, çünkü MySQL VTYS, kullanılmayan disk alanını daha verimli biçimde serbest bırakır.
Sonuç
CoreProtect, Minecraft Java Edition sunucularındaki günlükleme ve geri yükleme sistemleri için bir standarttır. LogBlock (yalnızca MySQL ile çalışmayı destekleyen ve blok günlüklemesiyle sınırlı olan) veya Prism (daha karmaşık bir yapılandırma yapısına sahip olan) gibi alternatiflerin aksine CoreProtect; SQLite ile tamamen bağımsız bir başlatma, kapların içeriğinin ayrıntılı takibi ve ayrıca benzersiz bir geri alma önizleme sistemi #preview sunar. Eklentinin tek teknik sınırlaması, büyük yerel SQLite veritabanlarının temizlenmesi sırasında depolama birimi üzerindeki önemli yüktür; bu nedenle büyük projelerde hızlı NVMe disklerde özel MySQL VTYS kullanılması önerilir. Eklenti, hem arkadaşlar arasındaki küçük özel sunucular hem de yüzlerce aktif oyuncuya sahip büyük ölçekli projeler için uygundur.
Kurulum
Tipik bir kurulum yaklaşık 5 dakika sürer. Akış aynıdır; yalnızca loader ve uygun build değişir.
- 1Stop your Minecraft server.
- 2Drop the plugin .jar into the server /plugins folder.
- 3Start the server once so the plugin generates its config files.
- 4Edit /plugins/<name>/config.yml as needed, then run /reload confirm or restart.








