Eklenti(Plugin) Yazım Rehberi | Temel Bilgiler - Metodlar - Kodlar - Dedektörler - Eclipse Kullanımı

>>TheLegend<<

Легенды никогда не умирают
Mesajlar
991
En iyi cevaplar
3
Beğeniler
1,903
Puanları
2,530
Merhaba arkadaşlar, bugün farklı bir rehber konum ile karşınızdayım.
Bu konumda birçok kişinin birbirine sorduğu, nasıl acaba dediğiniz bukkit(minecraft) eklenti yazımını ele alacağız.
Arkadaşlar baştan söylemek istiyorum ki eğer öğrenmek istiyorsanız veya bir eklenti yazmak istiyorsanız kesinlikle sabırlı ve meraklı olmalısınız.
Eğer sabırlı olmaz iseniz, yaptığınız ilk hatada eklenti yazımını bırakırsınız veya hazır kaynaklar tercih edersiniz.
Eğer meraklı olmaz iseniz, bilginizi kısıtlı bırakırsınız. Rehberler bu işin ilk adımıdır. Rehberlerden bilgiler edinir ve sonra merakınız ile bunu mükemmelleştirirsiniz.

Bukkit eklentileri kodlamalarında "Eclipse" adlı bir Java düzenleme platformu kullanılır.
Eclipse Nedir;
Eclipse, açık kaynak kodlu bir tümleşik geliştirme ortamıdır. (IDE). Ana odak noktası Java ve Java ile ilişkili teknolojiler olsa da esnek yapısı sayesinde C ve Python gibi farklı diller için de kullanılmaktadır.

2001 yılında IBM tarafından başlatılan proje Java'nın ana grafik sistemi olan Swing yerine bulunduğu platformda bulunan özellikleri doğrudan kullanan STW'yi kullanarak Java dünyasında tartışmalara yol açmıştır. Hızlı arayüzü, şık görünümü ve çok kuvvetli özellikleriyle kısa zamanda Java geliştiricileri arasında en popüler geliştirme ortamı olmuştur.

Android SDK ile bütünleşik çalışan Eclipse'in içinde yazılan programları denemek için öykünücü kurulabilmektedir.
Ayrıca sunulan eklentiler ile işlevleri geliştirilerek birçok alanda kullanılabilmektedir.

Eclipse programını, www.eclipse.org/downloads/ adlı siteden elde edebilirsiniz.

Yeni Proje Oluşturma;
Programın sol üst köşesinden

Kırmızı kutucukta gösterilen kısıma tıklayıp, çıkan seçeneklerimizden "Java Project" seçin.

İlk kutucukta gösterilen kısıma plugin isminizi girin. Daha sonra altındaki kutuda
JRE kutucuğunu aynı resimdeki gibi yapmanızı öneririm. "J2SE-1.5"
İstenenleri doldurtuktan sonra hemen altındaki "Next >" butonuna tıklayın. Tıkladığınızda,

"Libraries" sekmesinden "Add External JARs..." butonuna tıklayın.
Bu yaptığımız işlem pluginimizin bukkit uyumluluğu içindir. Dolayısıyla butona bastığımızda bilgisayarınızdan bir CraftBukkit sürümü seçin.
En güncel CraftBukkit sürümlerini; http://dl.bukkit.org/downloads/craftbukkit/ uzantısından elde edebilirsiniz.
CraftBukkit sürümünüzü seçtikten sonra "Finish" butonu ile beraber projemiz açılıyor.
Kaynak: Java Eclipse Kullanımı, @Lucifer˜

Package Dosyası Oluşturmak;
Package dosyası ne işe yarar; bu dosya isminden tahmin edilebileceği gibi "paket" dosyasıdır.
Oluşturmak için, oluşturduğunuz projenin içerisindeki "src" adlı simgeye sağ tıklayıp, New > Package yolunu izleyin.
Çıkan yeni bölümde ise package isminizi girin.
Package isminiz,
Kod:
org.bukkit
net.bukkit
com.bukkit
net.minecraft
Adlarını kesinlikle taşımamalıdır.
Package isimlerinize eğer varsa domain uzantınızı veya e-mail hesabınızı kullanabilirsiniz. Örneğin,
E-Mail: [email protected]
Package ismi; com.gmail.thelegendmcturk
Eğer hiç biri yok veya hiç birini kullanmak istemiyorsanız,
me.<yazar-isim>.<proje-isim> formatını kullanabilirsiniz. Örneğin
Kod:
me.thelegend.deneme

Class Dosyası Oluşturmak;
Projemiz ve package dosyamız tamamen hazır. Class dosyalarımızı hazırlayalım.
Class dosyamızı oluşturmak için, oluşturmuş olduğumuz package dosyasına sağ tıklayıp New>Class uzantısını izleyin ve dilediğiniz class isminizi girin.
Bir eklentinin kesinlikle ana class dosyası olmalıdır. Ve bu ana class dosyasını belirlemek için bir yol vardır.
"JavaPlugin" kodu eklentimizin ana class dosyasını belirlemek için kullanılan bir koddur. Peki bu kodu nerede ve nasıl kullanacağız;
Class dosyanız ilk açtığında şu şekilde görünmelidir;
Kod:
package <package-isminiz>;

