MinigamesLib Banner Minecraft Version Built With
MinigamesLib, Minecraft Spigot/Bukkit sunucuları için modern, modüler ve son derece güçlü bir mini oyun geliştirme kütüphanesidir. Bu framework, boilerplate (tekrar eden) kodları ortadan kaldırır ve tamamen oyun mantığına odaklanmanızı sağlar.
- 🔥 Annotation-Driven Architecture: Manager, Listener ve Komutlarınızı sadece birer satır anotasyon ekleyerek otomatik olarak kaydedin.
- 🎮 Tam Donanımlı Oyun Yaşam Döngüsü:
LOBBY,STARTING,PLAYING,RESULTSgibi hazır fazlar ve state yönetimi. - 💰 Entegre Ekonomi & Ödül Sistemi: Hazır
EconomyAPIveRewardManager. - ✨ Dynamic Hologram API: Tek satırla 3D hologram oluşturma ve silme yeteneği.
- 🗣️ Çoklu Dil Desteği (Localization): Türkçe/İngilizce varsayılan, dinamik genişletilebilir dil sistemi.
- 📊 Gelişmiş Logger & Analytics: Renkli konsol çıktıları, section loglama ve dosya kaydı.
Öncelikle kütüphaneyi yerel maven deponuza kurun (mvn clean install). Ardından projenizin pom.xml dosyasına bağımlılık olarak ekleyin. Kütüphanenin hosting plugin içinde çalışabilmesi için maven-shade-plugin ile paketinize gömmeniz (shade) tavsiye edilir:
<dependency> <groupId>org.ozaii</groupId> <artifactId>MinigamesLib</artifactId> <version>1.0-SNAPSHOT</version> <scope>compile</scope> </dependency>
Bu proje artık tek başına bir eklenti (plugin.yml içermez) değildir; ana eklentinizin bir parçası olarak çalışır. Eklentinizin onEnable ve onDisable metotlarında kütüphaneyi başlatmanız ve kapatmanız gerekir:
package com.example.myminigame; import org.bukkit.plugin.java.JavaPlugin; import org.ozaii.minigameslib.MinigamesLib; public class MyMainClass extends JavaPlugin { @Override public void onEnable() { // Framework'ü başlatır, otomatik olarak tüm Manager, Event ve Komutlarınızı tarar. MinigamesLib.initialize(this); getLogger().info("Mini oyun eklentisi başarıyla yüklendi!"); } @Override public void onDisable() { // Framework'ü temiz şekilde kapatır MinigamesLib.shutdown(); } }
Artık her şey hazır! MinigamesLib eklentinizin klasörü içerisinde kendi logs ve dil dosyalarını yönetecektir, ekstra bir klasör oluşturmaz.
MinigamesLib, Reflection (Yansıma) teknolojisini kullanarak eklentinizi tarar ve bileşenleri otomatik ayağa kaldırır. Manuel olarak getServer().getPluginManager().registerEvents(...) veya getCommand("x").setExecutor(...) yazmanıza gerek yoktur.
Arka planda çalışacak, veri depolayacak veya sistemi yönetecek sınıflarınızı @Manager ile işaretleyin.
package com.example.myminigame.managers; import org.ozaii.minigameslib.annotations.Manager; import org.ozaii.minigameslib.loaders.BaseManager; import org.ozaii.minigameslib.logging.LoggerManager; @Manager // <-- Bu anotasyon sayesinde otomatik algılanır ve YÜKLENİR. public class ArenaManager implements BaseManager { @Override public void onEnable() { LoggerManager.info("Arenalar dosyadan yükleniyor..."); // Yükleme mantığınız } @Override public void onDisable() { LoggerManager.info("Tüm arenalar kaydedildi."); // Kapatma mantığınız } }
MinigamesLib, komutları gruplama ve kök komut (root command) oluşturma işini inanılmaz basitleştirir. plugin.yml dosyasına hiçbir şey eklemenize gerek yoktur. Kütüphane, komutları Bukkit'e direkt olarak enjekte eder.
Tek Adım: Alt komutu @SubCommand ile tanımlayın
package com.example.myminigame.commands; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.ozaii.minigameslib.annotations.SubCommand; import org.ozaii.minigameslib.commands.manager.BaseSubCommand; // "parent" kısmına yazdığınız isim otomatik olarak root komut olarak sunucuya kaydedilir. // Örneğin aşağıdaki komut "oyun baslat" şeklinde çalışacaktır. @SubCommand(parent = "oyun", name = "baslat", permission = "myminigame.admin", description = "Oyunu Başlatır") public class StartCommand extends BaseSubCommand { @Override public void execute(CommandSender sender, String[] args) { Player player = (Player) sender; player.sendMessage("§aOyun başlatılıyor..."); // Logic buraya } }
Eğer /oyun yazılırsa otomatik bir Yardım Menüsü oluşturulur. Birden fazla farklı parent kullansanız dahi sistem hepsini bağımsız root komutlar olarak sisteme kaydeder.
Event sınıflarını kaydetmek için artık ana class'da kalabalık yapmaya son! Sadece annotasyonu ekleyin ve Listener implements edin.
package com.example.myminigame.listeners; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; import org.ozaii.minigameslib.annotations.MiniGameListener; @MiniGameListener // <-- Otomatik kayıt! public class ConnectionListener implements Listener { @EventHandler public void onJoin(PlayerJoinEvent event) { event.setJoinMessage("§eHoş geldin " + event.getPlayer().getName()); } }
Bir mini oyun (örneğin SurvivalGames, BedWars vb.) oluşturmak için AbstractMinigame sınıfını genişletmelisiniz.
public class SurvivalGames extends AbstractMinigame { public SurvivalGames(String gameId, GameConfig config) { super(gameId, config); } @Override public void onGameInitialize() { // Sandıkları doldur, map sıfırla LoggerManager.info("[SG] Başlatılmaya hazırlanıyor..."); } @Override public void onGameStart() { // Pvp aç, oyuncuları serbest bırak getBukkitPlayers().forEach(p -> p.sendMessage("§c§lBAŞLADI! KİLİTLER AÇILDI!")); } @Override public void onGameTick() { // Saniyede bir kez çalışır (Opsiyonel iç döngüden çağırırsanız) // Daralma mantığı vb. } @Override public void onGameEnd() { // Kazananı duyur LoggerManager.info("[SG] Oyun sona erdi."); } @Override public void onGameShutdown() { // Cleanup, hologramları silme cleanupHolograms(); } @Override protected void applyReward(Player player, Reward reward) { // Özel ödül lojiği gerekirse override et } }
Kullanıma hazır statik MinigameAPI ile oyun durumunu manipüle edebilirsiniz.
// Oyuncuyu bir oyuna kat MinigameAPI.joinGame(player, "arena_1"); // Oyuncunun mevcut oyununu getir AbstractMinigame game = MinigameAPI.getPlayerGame(player); // Oyun durumu kontrolü if (game.getState() == GameState.RUNNING) { // İşlemler }
Bağımsız bir ekonomi veritabanı tutar. Projelerinizde token, coin, puan yönetmek için idealdir.
// Para Ekle EconomyAPI.giveMoney(player, 500.0); // Para Al EconomyAPI.takeMoney(player, 100.0); // Bakiye Çek double bakiye = EconomyAPI.getBalance(player);
Hiçbir ekstra eklenti (HolographicDisplays vb.) gerektirmeden tamamen paketsel (packet-based) veya Entity tabanlı (kütüphane implementasyonuna göre) hologram oluşturur.
// Hologram Yarat (Minigame context'i içinde otomatik tracking yapılır) HologramAPI.createHologram("liderlik_tablosu", loc, Arrays.asList( "§6§lLİDERLİK TABLOSU", "§e1. Oyuncu - 50 Galibiyet", "§7www.sunucun.com" )); // Satır Güncelle HologramAPI.updateLine("liderlik_tablosu", 1, "§e1. " + name + " - " + wins); // Sil HologramAPI.removeHologram("liderlik_tablosu");
Okunabilirliği ve hata ayıklamayı en üst seviyeye çıkaran gelişmiş log sistemi.
LoggerManager.info("Veriler yüklendi."); LoggerManager.warn("Dosya bulunamadı, yenisi oluşturuluyor!"); LoggerManager.error("Veritabanı hatası!", exception); // Büyük başlık atmak için LoggerManager.logSection("OYUN DÖNGÜSÜ BAŞLADI"); LoggerManager.info("Mod: Solo"); LoggerManager.info("Harita: Jungle"); LoggerManager.logSectionEnd();
- Dosya Yapısı: Kodlarınızın düzenli olması için paketleri
commands,listeners,managersveminigamesşeklinde ayırın. Framework bu dizinleri otomatik tarayacaktır. - GameConfig Kullanımı: Statik limitler belirlemek yerine
GameConfigsınıfını kullanarak minimum oyuncu sayısı, maksimum oyuncu sayısı ve harita adını dinamik yapın. - Team Kullanımı:
AbstractMinigamesınıfının içinde hazırTeam(Takım) yapısı vardır.createTeam("Kırmızı", "RED")diyerek anında takım savaşlı oyunlar yapabilirsiniz. - Clean Up: Oyun bittiğinde veya iptal edildiğinde
cleanupHolograms()metodunu çağırmayı veya Listener'ları deregister etmeyi unutmayın.
💡 Bu framework @ozaii tarafından Minecraft oyun geliştirme deneyimini profesyonelleştirmek ve hızlandırmak amacıyla oluşturulmuştur.