Sol Reklam

Rehber Bukkit Coding | Komut nasıl oluşturulur? Constructor nasıl kullanılır? MultiClass ve Package nasıl çalışılır? | Eklenti & Plugin dersleri

Durum
Mesaj gönderimine kapalı.

kingOf0

"~SimitSu"

Discord:

kingOf0!#4055

Katılım
14 Haziran 2016
Mesajlar
998
Elmaslar
745
Puanlar
15.070
Yer
getPlayer("SimitSu").getLocation()
Minecraft
SimitSu
yeni_logo-kopya-png.37941


Merhaba Mc-Tr üyeleri ben kingOf0!, Bu konumda sizlere Bukkit Coding adlı serimin üçüncü bölümü olan, Constructor nasıl kullanıl(ır)acağından ve nasıl Multi(Class|Package) çalışıl(ır)acağından bahsedeceğim.

Dikkat! Bu dersi daha iyi anlayabilmeniz için Bukkit Coding | Başlangıç dersini okuyup kavramanız gerekmektedir, lütfen önceBukkit Coding | Başlangıç konusuna gidiniz

Plugin Hakkında
Bu pluginimizde, bir komut oluşturacağız. Bu oluşturduğumuz komut'un CommandExecutor class'ı ile Main class'ımı birbirine bağlayacağız, bu şekilde, CommandExecutor class'ımızda, Main Class'ımızın metodlarına, değişkenlerine ve daha niceliklerine erişim sağlayabileceğiz.

MainClass
Her zamanki gibi Ana(Main) Class'ımızı oluşturarak başlıyoruz.

1548170876890.png

1548171140989.png





CommandExecutorClass
Komutumuzu atayacağımız class'ımızı belirleyeceğiz, ben bunu yaparken "Commands" adında bir paket oluşturup içine, CommandManager veya CommandExecutorClass
adında class oluşyuruyorum. Bu paket ve class isimleri sizin tercihinize kalmış.

1548171160823.png

1548171001061.png



Import
Bu class'ın nasıl çalışacağını belirtirken, CommandExecutor demiştik.
Şimdi, bunu import ediyoruz,

1548171312228.png


Add unimplemented methods
CommandExecutor
şeklime çalışacağını söylemiştik, bu şeklin kendine özgü olmazsa olmaz metodları var, bunu eklememizi istiyor.
Add unimplemented methods'a basarak bu metodları ekliyoruz.

1548171378195.png


1548171485666.png


Argümentleri isimlendirme
"CommandSender arg0, Command arg1, String arg2, String[] arg3" bu isimlendirme şekli, az önce otomatik oluştu. Bu isimlendirmeyi kullanan hemen hemen kimse yok.
Bu yüzden, daha genel bir isimlendirme yapacağız ki daha rahat anlayabilelim :D

1548171717660.png

burda 4 adet parametre mevcut.
CommandSender parametresi arg0 ile tanımlanmış.
Command parametresi arg1 ile tanımlanmış.
String parametresi arg2 ile tanımlanmış.
String[] parametresi arg3 ile tanımlanmış.

Bu tanımlar, kodun içerisinde bu parametrelerden bahsetmemize yarıyor.
Mesela, CommandSender'a ulaşmak için arg0 yazmamız yeterli...

1548172286745.png

CommandSender parametresini sender olarak tanımladık
Command parametresini cmd olarak tanımladık
String[]î ise args olarak tanımladık.
String'i label olarak tanımladık


Oyuncu mu kullandı?
Bu komutun oyuncu mu yoksa konsol tarafından mı kullandığını anlayacağız.

