Bukkit Eklenti Kodlamaya Giriş

Katılım
10 Kas 2019
Konular
3
Mesajlar
10
Tepki puanı
20
Puanları
1,510
Selamlar,

Bu konuda Minecraft sunucunuz için nasıl eklenti yazabilirsiniz, neler gerekli ve diğer sorulara ucundan değineceğim. Konunun genel amacı insanları doğru şekilde yönlendirmek. Ben ilk başladığımda insanların anlatımları yüzünden Bukkit/Spigot dosyasını JAR dosyasına entegre edemiyordum, bu konuları aşarak birlikte küçük bir eklenti yazacağız. Öncelikle ben de bu konuda kendimi tam olarak her şeyi yapabilecek kadar bilgili saymıyorum, bu yüzden yanlışım olursa kusura bakmayın. Belirtirseniz düzeltirim.


Ön gereksinimler;
  1. Eclipse IDE
    1. 1 Bu program eklentiyi geliştirmemiz için bize ortam sağlayacak. Buraya tıkladıktan sonra "Download" butonuna basarak indirebilirsiniz. Yükleme için "Eclipse IDE for Java Developers" seçeneğini seçip yüklemeyi yapabilirsiniz.
  2. Java SDK
    1. 2 Bu araç, bilgisayarınıza geliştirme için gerekli olan şeyleri yükleyecek. Bu adrese giderek yükleyebilirsiniz.
  3. Spigot/Bukkit JAR Dosyası
    1. 3 Bu dosya ise projemize entegre edeceğimiz dosya, Minecraft değişkenlerini kullanmamıza olanak sağlayacak. Bu adrese giderek istediğiniz Minecraft versiyonuna göre indirebilirsiniz.


Gereksinimleri tamamladıktan sonra izlemeniz gereken adımlar

Yeni bir proje oluşturmak;

Eclipse IDE'yi açtıktan sonra, size bir workspace soracak. Bunu "Launch" butonuna tıklayarak geçebilirsiniz. Sonrasında Eclipse IDE açıldığında, File - New - Java Project diyerek yeni bir java projesi oluşturalım.

eclipseide.png



Sonrasında karşımıza alttaki ekran görüntüsündeki gibi bir ekran çıkacak;
Project Name kısmına proje ismi girebilirsiniz, türkçe karakter kullanmamaya dikkat edin. Sonrasında kırmızı ile işaretlediğim kısımları seçerek "Finish" butonuna tıklayabilirsiniz.

eclipseide2.png


Böylece projemiz oluşacak;
Karşımıza alttaki gibi bir ekran gelecek, şimdi Bukkit/Spigot ve JDA dosyamızı projemize dahil edeceğiz. Solda projenize sağ tıkladıktan sonra, "Properties" seçeneğine tıklayarak ekleyeceğimiz yere gidebilirsiniz. Alttaki ekran açıldığında "Java Build Path - Libraries - Add External JARs" dedikten sonra Spigot dosyamızı seçeceğiz. Sonrasında "Apply and close" diyerek kaydedebilirsiniz.

eclipseide4.png


Sonrasında yeni bir paket ve sınıf oluşturacağız;
Burada yine sağ taraftan proje dosyalarımız içinden "src" klasörüne sağ tıkladıktan sonra "New" kategorisinden "Class" kısmını seçeceğiz.

eclipseide5.png


Böylece karşımıza şöyle bir ekran çıkacak;
Burda bir paket ismi ve sınıf ismi tanımlayacağız. "Package:" kısmına genelde me.kullanıcı-adın.paket-ismi şeklinde yazılır. Türkçe ve büyük harf kullanmamak şartıyla takılabilirsiniz.


eclipseide6.png


Üstteki adımı tamamladıktan sonra;

Yeni bir sınıf daha oluşturacağız, aynı paketin içinde olacaklar erişebilmemizin kolay olması için. Ben ismini EventManager koydum, burda etkinlikleri dinleyeceğiz ve ona göre işlemler yaptıracağız.

eclipseide7.png


Böylece proje oluşturma aşamasını geçtik.


Şimdi, size bir kaç kodun ne işe yaradığını anlatayım. İlk olarak Main ana sınıfımızı oluşturduğumuzda, veya siz adını ne koyduysanız karşınıza böyle bir kod gelecek varsayılan olarak.

Java:
package -burda sizin paket isminiz yazacak-;

