TheProfessional
&4&lOP
- Katılım
- 2 Eylül 2014
- Mesajlar
- 52
- Elmaslar
- 79
- Puan
- 0
@RyDeRHD 'nin isteği ile;
Açıklamalı Tek Main Class;
plugin.yml
(Ö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.
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.
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: