Bukkit Eklenti Kodlamaya Giriş #2

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

Bu konularda Minecraft için eklenti nasıl kodlanır? sorusuna değiniyoruz ve birlikte eklenti kodlamaya çalışıyoruz. Bu konuda önceki konuyu okuduğunuzu varsayarak anlatım yapacağım. Bu konuya girmeden önce pekiştirmeniz gereken bir kaç olay var.

Şöyle listeleyebilirim;
  • Eclipse IDE üzerinde proje nasıl oluşturulur, nasıl dışa aktarılır?
  • Proje içinde sınıflar nedir? Listener nedir?
  • plugin.yml dosyası oluşturmak
  • onEnable(), onDisable() -Bu projede bir kaç yeni şey ekleyeceğiz. onLoad(), getJda() gibi, anlatacağım-
  • @Override ve @EventHandler
  • Veri tipleri, veriler ve veri tanımlamak
  • Bukkit/Spigot dosyasından bir şey nasıl entegre edilir -bkz.import-
Bu gereksinimleri tam olarak bilmenize gerek yok, önceki konuyu uygularsanız çoğunu anlayacağınızı umuyorum. Buraya tıklayarak gidebilirsiniz.

Ön Gereksinimler
  • Bukkit/Spigot Dosyası
  • Eclipse IDE veya IntelliJ
  • Bilgisayarınızda bir yerel sunucu veya sanal sunucu
  • Bir de JDA dosyası
  • Discord sunucusu
  • Önceki projedeki gereksinimler.

Bu konuda Discord üzerindeki bir kanalı Minecraft üzerindeki sohbete entegre edeceğiz. Bunu JDA aracılığı ile yapacağız, bu kütüphane Java dili ile Discord Botu yazmamızı sağlıyor.


Öncelikle, Discord'un sitesine gidip bir bot oluşturacağız. Sonrasında botun token denen giriş anahtarını alacağız (Basitçe şifre, kimseyle paylaşmayın) ve bunu JDA'ya sonra tanımlayacağız. Bu adrese gittikten sonra en alta inerek "Applications" kısmına tıklayacağız.

Applications.png



Sonrasında yönlendirdiği sayfada sağ üstten "New Application" kısmına tıkladıktan sonra karşımıza bir pencere çıkacak. Buraya bir isim girip geçebiliriz.

na.png



Sonrasında yönlendirdiği sayfada sol kısımdan "Bot" kısmına tıklayacağız ve "Add Bot" butonuna tıklayacağız. Emin misin diye soracak, evet diyerek geçebilirsiniz.

addbot.png



Bu sayfaya yönlendirileceğiz. Bu sayfada "Copy" butonuna tıkladıktan sonra tokeni alacağız. Bunu bir yere kaydedin ve kimse ile paylaşmayın. İlerde kullanacağız.

copytoken.png



Sonrasında sol kısımdan "General Information" kısmına tıklayıp Client ID değerini kopyalayın. Buraya tıklayarak sayfaya gittikten sonra alt kısımda "Client ID" kısmına yapıştırın. Üst kısımdan "Administrator" değerini işaretleyin ve linki kopyalayın. Bu adresi botu Discord sunucumuza davet etmek için kullanacağız.

invitelink.png



Böylece küçük işlemleri tamamlamış olduk. Şimdi biraz kod kısmına geçelim.

Öncelikle projenizi oluşturun, plugin.yml dosyasını doldurun. Sonrasında ben yeni bir paket oluşturdum, içine bir de listener diye bir paket oluşturdum. listener paketinin içine 2 sınıf oluşturdum. Adlarını BukkitListener ve DiscordListener olarak ayarladım. Sonrasında diğer paketin içine bir de Main sınıfı oluşturdum.

Sonrasında kütüphaneleri ekleyin. JDA ve Bukkit dosyasını yani

Projenin iskeleti şöyle olacak;
projectstructure.png2.png.png



Main sınıfıma gidip projemin iskeletini oluşturacağım, farklı sınıflardan gelen şeyler burada toplanacak.

Java:
package me.schwarzsky.selam;

import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.entities.Message;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;


public class Main extends JavaPlugin { // Daha önceki konuda bahsetmiştim. Main sınıfına "extends JavaPlugin" diyerek bir eklenti olduğunu belirtiyoruz.


    @Override
    public void onLoad() { // Yüklendiğinde yapılacaklar.
    }

    @Override
    public void onEnable() { // Eklenti aktif duruma geçtiğinde yapılacaklar.
        super.onEnable();
    }

    @Override
    public void onDisable() { // Eklenti deaktif duruma geçtiğinde yapılacaklar.
        super.onDisable();
    }

    public JDA getJda() {  // JDA gereken durumlarda bu fonksiyon ile alabileceğiz.
        return jda;
    }

