Tanıtım Açık Kaynak Kodlu Otomatik Chat Event Eklentisi

Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...
Katılım
2 Eylül 2014
Mesajlar
52
Elmaslar
79
Puan
0
@RyDeRHD 'nin isteği ile;
46e9e7ae91681b0b9cfcaf3b82343dd3.png


Açıklamalı Tek Main Class;
Kod:
package me.Zindev.otoevent;

import java.text.DecimalFormat;
import java.util.Date;
import java.util.Random;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;

//Javaya bu classın dinleyici niteliğine sahip olduğunu bildirmek için implements Listener kullandık.
public class Main extends JavaPlugin implements Listener{
  
    //Java'nın tarihleri tutmak için kullandığı Date classı tipinde bir değişken atadık ama değer vermedik.
    //Zamanı eklenti aktif olduktan 3 dakika sonraya atıcaz ki,event sunucu açıldıktan 3 dakika sonra başlasın.
    //Hem oyuncular girmiş olur hemde bütün eklentiler yüklenmiş olur.
    private static Date zmn_event;
    //Bir başka Date objesi,eventin baslayip baslamadigini ve basladiysada ne zaman basladigini tutacak.
    private static Date basladi;
    //Milisaniye(1000 milisaniye = 1 saniye) hesabı ile event tekrarlama süresini 20 dakika yaptık.
    private static final int dakika = 20*60*1000;
    //Milisaniye hesabında eventin kaç saniye süreceği;Şu anda 10 saniye.
    private static final int event_suresi = 10*1000;
    //Ödül için verilecek eşya,Spigot'un ItemStack class'ı tipinde,
    //veriyi bizim yaptığımız odulYap() metodundan alıyor.
    private static ItemStack odul = odulYap();
    //Süre döngüsünün ID'sini bu değere atıcaz.Böylelikle eklenti sonlanırken ID'sinden bulup kapatıcaz.
    //Şu anda -1 yaptım fakat eklenti başlarken bu değer süre döngüsünün ID'si olacak.
    private static int donguID = -1;
  
    //Gelecek yazının ne kadar uzun olacağı.Ne kadar uzun o kadar zor :)
    private static final int uzunluk = 10;
    //Karakter Listesi,burdan rasgele karakterler seçip rastegele bir yazı oluşturacağız.
    //Tahmin edeceğin gibi aynı karakteri ne kadar çok koyarsan onun çıkma ihtimali o kadar artar.
    private static final char[] karakterler = new char[]{'a','b','c','d','e','f','A','B','C','D','E','F',
        '#','%','@'};
    //Javanın Random classı.Bu class ile rastgele işlemleri yapabilirsin.
    private static Random rnd = new Random();
  
    //Eğer event aktifken oyuncu bu yazıyı tam olarak yazarsa ödülü alır.
    private static String hedef;
  
    private static ItemStack odulYap(){
        //Ilk once basit bir eşya objesi yapıyoruz(tipini belirleyerek).
        ItemStack is = new ItemStack(Material.DIAMOND);
        //Daha sonra ItemStack classının içindeki setAmount() metodu ile miktarını belirliyoruz.
        is.setAmount(2);
        //Daha sonra metodun içinde yapılan bu metodu geri döndürüyoruz.Yani bu metod her kullanıldığı yerde
        //bu eşyayı verecek(2 tane elmas).
        return is;
    }
    //zmn_event değerini bir sonraki 15 dakikaya atıp,başlayan event süresinin değişkenini tanımlıyoruz.
    private static void eventBaslat(){
        //Yeni oluşturulan zaman objeleri her zaman şimdiki zamanı temsil eder.
        //Bu yüzden burda yeni bi zaman oluşturup içine yeni bir zaman daha oluşturup bu içerideki zamanın
        //mili saniyeleri ile bizim dakikada hesapladığımız mili saniyeleri topluyoruz.Böylelikle zmn_event
        //şu anki zamanın 15 dakika ötesine gitmiş oluyor.
        //basladi'yada değer atayarak eventin şimdi olduğunu belli ediyoruz.Basladi'nin bir değeri olduğundan
        //Bizim chat dinleyici artık oyuncu yazılarını kontrol edecek.
        zmn_event = new Date(new Date().getTime()+dakika);
        basladi = new Date();
        //rasgeleYaziOlustur() metodundan yararlanarak hedef yaziyi belirliyoruz.
        hedef = rasgeleYaziOlustur();
        //Bütün değerleri atadığımıza göre artık oyunculara mesajımızı gönderebiliriz.
        Bukkit.broadcastMessage(cev("&5ChatEventi(oto) &e"+hedef+" &6Yazısını yaz !"));
    }
    //Spigotun '&' yazılarını renk koduna çevirmesi için bi metodu var fakat fazla uzun olduğundan
    //Kendi metodumun içine koyarak kısalttım.
    private static String cev(String str){
        return ChatColor.translateAlternateColorCodes('&', str);
    }
  