public class <class-isminiz> {

}
Ve eğer biz bu açtığımız class dosyasını eklentimizin ana class dosyası olarak belirlemek istiyorsak;
Kod:
package <package-isminiz>;

public class <class-isminiz> extends JavaPlugin {

}
Olarak düzenlemeliyiz.
"JavaPlugin" kodunun altı kırmızı olacaktır.
Bunun sebebi kodu import etmememizdir.
Kodu import etmek için kısaca CTRL + SHIFT + O tuşlarını kullanabiliriz.
Bu tuşlar "Organize Imports" özelliğini kullanmamızı sağlar ve bu tuşları kullandığımız class dosyanızdaki tüm import edilmesi gereken kodları import eder.
Import ettiğinizde şu şekilde görünmelidir;
Kod:
package <package-isminiz>;

import org.bukkit.plugin.java.JavaPlugin;

public class <class-isminiz> extends JavaPlugin {

}

plugin.yml Dosyası Oluşturmak;
plugin.yml dosyası bir eklentide kesinlikle olması gereken bir dosyadır.
Ve bu dosyayı düzenlerken de kesinlikle gereken bir kaç metod vardır.
Düzenlemeye geçmeden önce nasıl oluşturacağımıza değinelim,
Oluşturduğumuz projenin içerisinde bulunan "src" adlı dosyaya sağ tıklayın ve New > Files yolunu izleyin.
Karşınıza çıkan kısıma "plugin.yml" yazıp "Enter" tuşuna basın.
Artık eklentimiz için oluşturulmuş bir plugin.yml dosyamız var.
Bu dosyada eklenti ismimizi, eklenti versiyonumuzu ve ana class dosya konumunu kesinlikle ve kesinlikle belirtmek zorundayız.
Eğer bunları belirtmez isek eklentimiz kesinlikle çalışmayacaktır.
Belirtilmesi zorunlu kısımlar ile plugin.yml şu şekilde görünmelidir;
Kod:
name: <eklenti-isminiz>
version: <eklenti-versiyonu>
main: <package-uzantınız>.<ana-class-dosyanız>
Örneğin:
Kod:
name: Deneme
version: 1.0
main: me.thelegend.deneme.Ana
Fakat tabi ki bu zorunlu kısımlar dışında ekleyebileceğiniz birçok ekstralar bulunmaktadır.
Örneğin:
Kod:
name: Deneme
version: 1.0
author: TheLegend
main: me.thelegend.hosgeldin.Ana
description: Bukkit Deneme Eklentisi!
  • name - Eklenti isminiz
  • version - Eklenti versiyonunuz
  • author - Eklenti yazarı
  • main - Eklenti ana class dosyası yolu
  • description - Eklenti hakkında kısa bilgi
onEnable() ve onDisable();
Bu kodlar ana class dosyasında bulunmalıdır.
Anlamları ise eklenti yüklenirken ve devre dışı bırakılırken yapılacağı işlemlerdir.
Kod:
package <package-isminiz>;

import org.bukkit.plugin.java.JavaPlugin;

public class <class-isminiz> extends JavaPlugin {

    public void onEnable() {
        // Eklenti acilisinda yapilacak islemler
    }
    public void onDisable() {
      // Eklenti devre disi birakirken yapilacak islemler
    }
}
Log Oluşturma;
Log nedir; loglar genellikle bir işlem sonucu konsola gönderilen mesajlardır.
Ve biz şimdi bu mesajları, eklenti açılışında ve kapanışına yerleştireceğiz.
İhtiyacımız olan kod;
Kod:
getLogger().info("<Logunuz>");
Bu kodu eğer onEnable() bölümüne yerleştirirsek açılışta "Deneme Plugini!" diye bir info logu yayınlayacaktır.
onDisable() bölümüne yerleştirirsek kapanışta belirlemiş olduğunuz logu yayınlayacaktır.
Tabi ki sadece bu info logları ile sınırlı değil. Mevcut log ön ekleri;
  • info
  • severe
  • warning
Örnek info(bilgi) logu;
Kod:
getLogger().info("Deneme Plugini!");
Eklentilerde en çok görülen log türüdür. Hata veya bir uyarı olmadığı sürece her zaman bu log türü kullanılır.
Örnek severe(hata) logu;
Kod:
getLogger().severe("Deneme Plugini!");
Genellikle bu log türü, hangi işlemde kullanıldıysa ve işlem gerçekleşirken oluşan bir hatayı bildirmek için kullanılır.
Örnek warning(uyarı) logu;
Kod:
getLogger().warning("Deneme Plugini!");
Genellikle bu log türü, eklentide yeni bir güncelleme geldiğini bildirmek için veya eklentide mevcut olan
Bir bugu, hatayı, eksikliği bildirmek/duyurmak için kullanılır.
Kodlarımızı onEnable() ve onDisable() bölümlerine yerleştirelim;
Kod:
package <package-isminiz>;