public class Main {

}

Bu varsayılan java kodudur sizi genelde karşılayacak olan kod dizisi budur. Burda "public class Main" yazan kısma bir şey eklememiz gerek. Ekleyeceğimiz şey "extends JavaPlugin" bu kod ise basitçe bir JavaPlugin'i kodladığımızı söylüyor. Ekledikten sonra satır şu şekilde görünecek; "public class Main extends JavaPlugin {"

Main yazan kısma aldanmayın, siz sınıfı hangi adla oluşturduysanız orda o yazacak.


Şimdi, yavaştan kodumuzu yazmaya başlayalım.

Şöyle bir şey var ki açıklayamayacağım. Bazı şeyleri kullandığınızda aşağıda ki "JavaPlugin" veya "ChatColor" gibi kırmızı gözükecek. Üstlerine gelip biraz beklediğinizde küçük bir pencere açılacak, o pencereden genelde org.bukkit olana tıklayarak o değişkeni entegre edebilirsiniz.

Oluşturduğunuz ilk ana sınıfa şunları yazmalısınız;

Java:
@Override
    public void onEnable() { // Bu kısım eklentiniz açıldığında hangi işlemlerin yapılacağı
        Bukkit.getServer().getConsoleSender().sendMessage(ChatColor.DARK_RED + "Plugin başlatıldı!");
        // Bukkit.getServer().getConsoleSender() Burda hepimizin bildiği cmd'ye yazı yazmak için Spigot dosyamızın içinden cmd'ye mesaj göndermek için operatörümüzü çağırıyoruz.
        // ChatColor.DARK_RED Burda ise göndereceğimiz mesajın hangi renk olmasını istediğimizi belirtiyoruz. Siz ChatColor. yazdıktan sonra bir dizi renkler çıkacaktır, istediğimizi seçebilirsiniz.
       // Unutmayın, mesajı her zaman metin olarak yazarız. Yoksa hata verecektir. Buna ilerde değineceğim.
    }

    @Override
    public void onDisable() { // Bu kısım eklentiniz kapandığına hangi işlemlerin yapılacağı
        Bukkit.getServer().getConsoleSender().sendMessage(ChatColor.DARK_RED + "Plugin kapandı!");
    }


Şimdi benim oluşturduğum EventManager adlı sınıfa gideceğim, siz hangi isimle oluşturduysanız onu açabilirsiniz.


Java:
package me.schwarzsky.Bum;



public class EventManager implements Listener { // Burda sizde implements Listener yazmayacak. Bunu eklemelisiniz, sunucuda olan biten şeyleri bu sınıf üzerinden görebilmemiz için gerekli bir şey.


}
}

Şimdi ben oyuncu öldüğünde öldüğü lokasyona şimşek çakmasını sağlayacağım, siz bu adresten etkinlikleri kullanarak kendinize özel bir şeyler yazabilirsiniz. Olmazsa fazla takmayın, deneme yanılma yoluyla oluyor. Yardım istediğiniz durumda bana da veya bu konunun altına da yazabilirsiniz.

Burada bahsetmem gereken bir olay var, her programlama dilinde değişkenler kullanılır. Basitçe bir kelimeye bir şeyler atıyabilirsiniz.
Örnek olarak "koray = 4" gibi çok basitleştirilmiş hali ile, aşağıda buna değineceğim.

Genelde etkinlikler şöyle yazılır;
Java:
@EventHandler // Etkinlik kullandığımızı belirtmek için
    public void onEtkinlikİsmi(Etkinlikİsmi etkinlikDeğişkeni) {
        // Yapılacak işlemler

    }

Şimdi bir kaç kod daha yazalım .d;
Java:
package me.schwarzsky.Bum;

// import olan kısımlar Bukkit/Spigot dosyamızdan gerekli değişkenleri ve sınıfları entegre ediyor, kırmızı görüken yazıların üstüne geldiğinizde açılan pencereden eklediğinizde bu şekilde ekleniyor.
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.PlayerDeathEvent;

import net.md_5.bungee.api.ChatColor;

public class EventManager implements Listener { // Burdan bahsetmiştim, Listener kısmı sunucuda olan etkinlikleri bu sınıf üzerinden dinlememizi sağlıyor ana sınıfımız aracılığıyla.