    //Bu metod uzunluk kadar karakteri rastgele olarak karakterlerden seçip birleştirerek bize bir yazı verecek.
    private static String rasgeleYaziOlustur(){
        String yazi = "";
        //Uzunluk kadar tekrarlama döngüsü
        //Java saymaya 0'dan başlar.
        for(int i= 0;i<uzunluk;i++){
            //Random objesine 0 ile karakterler dizisinin uzunluğu arasında rasgele bi rakam seçmesini söyledik.
            //Bu rakam 0 olursa 'a' harfi gelecek,5 olursa 'f' harfi...
            int rasgele = rnd.nextInt(karakterler.length);
            //yazi'ya karakterlerdeki rasgele'inci elemanı ekledik.
            yazi+= karakterler[rasgele];
          
        }
        //En son oluşturduğumuz yazıyı geri döndürüyoruz.
        return yazi;
      
    }
    //Eklendi aktif olduğunda
    @Override
    public void onEnable() {
      
        //Eklenti yeni aktif edildiği için zmn_eventi 40 saniye sonraya ayarlıyoruz.
        zmn_event = new Date(new Date().getTime()+40*1000);
        //Bu classın bi dinleyici classı olduğunu tanımlıyoruz.
        //Bu class hem ana class hemde dinleyici olduğundan iki parametreyede this yazdık.
        Bukkit.getServer().getPluginManager().registerEvents(this, this);
      
        //Bukkitin Scheduler classını kullanarak Bukkit'e her 3 saniyede bir run() metodunun içindekileri yapmasını
        //söylüyoruz.Scheuler zamanı Tick hesabından aldığından 1 saniye = 20 tick;
        //Ayrıca ilk yazdığım 40 döngünün başlamadan önce başlıyacağı süre.
        //Ikinci 20 ise döngünün run() metodunu
        //çalıştırdıktan sonra bekleme süresi(çalıştır,20 tick bekle,çalıştır...)
        //Ayrıca döngü ID'ını alıyoruz.
        donguID = Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new Runnable() {
          
            @Override
            public void run() {
                //Şu anki zaman Event zamanı mı kontrol ediyoruz.
                //Eğer şu anki zaman event zamanından büyük yada event zamanına eşitse
                if(new Date().getTime() >= zmn_event.getTime()){
                    //Event zamanı gelmiş eventBaslat metodunu kullanalım.
                    //Ama önce online oyuncu sayısı 1'den fazla mı diye kontrol edelim de boş yere
                    //event başlatmayalım.Tek kişiye yada hiç olmayan kişiye event yapmanın mantığı yok.
                    //Bunun için bukkit classından getOnlinePlayer() metodunu kullanarak bir Liste alıyorum
                    //ve Listenin içindeki eleman sayısına bakıyorum
                    if(Bukkit.getOnlinePlayers().size() >=  1){
                        eventBaslat();
                    }

                }
                //Değilse...
                else{
                    //Event zamanı gelmemiş,o zaman basladi'nin bi değeri varsa değersiz yapalım ki
                    //Chat dinleyicimiz çalışmasın.
                    //Ama unutmayın ki şu anda event başlamış(10 saniyelik süre hani) da olabilir.
                    //Bu yüzden basladiya 10 saniye ekleyip şu anki zaman ile karşılaştırıyoruz.
                    //Eğer basladi null(javada değersiz demek) değilse.(!=)
                    if(basladi != null){
                        //Şu anki zaman event için verdiğimiz 10 saniye aralıktan büyükse.
                        //Event süresi dolmuş ve event bitmiş demektir.
                        if(new Date().getTime() >= (basladi.getTime()+event_suresi)){
                            //Basladiyi null(değersiz) yap.
                            basladi = null;
                            //Oyunculara eventinin bittiğini Bukkit classından yararlanarak bildir.
                            //Burda yazdığımız cev() metodundan yararlanarak renkli yazı gönderiyoruz.
                            Bukkit.broadcastMessage(cev("&5ChatEventi(oto) &aEventi kimse tamamlayamadı ! :("));
                        }

                    }
                }
              
            }
        }, 40L, 20L);
      
    }
    //EventHandler yazarak altındaki metodun bir Dinleyici olduğunu Spigota söylüyoruz,ve spigotda ne zaman
    //metodun istediği olay olursa o zaman metodu çalıştırıyor.Biz chat eventini koyduk,her chat olayında bu
    //Metod çalışacak.Tabii sadece EventHandler yazmakla olmuyor,eklenti başlarken bu classın dinleyici
    //olduğunu bildirmemiz de gerekiyor.
    @EventHandler
    public static void dinleyici(AsyncPlayerChatEvent e){
        //Eğer başladı değersiz değilse event başlamış demektir.
        if(basladi != null){
            //Oyuncunun yazdığı mesaj bizim oluşturduğumuza eşitse.
            if(e.getMessage().equals(hedef)){
                //Oyuncunun envanterine ödülü koy.
                e.getPlayer().getInventory().addItem(odul);
                //Kimin kazandığını yazmadan önce kaç saniye kala aldığını hesaplayalım.
                //Double kullandık çünkü 9 saniye olarak değilde 9.1 saniye olarak yazmasını istiyoruz.
                //Double kısaca rasyonel sayıdır.
                //Kalan zaman = (event_suresi-(şuankizaman-basladi))/1000
                double zmn = (double) (event_suresi-(new Date().getTime()-basladi.getTime()));
                //Milisaniyeden saniyeye çeviriyoruz
                zmn = zmn/1000;
                //Fakat rasyonel sayı 9.232390534 gibi uzun bi sayı çıkabileceğinden ilk önce sayıya
                //bir DecimalFormat objesi kullanarak sayıya şekil veriyoruz.
                String zmns = new DecimalFormat("#.##").format(zmn);
                //zmns'deki rasyonel sayı 2.3232323 uzun olsa bile 2.32 olarak görünecek.
                Bukkit.broadcastMessage(cev("&5ChatEventi(oto) &f"+e.getPlayer().getName()+" &a "+zmns+""
                        + " saniye kala eventi kazandı !"));
                //Oyuncuya kazandığını belli etmek için level up sonunu gönderelim
                e.getPlayer().playSound(e.getPlayer().getLocation(), Sound.LEVEL_UP, 1F, 1F);
                //Mesajın gönderilmesinide iptal edelim,isterseniz etmeyebilirsiniz tabii.
                e.setCancelled(true);
                //Başladıyı değersiz yapıp eventi bitiriyoruz,taki zmn_event basladiya tekrar değer verene kadar
                basladi = null;
            }
        }
    }
    @Override
    public void onDisable() {
        //Döngüyü bukkitden siliyoruz.
        Bukkit.getScheduler().cancelTask(donguID);
      
    }
}