import org.bukkit.plugin.java.JavaPlugin;

public class <class-isminiz> extends JavaPlugin {

    public void onEnable() {
      getLogger().info("Deneme Plugini Aktif!");
    }
    public void onDisable() {
      getLogger().info("Deneme Plugini Devre Disi!");
    }
}
Komut Oluşturma;
Komut oluşturmada belirli bir "onCommand" metodu vardır.
onCommand metodu bir bakıma "/" yöneticisidir. Yani komutumuzu komut yapan bir metoddur.
Peki bu metodu nasıl ve nerede kullanacağız
Bu metodun belli bir kullanımı vardır;
Kod:
public boolean onCommand(CommandSender sender, Command komut, String label, String[] args)
  • CommandSender sender - Komutu gönderen kişi
  • Command cmd - Komut
  • String label - Komutun kullanılan bir başka adı
  • String[] args - Komut dökümanları. Örneğin; "/deneme abc 123" bunlar komut dökümanlarıdır ve bu örneğimizde abc dökümanı args[0](ilk döküman), 123 dökümanı args[1](ikinci döküman)
Tabi ki bu kullanılan kodları değiştirebilirsiniz.
Örneğin eklenti yazarken tercih ettiğim farklı onCommand kodları, "CommandSender gonderen" ve "Command komut".
Değiştirdiğimiz kodları metoda aktaralım;
Kod:
public boolean onCommand(CommandSender gonderen, Command komut, String label, String[] args)
Birde hepsini değiştirelim. Örneğin "CommandSender gonderen, Command komut, String baskaad, String[] dokuman".
Metoda aktaralım;
Kod:
public boolean onCommand(CommandSender gonderen, Command komut, String baskaad, String[] dokuman)
Örnek bir komut görünümü;
Kod:
public boolean onCommand(CommandSender gonderen, Command komut, String label, String[] args) {
    if (komut.getName().equalsIgnoreCase("deneme") {
        // Deneme kodu girildiğinde yapılacak işlemler
        return true;
        }
    return false;
    }
}
"return true;" veya "return false;" aslında sadece genel olarak "boolean" durumunu işaretler. Çünkü sonuç olarak komut işlemi bir boolean durumudur ve her boolean durumunun olduğu gibi değeri true veya false olmalıdır.
"equalsIgnoreCase" kodunun işlevi ise komuttaki büyük ve küçük harf duyarlılığını kapatmaktır. Yani biz komutumuzu ".equalsIgnoreCase("deneme")" olarak girersek komut "DENEME", "deneme", "DeNeMe", "DeneMe", "DeNeme" gibi büyük küçük harf fark etmezsizin komut çalışacaktır.
Komutu plugin.yml Dosyasına Ekleme;
Oluşturduğun komutu kesinlikle eklentinin plugin.yml dosyasına eklemen gerekir.
Eğer ki komut plugin.yml dosyasına eklenmemişse o komut yok sayılır.
Peki nasıl ekleyeceğiz;
Kod:
commands:
    <komutunuz>:
        description: <komut-hakkında-kısa-bilgi>
        usage: <komut kullanimi>
        permission: <eklenti-ismi>.<yetki>
        permission-message: <yetersiz-yetki-mesaji>
  • description - Komut hakkında kısa bilgi
  • usage - Komut kullanımı (Genellikle birden fazla dökümanlı komutlar için kullanılır)
  • permission - Komuta erişim için gerekli yetki
  • permission-message - Eğer bir oyuncu yetkisi olmadığı halde bu komuta erişmeyi denerse gönderilecek mesaj.
Örnek plugin.yml;
Kod:
commands:
    deneme:
        description: Deneme komutu
        usage: /deneme [oyuncu]
        permission: deneme.ana-komut
        permission-message: Bunun Icin Gerekli Izine Sahip Degilsin!