if (Sender instanceof Player)
Eğer (Sender, player'ın üyesi(örneği) ise)

olarak çevirilir,

1548172599139.png

Eğer konsol tarafından kullanılmılşsa?
konsol'a Bu komut konsol tarafından çalıştırılamaz! diye bir mesaj yollayacak.

1548173019808.png




player Adlı değişkeni oluşturma
Bu kısımda, Player türünde ve player adında bir değişken oluşturup bu değişkeni oyuncuymuşçasına kabul etttirdiğimiz sender'a eşitleyeceğiz.
instanceof ile kontrol ettiğimizden, sender'ın oyuncu olmama olasılığı yok. Bu yüzden rahatlılka onu Player olarak castleyebiliriz. (tanıtabiliriz / öyle olduğunu söyleyebiliriz)

1548173192450.png

Komudumuzu oluşturup temellerini attığımıza göre
Asıl Amacımıza geri dönelim


Bu CommandExecutorClass'ımızda MainClass'ımızı kullanalım, mesela bukkit'in config'ini çekelim.

MainClass'ımızda CommandExecutorClass'ımızdan bahsedelim(oluşturalım)

1548174264715.png


CommandExecutorClass türünde, cmdclass adında bir değişken oluşturup o değişkeni şimdi oluşturduğumuz(yeni bir) CommandExecutorClass class'ına eşitledik
parametre olarak ise this dedik. (this, bu class demektir.)

import
Bu class, farklı bir pakette olduğundan onu import etmemiz gerektiğini söylüyor.
Böylelikle Başka bir paketteki class'a erişmiş olduk. MultiPackage bu şekilde çalışılıyor.
Sizin import etmeniz yeterli, gerisini java halleder ;)
1548174401536.png




Constructor
Create constructor diyerek oluşturuyoruz. böylelikle, CommandExecutorClass'ında this'e erişebileceğiz.
Bu this, CommandExecutorClass'ında MainClass yerine geçecektir...


1548174501314.png


1548174623625.png



Gördüğünüz gibi constructor'ımız otomatikmen oluştu,

Bu constructor'da MainClass adlı class'ımız, mainClass diye tanımlanmış. Ben bunu plugin olarak değiştireceğim.

1548187095763.png



plugin'in constructor harici kullanılması nasıl sağlanır?
Field(Class adı ile, ilk metod arasındaki boşluğ)'a,
MainClass türünde plugin adında bir değişken oluşturup hiç bir şeye eşitlemiyoruz.

1548187159535.png

Sonrasında,
constructor'ımızın içine,

1548187252111.png

this.plugin = plugin;
yazıyoruz.


Böylelikle, Field'daki(Class içinde heryerden erişim sağlanabilen) plugin adlı değişkeni, constructor'ımızın içindeki plugin adlı değişkene eşitledik.
Böylelikle, plugin değişkeni bizim MainClass'ımıza eşitlenmiş oldu. Ve plugin'i CommandExecutorClass'ın her yerinde erişebilir hale geldik.


