// plugin.yml içeriğini bu eklentiyi derlemeden önce aynı dizinde oluşturmalısınız.
/*
name: RankPlugin
version: 1.0
main: me.oyun.rank.RankPlugin
api-version: 1.21
authors: [Nefarriouss]
description: Oyuncular için özel rütbe sistemi.
commands:
rankup:
description: Rütbe atlama komutu.
usage: /<command>
*/
package me.oyun.rank;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.attribute.Attribute;
import org.bukkit.attribute.AttributeInstance;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.enchantment.EnchantItemEvent;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.inventory.CraftItemEvent;
import org.bukkit.event.inventory.PrepareAnvilEvent;
import org.bukkit.event.player.*;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scheduler.BukkitTask;
import java.io.File;
import java.io.IOException;
import java.util.*;
public class RankPlugin extends JavaPlugin implements Listener {
private File playerDataFile;
private FileConfiguration playerDataConfig;
private final Map<UUID, Long> playtime = new HashMap<>();
private final Map<UUID, BukkitTask> playtimeTasks = new HashMap<>();
private final Map<UUID, Long> swordAbilityCooldown = new HashMap<>();
private final Map<UUID, Long> rocketCooldown = new HashMap<>();
private final Map<UUID, Integer> extraHearts = new HashMap<>();
private final Map<UUID, PotionEffect> axeHasteEffect = new HashMap<>();
// Rank definitions
public enum PlayerRank {
YABANCI, UYKUYUCU, YERLI, TUCCAR, KOMUTAN, KORKUNC, EMEKTAR, EFENDI
}
@Override
public void onEnable() {
// Register events and command
getServer().getPluginManager().registerEvents(this, this);
getCommand("rankup").setExecutor(this);
// Setup player data file
playerDataFile = new File(getDataFolder(), "players.yml");
if (!playerDataFile.exists()) {
playerDataFile.getParentFile().mkdirs();
saveResource("players.yml", false);
}
playerDataConfig = YamlConfiguration.loadConfiguration(playerDataFile);
// Load existing players from config
for (String key : playerDataConfig.getKeys(false)) {
try {
UUID uuid = UUID.fromString(key);
long savedPlaytime = playerDataConfig.getLong(key + ".playtime");
Player player = Bukkit.getPlayer(uuid);
if (player != null) {
// Load player data if they are online
playtime.put(uuid, savedPlaytime);
startPlaytimeTask(uuid);
applyRankPermissions(player, PlayerRank.valueOf(playerDataConfig.getString(key + ".rank")));
}
} catch (IllegalArgumentException e) {
getLogger().warning("Invalid UUID found in players.yml: " + key);
}
}
}
@Override
public void onDisable() {
// Save all player data before disabling
for (UUID uuid : playtime.keySet()) {
playerDataConfig.set(uuid.toString() + ".playtime", playtime.get(uuid));
Player player = Bukkit.getPlayer(uuid);
if (player != null) {
playerDataConfig.set(uuid.toString() + ".rank", getPlayerRank(player.getUniqueId()).toString());
}
}
try {
playerDataConfig.save(playerDataFile);
} catch (IOException e) {
getLogger().severe("Could not save player data!");
}
// Cancel all playtime tasks
for(BukkitTask task : playtimeTasks.values()){
task.cancel();
}
playtimeTasks.clear();
// Remove effects and extra hearts
for(Player player : Bukkit.getOnlinePlayers()){
AttributeInstance maxHealthAttribute = player.getAttribute(Attribute.GENERIC_MAX_HEALTH);
if (maxHealthAttribute != null) {
maxHealthAttribute.setBaseValue(20.0);
}
player.removePotionEffect(PotionEffectType.HASTE);
}
}
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) {
Player player = event.getPlayer();
UUID uuid = player.getUniqueId();
// Load rank and playtime
if (!playerDataConfig.contains(uuid.toString())) {
playerDataConfig.set(uuid.toString() + ".rank", PlayerRank.YABANCI.toString());
playerDataConfig.set(uuid.toString() + ".playtime", 0L);
try {
playerDataConfig.save(playerDataFile);
} catch (IOException e) {
getLogger().severe("Could not save new player data!");
}
}
long savedPlaytime = playerDataConfig.getLong(uuid.toString() + ".playtime", 0L);
playtime.put(uuid, savedPlaytime);
startPlaytimeTask(uuid);
PlayerRank rank = PlayerRank.valueOf(playerDataConfig.getString(uuid.toString() + ".rank", PlayerRank.YABANCI.toString()));
applyRankPermissions(player, rank);
}
@EventHandler
public void onPlayerQuit(PlayerQuitEvent event) {
Player player = event.getPlayer();
UUID uuid = player.getUniqueId();
// Save rank and playtime
if (playtimeTasks.containsKey(uuid)) {
playtimeTasks.get(uuid).cancel();
playtimeTasks.remove(uuid);
}
playerDataConfig.set(uuid.toString() + ".playtime", playtime.get(uuid));
playerDataConfig.set(uuid.toString() + ".rank", getPlayerRank(uuid).toString());
try {
playerDataConfig.save(playerDataFile);
} catch (IOException e) {
getLogger().severe("Could not save player data!");
}
// Cleanup effects
AttributeInstance maxHealthAttribute = player.getAttribute(Attribute.GENERIC_MAX_HEALTH);
if (maxHealthAttribute != null) {
maxHealthAttribute.setBaseValue(20.0);
}
player.removePotionEffect(PotionEffectType.HASTE);
}
// --- Rank Up Command ---
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (!(sender instanceof Player)) {
sender.sendMessage("Bu komut sadece oyuncular tarafından kullanılabilir.");
return true;
}
Player player = (Player) sender;
UUID uuid = player.getUniqueId();
PlayerRank currentRank = getPlayerRank(uuid);
// Get requirements for the next rank
long requiredPlaytime = 0;
Map<Material, Integer> requiredItems = new HashMap<>();
PlayerRank nextRank = null;
String nextRankName = "";
switch (currentRank) {
case YABANCI:
nextRank = PlayerRank.UYKUYUCU;
nextRankName = "Uykucu";
requiredPlaytime = 4 * 60 * 60 * 1000L; // 4 hours in milliseconds
requiredItems.put(Material.LEATHER, 32);
requiredItems.put(Material.DIAMOND, 16);
requiredItems.put(Material.EMERALD, 16);
break;
case UYKUYUCU:
nextRank = PlayerRank.YERLI;
nextRankName = "Yerli";
requiredPlaytime = 6 * 60 * 60 * 1000L; // 6 hours
requiredItems.put(Material.LEATHER, 128);
requiredItems.put(Material.DIAMOND, 32);
requiredItems.put(Material.GOLD_INGOT, 64);
break;
case YERLI:
nextRank = PlayerRank.TUCCAR;
nextRankName = "Tüccar";
requiredPlaytime = 8 * 60 * 60 * 1000L; // 8 hours
requiredItems.put(Material.WHITE_WOOL, 128);
requiredItems.put(Material.DIAMOND, 128);
break;
// The other ranks (Tüccar, Komutan, Korkunç, Emektar) don't have explicit rank-up requirements in the prompt, so they are assumed to be promoted via other means (e.g., admin command) or are the final ranks.
// For simplicity, I'll stop the rankup command here.
default:
player.sendMessage("§e[Rank]§f En yüksek rütbeye ulaştınız veya bu rütbe için komutla atlama mevcut değil.");
return true;
}
// Check requirements
long currentPlaytime = playtime.getOrDefault(uuid, 0L);
if (currentPlaytime < requiredPlaytime) {
player.sendMessage("§e[Rank]§f Rütbe atlamak için yeterli oynama süreniz yok. Gerekli: " + formatPlaytime(requiredPlaytime) + ", Mevcut: " + formatPlaytime(currentPlaytime));
return true;
}
for (Map.Entry<Material, Integer> entry : requiredItems.entrySet()) {
if (!player.getInventory().contains(entry.getKey(), entry.getValue())) {
player.sendMessage("§e[Rank]§f Rütbe atlamak için yeterli eşyanız yok. " + entry.getValue() + " adet " + entry.getKey().toString().toLowerCase().replace('_', ' ') + " gerekiyor.");
return true;
}
}
// Promote the player
for (Map.Entry<Material, Integer> entry : requiredItems.entrySet()) {
player.getInventory().removeItem(new ItemStack(entry.getKey(), entry.getValue()));
}
setPlayerRank(uuid, nextRank);
player.sendMessage("§e[Rank]§f Tebrikler! Artık " + nextRankName + " rütbesindesiniz!");
return true;
}
// --- Event Handlers for Rank Restrictions and Abilities ---
@EventHandler
public void onCraftItem(CraftItemEvent event) {
Player player = (Player) event.getWhoClicked();
PlayerRank rank = getPlayerRank(player.getUniqueId());
if (rank.ordinal() <= PlayerRank.UYKUYUCU.ordinal()) {
Material result = event.getRecipe().getResult().getType();
if (isHigherThanIron(result)) {
player.sendMessage("§e[Rank]§c Bu rütbede demir seviyesi üstü eşyaları üretemezsin.");
event.setCancelled(true);
}
}
if (rank.ordinal() < PlayerRank.TUCCAR.ordinal()) {
Material result = event.getRecipe().getResult().getType();
if (isDiamondOrNetherite(result)) {
player.sendMessage("§e[Rank]§c Bu rütbede elmas veya netherite eşyaları üretemezsin.");
event.setCancelled(true);
}
}
if (rank.ordinal() < PlayerRank.KOMUTAN.ordinal()) {
Material result = event.getRecipe().getResult().getType();
if (isNetherite(result)) {
player.sendMessage("§e[Rank]§c Bu rütbede netherite eşyaları üretemezsin.");
event.setCancelled(true);
}
}
}
@EventHandler
public void onPlayerInteract(PlayerInteractEvent event) {
Player player = event.getPlayer();
PlayerRank rank = getPlayerRank(player.getUniqueId());
// Right-click check for equipping elytra
if ((event.getAction() == org.bukkit.event.block.Action.RIGHT_CLICK_AIR || event.getAction() == org.bukkit.event.block.Action.RIGHT_CLICK_BLOCK) && player.getInventory().getItemInMainHand().getType() == Material.ELYTRA && rank.ordinal() < PlayerRank.KORKUNC.ordinal()) {
player.sendMessage("§e[Rank]§c Bu rütbede elitra kullanamazsın!");
event.setCancelled(true);
return;
}
// Korkunç rank sword ability
if ((event.getAction() == org.bukkit.event.block.Action.RIGHT_CLICK_AIR || event.getAction() == org.bukkit.event.block.Action.RIGHT_CLICK_BLOCK) && player.getInventory().getItemInMainHand().getType().toString().endsWith("SWORD") && rank == PlayerRank.KORKUNC) {
long lastUse = swordAbilityCooldown.getOrDefault(player.getUniqueId(), 0L);
if (System.currentTimeMillis() - lastUse < 120000) { // 120s cooldown
long remaining = (120000 - (System.currentTimeMillis() - lastUse)) / 1000;
player.sendMessage("§e[Rank]§c Kılıç yeteneğinizin bekleme süresi: " + remaining + " saniye.");
return;
}
player.addPotionEffect(new PotionEffect(PotionEffectType.STRENGTH, 200, 4)); // 10s, Strength 5
player.sendMessage("§e[Rank]§a Kılıç yeteneğinizi kullandınız! 10 saniye boyunca Kuvvet 5 etkisi kazandınız.");
swordAbilityCooldown.put(player.getUniqueId(), System.currentTimeMillis());
}
}
@EventHandler
public void onPlayerMove(PlayerMoveEvent event) {
Player player = event.getPlayer();
PlayerRank rank = getPlayerRank(player.getUniqueId());
if (player.isGliding() && rank.ordinal() < PlayerRank.KORKUNC.ordinal()) {
player.sendMessage("§e[Rank]§c Bu rütbede elitra kullanamazsın!");
player.setGliding(false);
event.setCancelled(true);
}
}
@EventHandler
public void onPrepareAnvil(PrepareAnvilEvent event) {
Player player = (Player) event.getViewers().get(0);
PlayerRank rank = getPlayerRank(player.getUniqueId());
if (rank.ordinal() < PlayerRank.YERLI.ordinal()) {
player.sendMessage("§e[Rank]§c Bu rütbede örs kullanamazsın.");
event.setResult(null);
}
}
@EventHandler
public void onEnchantItem(EnchantItemEvent event) {
Player player = event.getEnchanter();
PlayerRank rank = getPlayerRank(player.getUniqueId());
if (rank.ordinal() < PlayerRank.TUCCAR.ordinal()) {
player.sendMessage("§e[Rank]§c Bu rütbede büyü masası kullanamazsın.");
event.setCancelled(true);
return;
}
// Fortune 3 check
if (event.getEnchantsToAdd().containsKey(Enchantment.FORTUNE) && event.getEnchantsToAdd().get(Enchantment.FORTUNE) >= 3) {
if (rank.ordinal() <= PlayerRank.TUCCAR.ordinal()) {
player.sendMessage("§e[Rank]§c Bu rütbede Servet 3 büyüsü yasaktır.");
event.setCancelled(true);
}
}
}
@EventHandler
public void onPlayerItemDamage(PlayerItemDamageEvent event) {
Player player = event.getPlayer();
PlayerRank rank = getPlayerRank(player.getUniqueId());
if (rank.ordinal() <= PlayerRank.YERLI.ordinal()) {
if (isHigherThanIron(event.getItem().getType())) {
player.sendMessage("§e[Rank]§c Bu rütbede demir üstü eşya kullanamazsın.");
event.setCancelled(true);
}
}
if (rank.ordinal() < PlayerRank.KOMUTAN.ordinal() && isNetherite(event.getItem().getType())) {
player.sendMessage("§e[Rank]§c Bu rütbede netherite eşya kullanamazsın.");
event.setCancelled(true);
}
}
// Elitra Rocket Cooldown
@EventHandler
public void onPlayerToggleSneak(PlayerToggleSneakEvent event) {
Player player = event.getPlayer();
PlayerRank rank = getPlayerRank(player.getUniqueId());
if (player.isGliding() && player.isSneaking() && player.getInventory().getItemInMainHand().getType() == Material.FIREWORK_ROCKET) {
long cooldownTime = 0;
if (rank == PlayerRank.KORKUNC) cooldownTime = 5000;
else if (rank == PlayerRank.EMEKTAR) cooldownTime = 2000;
if (cooldownTime > 0) {
long lastUse = rocketCooldown.getOrDefault(player.getUniqueId(), 0L);
if (System.currentTimeMillis() - lastUse < cooldownTime) {
long remaining = (cooldownTime - (System.currentTimeMillis() - lastUse)) / 1000;
player.sendMessage("§e[Rank]§c Roket yeteneğinizin bekleme süresi: " + remaining + " saniye.");
event.setCancelled(true);
} else {
rocketCooldown.put(player.getUniqueId(), System.currentTimeMillis());
}
}
}
}
// Emektar rank axe ability
@EventHandler
public void onPlayerItemHeld(PlayerItemHeldEvent event) {
Player player = event.getPlayer();
PlayerRank rank = getPlayerRank(player.getUniqueId());
if (rank == PlayerRank.EMEKTAR) {
ItemStack heldItem = player.getInventory().getItem(event.getNewSlot());
if (heldItem != null && heldItem.getType().toString().endsWith("_AXE")) {
player.addPotionEffect(new PotionEffect(PotionEffectType.HASTE, 100, 2)); // 5s, Haste 3
}
} else {
// Remove the haste effect if the rank changes or if they unequip the axe
player.removePotionEffect(PotionEffectType.HASTE);
}
}
// Efendi rank abilities
@EventHandler
public void onEntityDamageByEntity(EntityDamageByEntityEvent event) {
if (event.getDamager() instanceof Player && event.getEntity() instanceof Player) {
Player damager = (Player) event.getDamager();
PlayerRank rank = getPlayerRank(damager.getUniqueId());
if (rank == PlayerRank.EFENDI && damager.getInventory().getItemInMainHand().getType() == Material.TRIDENT) {
Player victim = (Player) event.getEntity();
// Give bleed effect (wither effect) and true damage
victim.addPotionEffect(new PotionEffect(PotionEffectType.WITHER, 100, 2)); // 5 seconds of Wither 3
event.setDamage(event.getDamage() + 5.0); // Add 5.0 true damage
damager.sendMessage("§e[Rank]§a Mızrak yeteneğinizi kullandınız!");
}
}
}
// --- Utility Methods ---
private void startPlaytimeTask(UUID uuid) {
if (!playtimeTasks.containsKey(uuid)) {
BukkitTask task = new BukkitRunnable() {
@Override
public void run() {
playtime.put(uuid, playtime.getOrDefault(uuid, 0L) + 1000); // Add 1 second
}
}.runTaskTimerAsynchronously(this, 20L, 20L); // Every 1 second
playtimeTasks.put(uuid, task);
}
}
private PlayerRank getPlayerRank(UUID uuid) {
String rankStr = playerDataConfig.getString(uuid.toString() + ".rank", PlayerRank.YABANCI.toString());
return PlayerRank.valueOf(rankStr);
}
private void setPlayerRank(UUID uuid, PlayerRank rank) {
playerDataConfig.set(uuid.toString() + ".rank", rank.toString());
try {
playerDataConfig.save(playerDataFile);
} catch (IOException e) {
getLogger().severe("Could not save player rank!");
}
Player player = Bukkit.getPlayer(uuid);
if (player != null) {
applyRankPermissions(player, rank);
}
}
private void applyRankPermissions(Player player, PlayerRank rank) {
// Reset permissions and effects first
AttributeInstance maxHealthAttribute = player.getAttribute(Attribute.GENERIC_MAX_HEALTH);
if (maxHealthAttribute != null) {
maxHealthAttribute.setBaseValue(20.0);
}
player.removePotionEffect(PotionEffectType.HASTE);
// Apply new permissions/abilities based on rank
switch (rank) {
case EFENDI:
if (maxHealthAttribute != null) {
maxHealthAttribute.setBaseValue(maxHealthAttribute.getBaseValue() + 16.0);
if (player.getHealth() > maxHealthAttribute.getBaseValue()) {
player.setHealth(maxHealthAttribute.getBaseValue());
}
}
break;
default:
// No special permissions to apply on join for lower ranks
break;
}
}
private boolean isHigherThanIron(Material material) {
String name = material.toString();
return name.contains("DIAMOND_") || name.contains("NETHERITE_") || name.contains("GOLD_");
}
private boolean isDiamondOrNetherite(Material material) {
String name = material.toString();
return name.contains("DIAMOND_") || name.contains("NETHERITE_");
}
private boolean isNetherite(Material material) {
return material.toString().contains("NETHERITE_");
}
private String formatPlaytime(long milliseconds) {
long seconds = milliseconds / 1000;
long minutes = seconds / 60;
long hours = minutes / 60;
return String.format("%d saat, %d dakika, %d saniye", hours, minutes % 60, seconds % 60);
}
}
Kod burda dostum