Yetki kontrollerini plugin.yml dosyasından değilde,
Komutları oluştururken birkaç kod ile halledebiliriz.
Şahsen plugin.yml de bulunan yetki dedektörü yerine kodları öneririm.
Komut Yetki Dedektörü;
Bu bölümde komutu sadece yetkisi olanların kullanabilmesini sağlayacağız.
Ve burada ekleyeceğimiz yetkiyi, aynı komut gibi plugin.yml dosyasına aktarmamız gerekmekte.
Komut kodlamaları kendi stilimde yapmak istiyorum yani sadece "CommandSender gonderen" ve "Command komut" olarak kullanacağım.
İhtiyacımız olan kod;
Kod:
if (gonderen.hasPermission("<eklenti-ismi>.<yetki>"))
Bu kod ile komutumuzu sadece belirttiğimiz yetkiye sahip oyuncuların kullanabilmesini sağlayacağız.
Bunu örnek bir komuta aktaralım;
Kod:
public boolean onCommand(CommandSender gonderen, Command komut, String label, String[] args) {
    if (komut.getName().equalsIgnoreCase("deneme")) {
        if (gonderen.hasPermission("deneme.ana-komut")) {
            //Komuta erişimi olanlar yani op veya yetkisi olanlar bu komutu girdiğinde yapılacak işlem
            return true;
        }
    }
    return false;
}
şu an "deneme" komutunu sadece "deneme.ana-komut" yetkisine sahip oyuncular kullanabilir.
Ve şimdi "deneme.ana-komut" yetkisine sahip olmadığı halde bu komutu kullanmaya çalışanlara mesaj göndereceğiz.
Kod:
public boolean onCommand(CommandSender gonderen, Command komut, String label, String[] args) {
        if (komut.getName().equalsIgnoreCase("deneme")) {
            if (gonderen.hasPermission("deneme.ana-komut")) {
                //Komuta erişimi olanlar yani op veya yetkisi olanlar bu komutu girdiğinde yapılacak işlem
                return true;
            }
            else {
                //Yetersiz izin mesajı
                return true;
                  }
              }
        return false;
    }
}
Artık şimdi, deneme komutunu izini olmayan biri girdiğinde ne yapılmasını istiyor iseniz "//Yetersiz izin mesajı" kısımını silip belirtin.
Bir mesaj göndermek için,
Kod:
gonderen.sendMessage("<Mesajınız>");
Kodunu kullanabilirsiniz.
Mesajınıza renk verebilmek için,
"ChatColor" kodu kullanılabilir. Verebileceğiniz renkleri görebilmek için,
"ChatColor." yazın ve eclipse size renkleri sıralayacaktır.
Renginizi seçtikten sonra hemen yanına mesajınızı girmeden önce bir "+" işareti koyun yani, ChatColor.RED + "<Mesaj>" gibi.
Örnek kırmızı renkli yetersiz izin mesajı;
Kod:
gonderen.sendMessage(ChatColor.DARK_RED + "Bunun Icin Gerekli Izine Sahip Degilsiniz!");
Yetkileri plugin.yml Dosyasına Ekleme;
Arkadaşlar kodlarla bir yetki dedektörü sağladıysak,
Hazırladığımız yetkilerin her birini plugin.yml dosyasına eklememiz gerekir.
Şu şekilde hazırlayacağız;
Kod:
permissions:
    <yetki>:
        description: <kısa-bilgi>
        default: <kullanabilecekler>
"default" kısımı kullanabilecek grupları listeler.
Yani buraya op olanlar veya olmayanlar veya hepsini seçebilirsiniz.
Default grupları ve anlamları;
  • op - OP Olanlar
  • not op - OP Olmayanlar
  • true - Hepsi
  • false - Hiç biri
Örnek yetki plugin.yml listesi;
Kod:
permissions:
    deneme.ana-komut:
        description: Ana komuta erisim izini
        default: op
Bu örneğimizde yetki, OP olan her kimsede bulunabilecek.
plugin.yml Yetki Children Sistemi;
Arkadaşlar bukkit bize bir özellik daha sunmaktadır ve bu özellik gayet kullanışlı ve hoş bir özelliktir.
Bu özellik, children özelliği olarak adlandırılır.
Birçoğunuz bu sistemi görmüştür. Eklentilerde bulunan "*" yetkisi örneğin; "essentials.*" yetkisi bir diğer kavramı ile tüm yetkiler anlamını taşır.
Bu tür yetkiler plugin.yml dosyasınan oluşturulmaktadır.
Ve bizlerde şimdi bir children sistemli yetki hazırlayacağız.
Aslında oldukça basittir.
Format örneği;
Kod:
permissions:
    <eklenti-isminiz>.*:
        description: <kısa-bilgi>
        children:
            <eklenti-ismini>.<yetki>: true
            <eklenti-ismini>.<yetki>: false
            <eklenti-ismini>.<yetki>: true
            <eklenti-ismini>.<yetki>: true
        default: op
Kodlamada gördüğünüz "children" kodu, kapsadığı yetkileri temsil eder.
Örnek plugin.yml children sistemli yetkiler bölümü;
Kod:
permissions:
    deneme.*:
        description: Deneme eklentisinin tüm yetkileri.
        children:
            deneme.ana-komut: true
            deneme.yenile: false
        default: op