    @EventHandler // Burdan da bahsetmiştim, etkinlik olduğunu ve bence onla baş edeceğimizi belirtiyoruz .d
    public void onPlayerDeath(PlayerDeathEvent e) { // Burda ben oyuncu olduğunda işlemler yapmak için bu etkinliği kullandım.
        // Değişkenlerden bahsetmiştim, burda Player tipindeki değişkene e.getEntity(); diyerek ölen oyuncuyu atıyoruz, böylece istediğimiz yerde kullanabiliyoruz. Bazı yerlerde e.getPlayer(); olarak görebilirsiniz.
        Player player = e.getEntity();
        Location location = player.getLocation(); // Burda ise Location tipindeki location değişkenine kullanıcının nerde olduğu atıyoruz.
        World world = player.getWorld(); // Burda hangi dünyada olduğunu, Nether? Ender? Normal Dünya?
   
   
        world.strikeLightning(location); // Burda ise yukarda aldığımız kullanıcının lokasyonuna world değişkenine atadığımız dünyaya .strikeLightning(); ile şimşek çarptırıyoruz. Parantez içine lokasyon değişkenini yazdık ki dinamik olarak kullanıcının lokasyonunu çekebilelim.
        player.sendMessage(ChatColor.DARK_RED + player.getName() + " Öldün!"); // Burda ise player değişkeni üzerinden oyuncuya mesaj gönderiyorum, mesaj rengini koyu kırmızıya ayarladım. Player değişkeni üzerinden kullanıcının ismini aldım ve "Öldün!" metnini de ekledim. Burda + operatörünü değişken ve metinleri birleştirmek için kullanabiliriz.

    }
}


Benim bir de Main yani ana sınıfıma bir şey yazmam gerek etkinlikleri dinleyebilmek ve bu sınıfı ana sınıfıma dahil etmek için.

Java:
@Override
    public void onEnable() { // onEnable kısmının içine ekleyeceğim çünkü eklenti aktif olduğunda direk olarak bu olayı yapsın.
        Bukkit.getServer().getConsoleSender().sendMessage(ChatColor.DARK_RED + "Eklenti aktif!");
        getServer().getPluginManager().registerEvents(new EventManager(), this); // Burayı ekledim, burda sunucuya yeni etkinlikler tanımlıyoruz EventManager() sınıfı aracılığıyla.
    }


Şöyle bir öneride bulunayım, sorunlarınızı internette aramaktan kaçınmayın. Forumlara bakın, cevapları okumaya çalışın, araştırın iyice ki çözüm bulup alışabilesiniz. Herkes her şeye hemen alışamaz, hemen bir konuda profesyonel olamazsınız. Dolayısıyla bir şeyi öğrenmek o konuda bilgi sahibi olmak istiyorsanız üstüne gitmeniz gerek. Kodlama dillerinin yazım şeklini anlayana kadar bu ne olum? bu ne lan? diyebilirsiniz. Araştırdıkça gözünüz, klavyeniz aşina oldukça alışacaksınız öğreneceksiniz zaten.


Sonrasında proje klasörüme bir de "plugin.yml "adlı bir dosya oluşturacağım. Bu dosyada eklenti adını, versiyonunu, komutlarını ve ana sınıfını tanımlayabiliriz. Solda proje kısmından "src/" klasörüne sağ tıkladıktan sonra "New - File" dedikten sonra açılan ekrana "plugin.yml "yazarak oluşturabilirsiniz. Sonrasında bir pencere daha açılacak, orda ise alttaki seçeneği işaretleyerek geçebilirsiniz. Varsayılan editörde açılacaktır.

eclipseide8.png



plugin.yml Adlı dosyanın içeriği ise şu şekilde olacak;
XML:
name: FakeHacer # Eklenti ismi
author: schwarzsky # Yapımcı, geliştirici
version: 1.0 # Sürüm
main: me.schwarzsky.Bum.Main # paketinizin-ismi.ana-sınıfımızın-ismi
description: Sahte hacer # Eklenti açıklamanız

Bu kadar. Bir eklenti yazmış olduk, makale çok uzun oldu ama sonraki makalelerde -üşenmeyip yazarsam- proje oluşturma ve diğer basit konulara çok değinmeyeceğim için daha kısa olmasını umuyorum.


Dışarıya Aktarma

Şimdi son aşama olan dışarıya çıkartma -export- işlemini yapacağız. Bu işlemin sonunda bize eklentimizi çalışan bir JAR dosyası olarak verecek.