plugin.yml
Kod:
name: OtoEvent
author: Zindev
version: 0.1
description: OtoEvent by Zindev
main: Main classının bulunduğu konum.

Değerli ziyaretçimiz, içeriği görebilmek için şimdi giriş yapın veya kayıt olun.
(Ödül 2 elmasa ayarlı,event süresi 10 saniye,20 dakikada bir tekrarlıyor)

Kodu değiştirip kullanmakta özgürsünüz.

Düzenleme:Bu arada kodu kendi üstümde denediğimden event sunucuda en az 2 kişi değil 1 kişi varsa çalışıyor.
 
Son düzenleme:
Süpersin +1
 
Ne diyeceğimi bilemedim
,zamanını ayırıp kodladığın için teşekkür ediyorum .[DOUBLEPOST=1453991855,1453991408][/DOUBLEPOST]Birde Ben direk jarı indirip kurdum , dosyası çıkmadı nasıl editleyebilirim süresini ya :D
 
Ne diyeceğimi bilemedim
,zamanını ayırıp kodladığın için teşekkür ediyorum .[DOUBLEPOST=1453991855,1453991408][/DOUBLEPOST]Birde Ben direk jarı indirip kurdum , dosyası çıkmadı nasıl editleyebilirim süresini ya :D
Eclipse ile ilk spigot eklentini ayarla.Main.class'ın içine yapıştır,değiştir verileri.
Değerli ziyaretçimiz, içeriği görebilmek için şimdi giriş yapın veya kayıt olun.
 
Son düzenleme:
Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...

Hala Discord sunucumuza katılmadın mı?

Büyük bir topluluğun parçası ol, etkinliklere katıl ve özel hediyeler kazanma şansı yakala!

Şimdi Katıl
Üst