Children listesinin altına yazdığınız yetinin kullanılabilir veya kullanılamaz olarak işaretlemek için
"true/false" sistemini kullanabilirsiniz.
Konsol/Oyuncu Dedektörü;
Oluşturduğunuz bir komutun sadece oyuncuların girebilmesini istiyor iseniz
Bu dedektörü kullanmanız gerekmektedir. Bu sayede dedektörü eklediğimiz komutu sadece oyuncular girebilecek.
İhtiyacımız olan kod;
Kod:
if (gonderen instanceof Player)
Bu kodun anlamı, "eğer bu komutu gönderen oyuncu ise" gibi varsayım yapabilirsiniz.
Peki bu kodu nasıl komutumuza nasıl monteleyeceğiz;
Kod:
if (komut.getName().equalsIgnoreCase("deneme")) {
            if (gonderen instanceof Player) {
                //Yapılacak işlem
                return true;
            }
        }
        return false;
    }
}
Ve şimdi artık komutumuzu sadece oyun içerisindeki oyuncular kullanabilir.
Eğer bir konsol kullanmaya çalışırsa hata verir.
Fakat şimdi biz hata vermesi yerine bizim belirlediğimiz bir mesajın yollamasını sağlayacağız. Aynı yetki mesajı gibi;
Kod:
if (komut.getName().equalsIgnoreCase("deneme")) {
            if (gonderen instanceof Player) {
                gonderen.sendMessage(ChatColor.RED + "Deneme!");
                return true;
            }
            else {
                gonderen.sendMessage(ChatColor.DARK_RED + "Bu Komut Sadece Oyun Icerisinde Girilebilir!");
                return true;
            }
        }
        return false;
    }
}
Artık bu komutu konsol girmeyi denediği zaman belirlediğimiz mesajı gönderecektir.
"else" kodunun anlamı bir bakıma "aksi taktirde" gibi bir anlam taşır.
Peki siz bu kodu nereye yerleştireceğinizi nereden bilecekseniz;
"else" kodunu hangi işlemi aksi taktirde ne olacağını eklemek istiyor iseniz o işlemin altına eklemeniz gerekir.
Bunu öğrenmenin bir kısa yolu var.
Tüm komut işlemlerinizi bitirin ve bu aksi taktirde olayını en sona bırakın
Komutu bitirdiniz ve bir tek o kaldı.
Örneğin yetkisi olmayan oyunculara gönderilecek mesajı ele alalım;
Kod:
if (gonderen.hasPermission("deneme.ana-komut")) {
Son kısımda gördüğünüz işlemi açan "{" harfinin sağına tıklayın ve eclipse size o işlemi kapatan harfi kare içine alacaktır.
O harfin hemen altına "else" kodumuzu yerleştirebiliriz.
Komut Döküman Oluşturma;
Komutumuza dedektör eklemek için belirli birkaç koda ihtiyacımız var.
Ekleyeceğimiz döküman config dosyasını yenileme görevi görecek.
Ve bu kodlar;
Kod:
if ((args.length == 1) && (args[0].equalsIgnoreCase("yenile"))) {
Bu kodun anlamı, "Komutun bir dökümanı varsa ve o döküman yenile ise" gibi düşünebiliriz.
Şimdi "yenile" dökümanına bir işlev yükleyelim;
Kod:
if (komut.getName().equalsIgnoreCase("deneme")) {
            if ((args.length == 1) && (args[0].equalsIgnoreCase("yenile"))) {
                reloadConfig();
                saveConfig();
                gonderen.sendMessage(ChatColor.RED + "Ayarlar Yenilendi!");
                return true;
            }
        }
        return false;
    }
}
Artık oyuncu veya konsol "/deneme yenile" komutunu girdiğinde
Ayarlar yani config dosyası yenilenecek ve yenilendiğine dair bir bilgi mesajı gönderecektir.
Komut Döküman Dedektörü;
Komutlara döküman eklediğimizde ve bu döküman fazla veya az girildiğinde
Bilgilendirme mesajları göndermesini sağlayacağız.
İhtiyacımız olan kod;
Kod:
if (args.length > 1) {
Bu kodun anlamını, "Eğer döküman birden az ise" gibi düşünebiliriz.
Bunu tabi ki değiştirebiliriz. Büyüktür küçüktür işaretleri (<,>) kullanılmaktadır. Döküman sayısı değiştirilebilir.
Örneğin;
Kod:
if (komut.getName().equalsIgnoreCase("deneme")) {
            if (args.length > 1) {
                gonderen.sendMessage(ChatColor.RED + "Yetersiz Dokuman!");
                return true;
            }
            if (args.length < 3) {
                gonderen.sendMessage(ChatColor.RED + "Fazla Dokuman!");
                return true;
            }
        }
        return false;
    }
}
Eklenti Ayarlar Dosyası Oluşturma (config.yml);
Eklentiniz ne kadar ayarlanabilir olursa o kadar güzel bir hal alır.
Ve eklentinizi ayarlanabilir hale getirmek için bir ayarlar dosyasına veya bir diğer adı ile config.yml dosyasına ihtiyacınız var.
Bu bölümde nasıl config dosyası oluşturulacağı ve bir ayarlanabilir mesaj oluşturacağız.
Her şeyden önce iki koda ihtiyacımız var.
Bu kodlar;
Kod:
FileConfiguration config;
File dosya;
Kodlarıdır.
Bu kodlar bize config dosyası izini vermektedir.
Sonraki aşamadaki
İhtiyacımız olan kısaltma kodu;
Kod:
public void ayarlarYukle() {
    config = getConfig();
    config.options().copyDefaults(true);
    dosya = new File(getDataFolder(), "config.yml");
    saveConfig();
}
Bu kod bir kısaltma kodudur. Yani siz "ayarlarYukle();" kodunu girdiğinizde yukarıda kod içerisine alınmış tüm kodları kapsayacaktır.
Bu kod bizim config dosyası oluşturma kodumuzdur.
Bu kısaltma kodu ana class dosyasında bulunmalıdır ve ayrı bir void kodu olduğu için hiçbir metod bunu kapsayamaz dolayısıyla,
Bu kodu onEnable() kodunun üstüne yerleştirebilirsiniz.
Ayrıca bu config yükleme kodumuzu yani "ayarlarYukle();" onEnable() metoduna yerleştirmeliyiz ki eklenti aktif edilirken config dosyamız yüklensin.
Yerleştirelim;
Kod:
public void ayarlarYukle() {
    config = getConfig();
    config.options().copyDefaults(true);
    dosya = new File(getDataFolder(), "config.yml");
    saveConfig();
}
public void onEnable() {
    ayarlarYukle();
}
Artık config dosyamız eklenti aktif edilirken yüklenecektir.
Şimdi ise config dosyasından düzenlenebilir bir komut mesajı oluşturalım.
Kod:
if (komut.getName().equalsIgnoreCase("deneme")) {
            gonderen.sendMessage(config.getString("Deneme-Mesaji"));
            return true;
        }
        return false;
    }
}
"config.getString" kodu bize configden bir veri getirmemizi sağlar ve hemen yanında bulunan "("Deneme-Mesaji")" bölümü ise hangi veriyi getireceğine dair bir bilgi.
Şimdi tek yapmamız bir config dosyası oluşturmak.
Projemizin içerisinde bulunan "src" kısımına sağ tıklayın ve New > Files kısmından bir config.yml oluşturun.
Oluşturduğunuz config.yml dosyasına
Belirttiğimiz veriyi girelim,
Kod:
Deneme-Mesaji: Deneme Mesaji Calisiyor!
Artık bir config dosyamız ve config dosyasından düzenlenebilir bir mesajımız var.
Bittiğinde şöyle bir görünüm elde edeceksiniz;
Kod:
public class <ana-class> extends JavaPlugin {
    FileConfiguration config;
    File dosya;
    public void ayarlarYukle() {
        config = getConfig();
        config.options().copyDefaults(true);
        dosya = new File(getDataFolder(), "config.yml");
        saveConfig();
    }
    public void onEnable() {
        ayarlarYukle();
    }
    public boolean onCommand(CommandSender gonderen, Command komut, String label, String[] args) {
        if (komut.getName().equalsIgnoreCase("deneme")) {
            gonderen.sendMessage(config.getString("Deneme-Mesaji"));
        }
        return false;
    }
}
config.yml Renk Kodları Desteği;
Config dosyamızdan ayarlanabilir mesajlara renk kodları desteği verebilmek için
Sadece tek bir koda ihtiyacımız vardır.
Ve bu kod;
Kod:
replaceAll("&", "§");
Kodudur. Normal minecraft kodlamalarında renk kodu "§" dur fakat bizler bunu "&" olarak değiştirdik.
Şimdi aynı durumu bizim config dosyasından ayarlanabilir mesajımıza ekleyeceğiz.
Kodumuzu monteleyelim;
Kod:
gonderen.sendMessage(config.getString("Deneme-Mesaji").replaceAll("&", "§");
Artık mesajımız renk kodları destekli bir mesajdır.
Ve bu mesajı config dosyasında yazarken mesajı tırnak işaretleri içerisine almalıyız.
Örneğin config.yml;
Kod:
Deneme-Mesaji: '&cDeneme Mesaji Calisiyor!'
Bittiğinde şu şekilde görünmeli;
Kod:
FileConfiguration config;
    File dosya;
    public void ayarlarYukle() {
        config = getConfig();
        config.options().copyDefaults(true);
        dosya = new File(getDataFolder(), "config.yml");
        saveConfig();
    }
    public void onEnable() {
        ayarlarYukle();
    }
    public boolean onCommand(CommandSender gonderen, Command komut, String label, String[] args) {
        if (komut.getName().equalsIgnoreCase("deneme")) {
            gonderen.sendMessage(config.getString("Deneme-Mesaji"));
        }
        return false;
    }
}
Komut Oyuncu Online Durumu Dedektörü;
Bu kısımda komut ile girilmiş bir oyuncun online olup olmadığını kontrol edeceğiz.
Eğer oyuncu çevrim içi değil ise çevrimdışı olduğuna dair bir bilgilendirme mesajı göndereceğiz.
İhtiyacımız olan kod;
Kod:
Player hedef = (Bukkit.getServer().getPlayer(args[0]));
            if (hedef == null) {
"Player hedef = (Bukkit.getServer().getPlayer(args[0]));" kodunun anlamı,
Gireceği bir diğer dökümanın bir oyuncu olacağını belli etmekte.
Diğer "if (hedef == null)" komutu ise "Eğer oyuncu belirlenemez ise" gibi bir anlam taşır.
Şimdi bunu komutumuza monte edip, bir mesaj yerleştirelim;
Kod:
if (komut.getName().equalsIgnoreCase("deneme")) {
            Player hedef = (Bukkit.getServer().getPlayer(args[0]));
            if (hedef == null) {
                gonderen.sendMessage(ChatColor.RED + "Oyuncu Aktif Degil!");
                return true;
            }
        }
        return false;
    }
}
 