Sol kısımdan projemize sağ tıkladıktan sonra "Export" seçeneğini seçeceğiz.

zGkzn4.png


Sonrasında karşımıza alttaki gibi bir pencere çıkacak, burdan öncelikle "JAR File" sonrasında seçenekleri işaretlediğim gibi seçip "Finish" butonuna basarak dışarıya aktarabilirsiniz.

va2BZr.png

"Select the export destination:" kısmını ise nereye kaydedilmesini istiyorsanız oraya seçebilirsiniz. Ben kendi bilgisayarımdaki yerel sunucumun plugins klasörünü seçtim.




4poJMJ.png


Öldüğümüzde sohbette koyu kırmızı renkte "Pirsink Öldün!" yazıyor ve öldüğümüz lokasyona başarılı bir şekilde şimşek çakıyor.

qAkXWQ.png


Böylelikle çalışan bir eklenti yapmış olduk!

Sık Sorulan Sorular

Sınıf nedir ve neden oluştururuz?

Sınıflar belirli işlemler yaptığımız ve daha sonra bunları farklı bir dosyaya entegre etmemize olanak sağlayan şeylerdir. Diğer programlara dillerine aşina iseniz function'a benzer bir yapısı vardır.


Neden projelere bir şeyler entegre ediyoruz? (Bukkit/Spigot veya Java SDK gibi)

Şöyle ki, bilgisayarınıza yüklü gelmeyen bazı şeyler vardır. Bukkit ve Spigot'u sunucu altyapısı olarak sayabiliriz. Sunucuda yaşanan olayları veya diğer şeyleri çekmemiz için kütüphane görevi görüyorlar. Mesela hoca sizden bir şey araştırmanızı istedi ve eski zamanlardasınız, kütüphaneden kitap ararsınız bununla ilgili. Buna daha sonra değineceğim.


Neden Eclipse IDE gibi programlara ihtiyaç duyuyoruz?

Dediğim gibi bilgisayarlarda varsayılan olarak yüklü gelmeyen şeyler vardır. Bu programlar kodu daha kolay yazmamızı ve daha kolay dışarı aktarmamızı sağlayan şeylerdir. Böyle programlar olmaz ise, her şeyi elimizle manuel olarak dışa aktarmamız gerekir. Dolayısıyla böyle programların kurulumu uğraştırsa da işimizi çok kolaylaştırıyor.

Kodlamalar neden bu şekilde yapılıyor? (Yazım şekli bkz.syntax)

Bilgisayarın ve kullandığımız programın anlayabilmesi ve işleyebilmesi için Syntax diye bir yazılım şekli vardır. Her yazılım dilinin kendine özel bir yazım şekli vardır, mesela burada kullandığımız süslü parantezleri Python dilinde kullanmayız. Dediğim gibi yazım şekilleri dilden dile değişir, mantığını ve yazım şeklini çözdüğünüzde her şey daha kolay olacaktır. Bu yüzden kodlayarak öğrenme yöntemiyle öğrenmeye çalışırsanız daha iyi kavrayabilirsiniz.
 
Son düzenleme:
Katılım
12 Kas 2019
Konular
4
Mesajlar
14
Tepki puanı
5
Puanları
0
Başarılı konu ve güzel anlatım. İyi forumlar. 10/10
 
  • Beğen
Tepkiler: schwarzsky
Katılım
20 Kas 2019
Konular
0
Mesajlar
3
Tepki puanı
0
Puanları
0
Yararlı bir konu,yazı tip kullanımın efsane.Video çekip bir tanede video eklesen çok güzel olur.
Ama böyle de gayet iyi üşenmeyip ben bu işi yapcam diyenler kesinlikle bu konudan yararlanabilir.
 
Katılım
11 Nis 2020
Konular
4
Mesajlar
20
Tepki puanı
17
Puanları
0
Eline sağlık çok güzel anlatmışsın böyle devam.
 
Katılım
23 Kas 2019
Konular
1
Mesajlar
431
Tepki puanı
33
Puanları
2,210
Böyle bir Anlatım Şekli yok. Emeğine Sağlık.
 
Katılım
9 Kas 2019
Konular
13
Mesajlar
124
Çözümler
2
Tepki puanı
33
Puanları
2,710
Eklenti Kodlamaya Giriş #3 ü Ben mi yapsam. hmmmm