Selamlar dostlarım! Önceki derste devam etmem için yorumlar aldım bu da beni çok mutlu etti.Öncelikle bu seri ile ilgili söylemek istediğim şeyler var.
- Eklenti geliştirmek için yalnızca eclipseyi kullanmamız gerekmez.Kendinize en uygun IDE'yi bularak yola devam etmenizi öneririm.Bizim bu seride eclipse kullanma amacımız, az yer kaplayan, arayüzü basit, başlangıç için oldukça güzel bir IDE olmasıydı.Eğer Java'da gerçekten ilerlemek istiyorsanız eclipse size yetersiz gelmeye başlayacaktır.Bu yüzden ufak bir araştırma yaparak IDE'nizi seçmenizi öneririm.
- Önceki dersin yorumlarını incelerseniz Maven ve Gradle adında iki geliştirici aracı görebilirsiniz.Bu konulara son derslerimizde yer vereceğim.Öncelikle Bukkit ile çalışmayı öğrenmemiz lazım.
Evet kısa notlarımızı verdikten sonra hemen konumuza geçelim.
1. Komut Oluşturmak için Ön HazırlıkEvet komut oluşturmaya başlamadan önce önceki bölümde kullandığımız sınıf dosyamızı tekrar oluşturmamız lazım.Eğer önceki bölümü okumadıysanız buradan ulaşabilirsiniz.Ana sınıfımızı da hazırladıktan sonra hemen komut hazırlamaya dönelim.
Öncelikle yapmamız gereken ilk işlem yeni bir sınıf oluşturmak.Bunu nasıl yapacağımızı önceki konumuzda öğrenmiştik.Sınıfın adını istediğiniz bir şey yapabilirsiniz.Ardından oluşturmuş olduğumuz sınıfa CommandExecutor adındaki Interface dosyasını uyguluyoruz.Bunu nasıl yapacağınızı bilmediğinizi varsayarak anlatmaya devam ediyorum.
1.1. Interface Dosyasını Sınıf Dosyasına Uygulamak
Oldukça basit bir işlem.Önceki dersimizde hatırladığınız gibiextends JavaPlugin
kavramını kullanmıştık.Bu kelime grubu sınıf dosyamıza JavaPlugin adında bir sınıfı kullanımımıza sunuyordu.Şimdi ise bir sınıf değil de Interface eklememiz lazım yani extends burada istediğimiz özelliği sağlayamayacak.Sınıflarımıza interface uygulamak için kullandığımız kelime implements sözcüğüdür.Kullanımı ise üstteki örneğe benziyor.
İsterseniz bu kodda eklediğimiz kısımları inceleyelim.- implements yukarıda bahsedilenden farklı bir şey değil.Interface dosyalarını sınıflarımıza uygulamak için kullandığımız bir sözcük.- CommandExecutor bu ise sınıfımıza uyguladığımız Interface.
Bu kodları yazdıktan sonra sınıf isminizin altında çizgi çıktığını fark edeceksiniz.Hatayı anlamak için üzerine geldiğinizde size bir hata gösterecektir.
Hatamızı yalnızca bu Interface dosyasında değil, fonksiyon içeren herhangi bir interface dosyasında da yaşarız.Bunun sebebi ise Interface dosyalarında kullanılan fonksiyonların tümü, onu uyguladığımız dosyada da bulunmalıdır.
2. Komut Oluşturmaya BaşlamakEvet hata mesajımızın kaynağını da anladıktan sonra tekrar sınıf dosyamızın üzerine geliyoruz ve bu sefer Add Unimplemented Methods seçeneğine tıklıyoruz.
Tıkladığımızda dosyamıza çeşitli kodlar ve bir fonksiyon eklenecektir.
Hemen bu kodlarımızı açıklayalım.- @Override önceki bölümde anlattığım şekilde aynı kullanıma sahip.- public önceki bölümde anlatıldı.- boolean ise önceki bölümde boş değer döndüren void sözcüğünün yerine kullanılmıştır.Eğer fonksiyonda void sözcüğü yoksa bu fonksiyon bir değerler döndürüyordur.Örneğin burada fonksiyonumuz boolean denen bir değer döndürüyor.Boolean ise true ya da false olarak iki değer alabiliyor.Yani fonksiyonumuz ya doğru ya da yanlış şeklinde bir değer döndürecek.- onCommand(...) fonksiyonun ismidir.Değiştirirseniz 1.1. Interface Dosyasını Sınıf Dosyasına Uygulamak bölümünde anlattığımız dahil edilmemiş metotlar hatasını tekrar alırsınız.Çünkü interface dosyasında tanımlandığı isim onCommand'dır.- return fonksiyonun değerine göre dönüş işlemini yapar.- false ise fonksiyonumuz boolean değerinde dönüş istediği için yazılmıştır.(false döndürmesi veya true döndürmesi şimdilik işimize yaramayacak.Ancak eğer istediğiniz komut çalışmazsa false, çalışırsa true döndürebilirsiniz.)- Fonksiyon Parametreleri:
CommandSender: Burada tanımlanan arg0, komutu gönderen herhangi bir nesnedir.Üç farklı değer alabilir.Komutu gönderen oyuncu (Player), komutu gönderen konsol(ConsoleCommandSender) ya da komutu çalıştıran komut bloğu(CommandBlockSender). Command: Buradaki tanımlanan arg1 ise hangi komutun çalıştığıdır. String: Java'daki ilkel veri tiplerinden biri olarak tanımlanmış arg2 ise komutun ilk kelimesidir.Yani /test 123 komutundaki test bölümü arg2 değerine aktarılır. String[]: ise dizi şeklinde tanımlanmış bir veri tipidir.arg3 değişkeni arg2 dışındaki tüm değerleri depolar.Örnek Kullanım:- Senaryo: Oyuncu komutu çalıştırır.- Komut: /test deneme araba 123- (CommandSender) arg0: Player- (Command) arg1: /test deneme araba 123 (Bu parametre bir nesnedir.Bu değer sayesinde komut ait tüm verilere ulaşılabilir.)- (String) arg2: test- (String[]) arg3[]: deneme araba 123
Şimdi bu senaryomuzu koda dökelim.Bundan önce okunurluğu ve anlaşılabilirliği arttırmak için birkaç düzenleme yapabiliriz.Örneğin değişken adlarını daha anlaşılabilir yapalım.Kod:public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
Artık komutu çalıştıranı bulmak istediğimde sender,Komutu bulmak istediğimde cmd,Komutun adını bulmak istediğimde label vekomutun parametreleri için args kelimesini kullanacağım.
Hemen komutu belirleyerek işe başlayalım.Öncelikle komutun adını öğrenmemiz lazım.İki şekilde yapabiliriz.Bencmd.getName()
şeklinde kullanıyorum.
Java:if (cmd.getName().equals("test")) { } if (label.equalsIgnoreCase("test")) { }
Kod Çözümlemesi:
- if (...): Detaylı bilgiyi internet üzerinden edinebilirsiniz.
- cmd bunu anlattık.
- getName() bu ise yine anlattığımız bir özellik.Komutun adını alıyor.label değeri ile aynı değeri döndürüyor.- equals(...) ise komut adını kontrol ediyor.İstediğimiz değer ise true, değilse false döndürüyor.(Eğer komutunuzun /TeSt veya /TesT olarak da kullanılmasını istiyorsanız equalsIgnoreCase("test") fonksiyonunu kullanabilirsiniz.)- "test" ise komutun adı.
Ben komut çalıştırıldığında mesaj göndermek istiyorum o yüzden sender nesnesinden yararlanarak mesaj göndermek için kullanılan sendMessage("ARABA") fonksiyonunu kullanıyorum.Bu sayede komutu çalıştıran kişi ARABA şeklinde bir mesaj alacak.Kodumun son hali şu şekilde gözüküyor.
Java:package ni.w5.komut; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; public class Komy implements CommandExecutor { @Override public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { if (cmd.getName().equals("test")) { sender.sendMessage("ARABA"); } return false; } }
Şimdi ana sınıfımıza dönerek komutumuzu kayıt etmemiz lazım.
3. Komutun Kayıt EdilmesiKomutu ana dosyamıza giderek onEnable() fonksiyonu içerisinde kayıt etmemiz lazım ki her açılışta komut kayıt edilsin.
Java:[/JUSTIFY] [JUSTIFY]this.getCommand("test").setExecutor(new Komy());[/JUSTIFY] [JUSTIFY]
Bu şekilde bir kod yazarak komutumu kayıt ettiriyorum.Hadi gelin komutu inceleyelim.this: Ana dosyamıza referans.getCommand("test"): Komutun belirlenmesi. (Benim kullandığım komut test olduğu için test yazdım.Sizinki farklı ise değiştirebilirsiniz.)setExecutor(...): Komutun çalıştırıldığı dosya.new Komy(): Komutun çalıştırıldığı dosyanın oluşturulması.Benim komut dosyamın adı Komy olduğu için bu şekilde yazdım.Sizinki farklı ise değiştirebilirsiniz.
Daha işimiz bitmedi.Şimdi de plugin.yml dosyamıza şu satırları ekliyoruz.
Kod:commands: test:
Başlangıç için bu kadar detay yeterli.Fakat ileride daha detaylı plugin.yml kullanmayı öğreneceğiz.
Bu dersimizde çok fazla fotoğraf ve bilgi ekleyemediğimi fark ettim.Size aktarmak istediğim o kadar bilgi var ki hem eklenti hem de Java'yı öğretmeyi hedefliyordum fakat sadece yazı ile ancak bu kadar olabiliyor.
Bu yüzden videolu anlatımlar için gerekli hazırlığı yapmaya başlıyorum.Yazıları olabildiğince kısa tutarak ilginizi kazanmayı hedefliyorum.İyi okumalar.
(Umarım sonraki dersimizde video ile görüşürüz.)