Son düzenleme:

>>TheLegend<<

Легенды никогда не умирают
Mesajlar
991
En iyi cevaplar
3
Beğeniler
1,903
Puanları
2,530
Tüm rehberler dışında,
Hepsini kapsayan ve daha ayrıntılı bir rehber düşündüm.
Bu büyük ihtimalle son yazılı rehberim olur.
 

ZekiKos

Kızıltaş Madencisi
Emektar Üye
Mesajlar
479
En iyi cevaplar
0
Beğeniler
219
Puanları
0
Okumaya üşendim :D[DOUBLEPOST=1396708779,1396708220][/DOUBLEPOST]Yalnız event lerden de bahset.
 

Lucifer˜

YASAKLANDI
Mesajlar
263
En iyi cevaplar
0
Beğeniler
247
Puanları
340
Tebrik ederim başarılı ve bir o kadarda yararlı bir konu.
Okumaya üşendim :D[DOUBLEPOST=1396708779,1396708220][/DOUBLEPOST]Yalnız event lerden de bahset.
Yüzlerce event bulunmakta ve her biri için farklı kodlar bulunmakta. Eğer o işin içine girerse çıkamaz.
Fakat kısaca Listener sisteminden bahsedilebilir.
 

SFKY

Kızıltaş Madencisi
Mesajlar
667
En iyi cevaplar
0
Beğeniler
296
Puanları
0
Tebrik ederim başarılı ve bir o kadarda yararlı bir konu.