    public void sendMessageToMinecraft(Message message){ // Burada Discord üzerinden gelen mesajları DiscordListener sınıfı aracılığıyla Minecraft sunucumuza göndereceğiz.
       
    }

    public void sendMessageToDiscord(Player player, String message){ // Burada da üstteki gibi Minecraft sunucusu üzerinden gelen mesajları BukkitListener aracılığı ile Discord sunucumuza göndereceğiz.
       
    }
}


Ana sınıfın iskeletinden sonra bir kaç şey ekleyeceğim iskelet üzerine.

Java:
package me.schwarzsky.selam;

import me.schwarzsky.selam.listener.BukkitListener;
import me.schwarzsky.selam.listener.DiscordListener;
import net.dv8tion.jda.api.AccountType;
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.JDABuilder;
import net.dv8tion.jda.api.entities.Message;
import net.md_5.bungee.api.ChatColor;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;

import javax.security.auth.login.LoginException;

public class Main extends JavaPlugin {

    private JDA jda; // JDA'yı tanımlayalım ve üstten çağıralım.


    @Override
    public void onLoad() {
        try {
            jda = new JDABuilder(AccountType.BOT).setToken("KOPYALADIGINIZ_TOKEN").addEventListeners(new DiscordListener(this)).build(); // ÖNEMLİ! JDA Botu aktifleştirmek için gereken kod bu kısım, bunu try ve catch ile kullanıyoruz ki bir hata olduğunda sunucumuz kullanılamaz hale gelmesin. Hatayı yazdırsın ve yoluna devam etsin. catch kısmı bir hata olduğunda ne yapacağı.
        } catch (LoginException e) {
            e.printStackTrace();

        }
        super.onLoad();
    }

    @Override
    public void onEnable() {
        Bukkit.getPluginManager().registerEvents(new BukkitListener(this), this); // BukkitListener sınıfımızı etkinlik olarak tanımlayacağız.
        super.onEnable();
    }

    @Override
    public void onDisable() {
        jda.shutdown(); // Eklenti deaktif olduğunda Discord botunu da kapatacağız.
        super.onDisable();
    }

    public JDA getJda() {
        return jda;
    }

    public void sendMessageToMinecraft(Message message){
       
    }

    public void sendMessageToDiscord(Player player, String message){
       
    }
}



Sonrasında diğer sınıflara kodları yazacağım. Öncelikle DiscordListener sınıfını yazıyorum.
Java:
package me.schwarzsky.selam.listener;

import me.schwarzsky.selam.Main; // Burada Main sınıfımızı dahil ediyoruz.
import net.dv8tion.jda.api.events.ReadyEvent;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;

import javax.annotation.Nonnull;

public class DiscordListener extends ListenerAdapter { // Buraya "extends ListenerAdapter" kısmını ekliyoruz. Discord'a mesaj yazıldığında dinleyebilmek için gerekli. Üst kısımda da dahil ediyoruz.
    private final Main main; // Main sınıfımızı tanımlıyoruz, bir şeyler göndermek ve çekebilmek için gerekli, alttaki kodu da yazabilirsiniz.

    // Bu kısım
    public DiscordListener(Main main) {
        this.main = main;
    }
    // Bu kısım


    @Override
    public void onReady(@Nonnull ReadyEvent event) { // Hazır olduğunda yapılacaklar.
        System.out.println("Sınıf entegre edildi."); // Hazır olduğunda entegre olduğunu anlamak için sunucu konsolumuza yazdırıyoruz.
        super.onReady(event);
    }

    @Override
    public void onMessageReceived(@Nonnull MessageReceivedEvent event) { // Discord üzerinde bir mesaj alındığında çekebilmek için bu etkinliği kullanıyoruz. Burada event değişkenine tanımlıyoruz. Diğer programlara dillerine aşinaysanız foreach'te başka bir değişkene atamak gibi.
        if(event.getAuthor().isBot()) return; // Mesajı gönderen bot ise aşağıdaki işlemleri uygulamamasını söylüyoruz "return;" ekleyerek. Burada if kullanıyoruz aşağıda değineceğim.
        if(event.getGuild() == null) return; // Özelden mesaj gönderildiyse aşağıdaki işlemlere geçmemesini söylüyoruz.
        main.sendMessageToMinecraft(event.getMessage()); // Burda ana sınıfta tanımladığımız fonksiyona mesajı parantez içinde  yazarak gönderiyoruz. Üstte Main varsayılanını tanımlamıştım hatırlarsanız, bu yüzden başta "main." kısmını kullanarak yazıyorum.
         super.onMessageReceived(event);
    }
}