Son kısma gelelim,
plugin adlı değişkenimizin(MainClass'ımızın içinden) config'i çekiyoruz ve .set metoduyla
komutKullanildimi.Oyuncuİsmi adlı satırı true yapıyoruz.
Bu bölümde, bukkit'in config'ini anlatmayacağımdan detayına girmiyorum.

1548187442370.png




Komutumuzu kaydetme

MainClass'ımızın onEnable metodunun içine,
getCommand("komut").setExecutor(cmdclass);
yazıyoruz, Böylelikle, /komut yazıldığında, cmdclass olarak belirlenmiş class'ı harekete geçirecek.
cmdclass'ı ise 1 satır üstte belirtmiştik. Bu bizim CommandExecutorClass'ımıza denk geliyor
.
1548188033651.png


Plugin.yml'e komutu kaydetme
Bu yapmamız gereken son adım,
görselde olduğu gibi komutumuzu plugins.yml'e ekliyoruz.

1548188271121.png


1548188310545.png


Bu bölüm diğerlerine göre biraz daha farklı ve kısa oldu.
(!) Anlatım tamamen @kingOf0 'a aittir, İzinsiz Kopyalanması yasaktır. (!)
yeni_logo-png.37942






 

Ekler

  • 1548171217640.png
    1548171217640.png
    5,6 KB · Görünt.: 29
  • 1548172743897.png
    1548172743897.png
    11,2 KB · Görünt.: 30
  • 1548174618381.png
    1548174618381.png
    8,5 KB · Görünt.: 7

Electra

Eventually, everything goes away.

Discord:

Electra#9331

Katılım
25 Aralık 2018
Mesajlar
278
Elmaslar
835
Puanlar
2.310
Her zaman ki gibi kaliteli!
 

RebelZone

Yaratık Tuzağı: Çalışıyor

Discord:

RebelZone#6475

Katılım
29 Aralık 2018
Mesajlar
704
Elmaslar
1.692
Puanlar
9.075
Yer
RebelZone#6475
Minecraft
RebelZone
Efsane bir konu gibi gözüküyor hemen okumaya başlıyorum efenim...
 
S

Silinen üye 79251

Ziyaretçi

Güzel ders anlatımı olmuş hocam. Daha çok anlatımlar gelsin!
 

iTargetDS

Kızılsakal Kızıltaş?

Discord:

iTargetDS #6159

Katılım
8 Ekim 2017
Mesajlar
501
Elmaslar
118
Puanlar
7.295
Yer
Türkiyeeee
Minecraft
iTargetDS
Güzel bir konu olmuş.Devamını bekliyoruz.
 

Kalerda

Vatan Sevdalısı
Katılım
13 Ağustos 2015
Mesajlar
641
Elmaslar
589
Puanlar
15.030
Yer
Türkiye
Komut sınıfında constructor oluşturup bunun parametresine main sınıfına atayıp daha sonra tekrar komut sınıfındaki plugin değişkenine eşitleyeceğine

MainClass main = MainClass.getPlugin(MainClass.class); olara ana sınıfını komut sınıfına çağırabilirsin, daha kolay ve seri olacaktır.

Ayrıca ana sınıfına komut sınıfını daha kolay bir yöntemle çağırabilirsin.

getCommand("komut").setExecutor(new Komutsinifi);
 

kingOf0

"~SimitSu"

Discord:

kingOf0!#4055

Katılım
14 Haziran 2016
Mesajlar
998
Elmaslar
745
Puanlar
15.070
Yer
getPlayer("SimitSu").getLocation()
Minecraft
SimitSu
Komut sınıfında constructor oluşturup bunun parametresine main sınıfına atayıp daha sonra tekrar komut sınıfındaki plugin değişkenine eşitleyeceğine

MainClass main = MainClass.getPlugin(MainClass.class); olara ana sınıfını komut sınıfına çağırabilirsin, daha kolay ve seri olacaktır.

Ayrıca ana sınıfına komut sınıfını daha kolay bir yöntemle çağırabilirsin.

getCommand("komut").setExecutor(new Komutsinifi);
Yorumun için teşekkürler, fakat fikirine katılmıyorum.
Bu serinin amacı, en basitinden ve sağlıklısından insanları bukkit kütüphanesine aşina etmek, bu bölümde basitinden constructor kullanımı anlatı...


MainClass main = MainClass.getPlugin(MainClass.class);
Bu şekilde, constructor kullanmış olamayız. Bu bölümün amacına ters düşer.

daha kolay ve seri olacaktır.
Evet, belki sadece komut ekleyeceksek biraz seri olabilir. Fakat, ikiside aynı amacın farklı yolları. İkiside aynı aslında....
 

Kalerda

Vatan Sevdalısı
Katılım
13 Ağustos 2015
Mesajlar
641
Elmaslar
589
Puanlar
15.030
Yer
Türkiye
Yorumun için teşekkürler, fakat fikirine katılmıyorum.
Bu serinin amacı, en basitinden ve sağlıklısından insanları bukkit kütüphanesine aşina etmek, bu bölümde basitinden constructor kullanımı anlatı...



Bu şekilde, constructor kullanmış olamayız. Bu bölümün amacına ters düşer.


Evet, belki sadece komut ekleyeceksek biraz seri olabilir. Fakat, ikiside aynı amacın farklı yolları. İkiside aynı aslında....


Constructor kullanımını daha kullanışlı bir şekilde gösterebilirdin. Komut oluşturmak için constructor kullanmak biraz uzun gibi geldi bana.
Yine de yeni başlayanlara yol gösterecek bir konu.
 

Cherry

insan ayırmak değil, insan olmak ülküm

Discord:

Cherry#1165

Katılım
16 Ocak 2019
Mesajlar
329
Elmaslar
546
Puanlar
7.530
Yaş
24
Minecraft
Cherry
güzel ve yararlı bir konu olmuş ellerine sağlık dost
 

Shiryu

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

Discord:

Shiryu#1100

Katılım
16 Eylül 2018
Mesajlar
134
Elmaslar
97
Puanlar
6.670
Yaş
23
Yer
void
Minecraft
shiryusins
Bu konuda emek harcaman, insanlara bir şeyler öğretmeye çalışman cidden harika bir şey. Zaten bu konuda türkçe kaynak bulma zorluğu söz konusu yani öğrenmek isteyenlerin çok fazla işine yarıyacak bir konu. :)
 
Durum
Mesaj gönderimine kapalı.
Neden altınlarını Discord sunucumuzda kazmıyorsun? TIKLA VE KATIL!
Yukarı