Yüzlerce event bulunmakta ve her biri için farklı kodlar bulunmakta. Eğer o işin içine girerse çıkamaz.
Fakat kısaca Listener sisteminden bahsedilebilir.
@[B][COLOR=#0000ff]Lucifer˜[/COLOR][/B] dediğiniz gibi ve örnek giriş olayı;
PHP:
@EventHandler // Olay işleyici, anlamı yanlış olabilir :)
public void OyuncuSunucuyaGirdiginde(PlayerJoinEvent Olay) {
// Oyuncu tanımlama; ama ben bu anlatımda bunu kullanmayacam.
// Player Oyuncu = Olay.getPlayer();
// eğer oyuncu sunucuya önceden girdiyse;
if (Olay.getPlayer().hasPlayedBefore == true) return;
// return = işlemi tekrarla, true kısmını true yapınca mesaji sadece 1 kere gösterecek -
// - ama false yaparsak oyuncu sunucuya her girdiğinde giris mesaj tekrar tekrar gösterilecek.
// Oyuncu verisini kaydet;
Olay.getPlayer().saveData();
// Giris Mesaji, setJoinMessage sadece PlayerJoinEvent olayına özeldir.
Olay.setJoinMessage(ChatColor.GREEN + Bukkit.getServerName() + " Sunucusuna Hoşgeldin," + Olay.getPlayer().getName());
// Bukkit.getServerName() = Sunucu adı (server.properties dosyasındaki > server-name= kısmındaki adı gösterir.),
// Olay.getPlayer().getName() = Oyuncu adı, ChatColor = Sohbet rengi, örnek: ChatColor.RED = kırmızı renk
}
Hazır olay konusunu burada anlatmışken priority (öncelik) anlatıyım;
PHP:
@EventHandler(priority = EventPriority.HIGH)
burada öncelik eşittir olay önceliği . öncelik derecesi (HIGH = yüksek).
bu nerelerde kullanılır sohbet olayında ve ilk girişte kit vermede vs

Son olarakta konuda bu kısmı;

PHP:
if (komut.getName().equalsIgnoreCase("deneme")) {
            Player hedef = (Bukkit.getServer().getPlayer(args[0]));
            if (hedef == null) {
                gonderen.sendMessage(ChatColor.RED + "Oyuncu Aktif Degil!");
                return true;
            }
        }
        return false;
    }
}
gördüm ve gonderen.sendMessage(ChatColor.RED + "Oyuncu Aktif Degil!"); şeklinde değilde;
gonderen.sendMessage(ChatColor.RED + args[0] + " Adli Kisi Bulunamadi!"); şeklindede olabilir.
args[0] = sohbete yazılan nick
son olarak @>>TheLegend<<;
FileConfiguration config;
File dosya;
tanımlarında başlarına neden private veya public eklemedin de sadece metodu yazdın ?
ve replaceAll("&", "§"); ile replace('&', '§'); arasındaki fark nedir bunu açıklayabilir misin ?
Not: onEnable(), onLoad(), onDisable(), onCommand(), gibi başlayan metotlarda başına
@Override gelir bunu unutma ve onLoad() kısmını konuya eklemelisin.
örnek;
@Override

public void onEnable() {
}
 
Son düzenleme:

Lucifer˜

YASAKLANDI
Mesajlar
263
En iyi cevaplar
0
Beğeniler
247
Puanları
340
@[B][COLOR=#0000ff]Lucifer˜[/COLOR][/B] dediğiniz gibi ve örnek giriş olayı;
PHP:
@EventHandler // Olay işleyici, anlamı yanlış olabilir :)
public void OyuncuSunucuyaGirdiginde(PlayerJoinEvent Olay) {
// Oyuncu tanımlama; ama ben bu anlatımda bunu kullanmayacam.
// Player Oyuncu = Olay.getPlayer();
// eğer oyuncu sunucuya önceden girdiyse;
if (Olay.getPlayer().hasPlayedBefore == true) return;
// return = işlemi tekrarla, true kısmını true yapınca mesaji sadece 1 kere gösterecek -
// - ama false yaparsak oyuncu sunucuya her girdiğinde giris mesaj tekrar tekrar gösterilecek.
// Oyuncu verisini kaydet;
Olay.getPlayer().saveData();
// Giris Mesaji, setJoinMessage sadece PlayerJoinEvent olayına özeldir.
Olay.setJoinMessage(ChatColor.GREEN + Bukkit.getServerName() + " Sunucusuna Hoşgeldin," + Olay.getPlayer().getName());
// Bukkit.getServerName() = Sunucu adı (server.properties dosyasındaki > server-name= kısmındaki adı gösterir.),
// Olay.getPlayer().getName() = Oyuncu adı, ChatColor = Sohbet rengi, örnek: ChatColor.RED = kırmızı renk
}
Hazır olay konusunu burada anlatmışken priority (öncelik) anlatıyım;
PHP:
@EventHandler(priority = EventPriority.HIGH)
burada öncelik eşittir olay önceliği . öncelik derecesi (HIGH = yüksek).
bu nerelerde kullanılır sohbet olayında ve ilk girişte kit vermede vs

Son olarakta konuda bu kısmı;

PHP:
if (komut.getName().equalsIgnoreCase("deneme")) {
            Player hedef = (Bukkit.getServer().getPlayer(args[0]));
            if (hedef == null) {
                gonderen.sendMessage(ChatColor.RED + "Oyuncu Aktif Degil!");
                return true;
            }
        }
        return false;
    }
}
gördüm ve gonderen.sendMessage(ChatColor.RED + "Oyuncu Aktif Degil!"); şeklinde değilde;
gonderen.sendMessage(ChatColor.RED + args[0] + " Adli Kisi Bulunamadi!"); şeklindede olabilir.
args[0] = sohbete yazılan nick
son olarak @>>TheLegend<<;
FileConfiguration config;
File dosya;
tanımlarında başlarına neden private veya public eklemedin de sadece metodu yazdın ?
ve replaceAll("&", "§"); ile replace('&', '§'); arasındaki fark nedir bunu açıklayabilir misin ?
Not: onEnable(), onLoad(), onDisable(), onCommand(), gibi başlayan metotlarda başına
@Override gelir bunu unutma ve onLoad() kısmını konuya eklemelisin.
örnek;
@Override

public void onEnable() {
}
"FileConfiguration config;" ve "File dosya;" kodları tek class üzerinde kullanılacak ise "public" veya "private" özelliğine ihtiyaç duyulmaz.
* public - genelleştirir
* private - kişiselleştirir
Fakat bu tam ortası.
Ayrıca "onEnable()", "onDisable()" metodları kullanılırken "@Override" kodunun bir kullanım zorunluluğu yoktur.
Ve anlatımın güzel bir Listener sistemi örneği tebrik ederim.
 
Son düzenleme:

Salturbone

Portal Uzmanı
Mesajlar
5,189
En iyi cevaplar
0
Beğeniler
3,716
Puanları
6,890
Ruh hali
Bir komutu yazdıktan sonra ne olacağını nasıl belirleyeceğiz ?
 

Salturbone

Portal Uzmanı
Mesajlar
5,189
En iyi cevaplar
0
Beğeniler
3,716
Puanları
6,890
Ruh hali
Hala anlamadım... Açıklayabilir misin ?
 

SFKY

Kızıltaş Madencisi
Mesajlar
667
En iyi cevaplar
0
Beğeniler
296
Puanları
0
Kod:
public boolean onCommand (CommandSender sender, Command command, String commandLabel, String[] args){
    Player player = (Player) sender;

    if(commandLabel.equalsIgnoreCase("kill")){
      player.setHealth(0.0);
    }
    return false;
}
Düzeltme; player.setHealth(0.0D); çift sayılarda sonuna double (D) eklenir.
 

Üst