Sol Reklam

Rehber Bukkit Eklenti Geliştirme Serisi -#2- Komutlar

Durum
Mesaj gönderimine kapalı.

erenalyoruk

Koydum Çalışma Masasını

Discord:

erenalyoruk#0786

Katılım
4 Ağustos 2018
Mesajlar
55
Elmaslar
33
Puanlar
6.480
Yer
Türkiye
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ık
Evet 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 gibi extends 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.​

1533842216675.png

İ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.

1533842384403.png

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şlamak
Evet 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.​
1533842565594.png


Tıkladığımızda dosyamıza çeşitli kodlar ve bir fonksiyon eklenecektir.​

1533842621322.png

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 ve​
komutun 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.Ben cmd.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 Edilmesi
Komutu 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.)
 

Ekler

  • 1533842676985.png
    1533842676985.png
    8,7 KB · Görünt.: 350

GGKağan

Bir Kömür Göründü Kaptanım!

Discord:

gollapuzesi#5701

Katılım
11 Nisan 2018
Mesajlar
109
Elmaslar
36
Puanlar
0
Yer
Samanyolu Galaksisi
Minecraft
gollapuzesi
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.​














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.)
Gene karışık bir bölüm, tabii bu benim Java'yı anlamamamdan dolayıdır. Anlamayı pek düşünmüyorum zaten. Arada skript derslerine bakıyorum, ancak gene skript'te de çok iyi değilim. Ancak sen Java'da baya iyiymişssin (bana göre.) Bundan dolayı seni tebrik ediyorum.
 

erenalyoruk

Koydum Çalışma Masasını

Discord:

erenalyoruk#0786

Katılım
4 Ağustos 2018
Mesajlar
55
Elmaslar
33
Puanlar
6.480
Yer
Türkiye
Gene karışık bir bölüm, tabii bu benim Java'yı anlamamamdan dolayıdır. Anlamayı pek düşünmüyorum zaten. Arada skript derslerine bakıyorum, ancak gene skript'te de çok iyi değilim. Ancak sen Java'da baya iyiymişssin (bana göre.) Bundan dolayı seni tebrik ediyorum.
Videolu derslere yakında başlamayı düşünüyorum orada anlatamadıklarımı daha güzel anlatacağımı düşünüyorum.
 

SYN_T3SL4

If you can't handle it you will win nothing !

Discord:

Halil#4439

Katılım
11 Mart 2016
Mesajlar
991
Elmaslar
911
Puanlar
19.300
Yaş
22
Yer
Aydın / Kuşadası
Minecraft
SYN_T3SL4
Interface yapısına neden girdin hemen hiç çözemedim :D Önce bir yürümeyi öğretseydin :D Interface öğretmen güzel ancak her zaman en düşüğü göstermeyi denemelisin. Geliştikçe hatalar, amele işçilikler farkedilir :D Bu arada konu düzenin git gide bir garip hal almaya başlıyor. Kendine bir konu tasarımı yaptırabilirsin. Yine bunun haricinde implements kısmını farklı örnekler (mc dışı) ile destekleyebilirsin. Başarılar
 
Durum
Mesaj gönderimine kapalı.
Neden altınlarını Discord sunucumuzda kazmıyorsun? TIKLA VE KATIL!
Yukarı