Şöyle ki if, else programlama yapan kişilerin çok kullandığı şeylerdir. Önceki konuda bahsetmemişim, biraz buna değinelim.

Java:
int sayi = 1;

         if(sayi == 1){ // IF ve ELSE kısımlarını böyle kullanıyoruz. if basitçe eğer anlamına geliyor diyebiliriz. Eğer sayı 1'e eşitse demek için  == öperatörü ile bunu belirtiyoruz.
             System.out.println("Evet 1'e eşit."); // Eşitse bunları yap
         } else { // Eşit değilse
             System.out.println("Maalesef, 1'e eşit değil.");  // Eşit değilse bunu yap gibi
         }


Şimdi BukkitListener sınıfına geçiyorum.
Java:
package me.schwarzsky.selam.listener;

import me.schwarzsky.selam.Main;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent;

public class BukkitListener implements Listener { // Burda Bukkit içindeki Listener'ı ekliyoruz dinleyebilmek için. Üstte de import'u görebilirsiniz.
    private final Main main; // Önceki sınıftaki gibi burda da ana sınıfımızı tanımlıyoruz içindeki fonksiyonları kullanabilmek için, ayrıca üstte import ediyoruz.

    public BukkitListener(Main main) { // Önceki sınıf ile aynı
        this.main = main;
    }

    @EventHandler
    private void onPlayerChat(AsyncPlayerChatEvent e){ // Bukkit içerisinde bir oyuncu sohbete bişey yazdığında bunu çekebilmek için bu etkinliği kullanıyoruz.
        main.sendMessageToDiscord(e.getPlayer(), e.getMessage()); // Burda ise Main sınıfımız içerisindeki sendMessageToDiscord() fonksiyonuna oyuncunun adını ve gönderdiği mesajı gönderiyoruz.
    }
}

Ana sınıfıma bir kaç şey ekleyeceğim bundan sonra, bildiğiniz üzere iskeleti yaptıktan sonra fonksiyonu yazdık ama içini doldurmadık. Şimdi içine bir takım işlemler yazacağız.

Java:
public void sendMessageToMinecraft(Message message){
        // Bukkitte bir mesajı tüm kullanıcalara göstermek için broadcastMessage'i kullanıyoruz. Ben parantezin içindeki gibi bir mesaj şablonu yaptım, siz nasıl isterseniz yapabilirsiniz.
        Bukkit.broadcastMessage(ChatColor.GOLD + "[DC] " + ChatColor.WHITE + message.getAuthor().getName() + ": " + message.getContentRaw()); // Burda DiscordListener aracılığı ile aldığımız mesajın bilgilerini çekiyoruz. message.getContentRaw()'ı mesajın tamamen string yazı olarak gelmesi için kullanıyoruz. message.getAuthor() ise mesajı gönderen kişiyi çekmemize yarıyor. Bunu direk böyle kullansaydık id ve tag ile yazdıracaktı.
}

    public void sendMessageToDiscord(Player player, String message){
        // Burda BukkitListener aracılığı ile aldığımız mesajları Discord'a gönderiyoruz.
        jda.getTextChannelsByName("amdin", true).get(0).sendMessage("**[IC]** " + player.getName() + ": " + message).queue();
        // jda kullanarak Discord üzerindeki kanalı ismi ile çekiyoruz. getTextChannelsByName("kanal ismi")
        // Sonrasında get(0) ile ilk bulduğu kanalı çekiyoruz, fazla olursa hepsine yazamayız :(
        // player.getName() ile oyuncunun ismini çekiyoruz, sondaki queue() ise bu mesajı sıraya ekliyoruz.
}

Dışarıya aktarırken JDA dosyası ile aktarmayı unutmayın. Konsol ekranında hata ile karşılaşabilirsiniz böyle yapmazsanız.




Ben dışarıya aktardım, plugins klasörüme attım. Şu an çalışıyor olması gerek, deneyelim.

Xb1n60.png



Minecraft'tan Discord'a
QP3kLG.png

bvXOV0.png


Discord üzerinden Minecraft'a
YdL1dj.png

jqOEqj.png



Böylece çalışan bir eklenti daha yapmış olduk! İyi kodlamalar.
 

Ekli dosyalar

  • projectstructure.png
    projectstructure.png
    4.4 KB · Görünt.: 207
Son düzenleme:

OkanOzturk

Yönetici
Katılım
4 Kas 2019
Konular
23
Mesajlar
220
Çözümler
12
Tepki puanı
539
Puanları
3,760
Çok güzel bir anlatım olmuş eline sağlık.
 
  • Beğen
Tepkiler: schwarzsky
Katılım
23 Kas 2019
Konular
1
Mesajlar
431
Tepki puanı
33
Puanları
2,210
Anlatımın Süperm Helal olsun :love: