Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import org.bukkit.Bukkit;
- import org.bukkit.ChatColor;
- import org.bukkit.command.Command;
- import org.bukkit.command.CommandExecutor;
- import org.bukkit.command.CommandSender;
- import org.bukkit.entity.Player;
- import org.bukkit.event.EventHandler;
- import org.bukkit.event.Listener;
- import org.bukkit.event.entity.PlayerDeathEvent;
- import org.bukkit.plugin.java.JavaPlugin;
- import org.bukkit.scheduler.BukkitRunnable;
- import org.bukkit.configuration.file.FileConfiguration;
- import org.bukkit.configuration.file.YamlConfiguration;
- import java.io.File;
- import java.io.IOException;
- import java.util.*;
- public class PvPEventPlugin extends JavaPlugin implements Listener, CommandExecutor {
- private File dataFile;
- private FileConfiguration dataConfig;
- private Map<UUID, Integer> playerKills = new HashMap<>();
- private static final TimeZone MOSCOW_TIMEZONE = TimeZone.getTimeZone("Europe/Moscow");
- private int cleanupHour = 22;
- private int rewardWeekday = 10000;
- private int rewardWeekend = 20000;
- private String topKillsMessageFormat;
- private String noPermissionMessage;
- @Override
- public void onEnable() {
- saveDefaultConfig();
- loadConfig();
- getCommand("topkills").setExecutor(this);
- getServer().getPluginManager().registerEvents(this, this);
- dataFile = new File(getDataFolder(), "data.yml");
- dataConfig = YamlConfiguration.loadConfiguration(dataFile);
- loadKillsFromConfig();
- scheduleDataCleanup();
- scheduleEvent();
- }
- private void loadConfig() {
- reloadConfig();
- topKillsMessageFormat = ChatColor.translateAlternateColorCodes('&', getConfig().getString("top-kills-message"));
- noPermissionMessage = ChatColor.translateAlternateColorCodes('&', getConfig().getString("no-permission-message"));
- }
- @Override
- public void onDisable() {
- }
- @Override
- public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
- if (!isWithinTimeRange()) {
- sender.sendMessage(ChatColor.RED + "Команда доступна только с 10:00 до 22:00 по московскому времени в будние дни.");
- return true;
- }
- if (cmd.getName().equalsIgnoreCase("topkills")) {
- if (sender instanceof Player && !sender.hasPermission("topkills.use")) {
- sender.sendMessage(noPermissionMessage);
- return true;
- }
- displayTopKills(sender);
- return true;
- }
- return false;
- }
- @EventHandler
- public void onPlayerDeath(PlayerDeathEvent event) {
- Player victim = event.getEntity();
- Player killer = victim.getKiller();
- if (killer != null) {
- addKill(killer);
- }
- }
- public void addKill(Player player) {
- UUID playerUUID = player.getUniqueId();
- int kills = playerKills.getOrDefault(playerUUID, 0) + 1;
- playerKills.put(playerUUID, kills);
- dataConfig.set("kills." + playerUUID.toString(), kills);
- saveDataConfig();
- }
- private void loadKillsFromConfig() {
- ConfigurationSection killsSection = dataConfig.getConfigurationSection("kills");
- if (killsSection != null) {
- for (String uuidString : killsSection.getKeys(false)) {
- UUID playerUUID = UUID.fromString(uuidString);
- int kills = killsSection.getInt(uuidString);
- playerKills.put(playerUUID, kills);
- }
- }
- }
- private void saveDataConfig() {
- try {
- dataConfig.save(dataFile);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- private void scheduleDataCleanup() {
- Bukkit.getScheduler().runTaskTimerAsynchronously(this, this::cleanupOldData, 0L, TimeUnit.MINUTES.toTicks(15));
- }
- private void cleanupOldData() {
- Calendar now = Calendar.getInstance(TimeZone.getTimeZone("Europe/Moscow"));
- if (now.get(Calendar.HOUR_OF_DAY) >= cleanupHour) {
- dataConfig.set("kills", null);
- playerKills.clear();
- saveDataConfig();
- }
- }
- private void scheduleEvent() {
- BukkitRunnable eventTask = new BukkitRunnable() {
- @Override
- public void run() {
- giveRewardToTopPlayer();
- resetTopKills();
- }
- };
- long now = System.currentTimeMillis();
- Calendar calendar = new GregorianCalendar(MOSCOW_TIMEZONE);
- calendar.set(Calendar.HOUR_OF_DAY, 10);
- calendar.set(Calendar.MINUTE, 0);
- calendar.set(Calendar.SECOND, 0);
- calendar.set(Calendar.MILLISECOND, 0);
- long eventStartTime = calendar.getTimeInMillis();
- long delay = eventStartTime > now ? eventStartTime - now : eventStartTime + 24 * 60 * 60 * 1000 - now;
- eventTask.runTaskTimer(this, delay / 50, 24 * 60 * 60 * 20);
- }
- private boolean isWithinTimeRange() {
- Calendar calendar = new GregorianCalendar(MOSCOW_TIMEZONE);
- int hour = calendar.get(Calendar.HOUR_OF_DAY);
- int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
- return hour >= 10 && hour <= 22 && dayOfWeek != Calendar.SUNDAY && dayOfWeek != Calendar.SATURDAY;
- }
- private void resetTopKills() {
- playerKills.clear();
- }
- private void giveRewardToTopPlayer() {
- if (topPlayer != null) {
- int rewardAmount = isWeekend() ? rewardWeekend : rewardWeekday;
- Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), "give " + topPlayer + " " + rewardAmount);
- }
- }
- private boolean isWeekend() {
- Calendar calendar = new GregorianCalendar(MOSCOW_TIMEZONE);
- int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
- return dayOfWeek == Calendar.SATURDAY || dayOfWeek == Calendar.SUNDAY;
- }
- private String topPlayer = null;
- private void displayTopKills(CommandSender sender) {
- String[] topKillsPlayers = getTopKills(10);
- sender.sendMessage(ChatColor.YELLOW + "Top 10 игроков по убийствам:");
- for (int i = 0; i < topKillsPlayers.length; i++) {
- String message = topKillsMessageFormat
- .replace("{position}", String.valueOf(i + 1))
- .replace("{player}", topKillsPlayers[i])
- .replace("{kills}", String.valueOf(playerKills.get(topKillsPlayers[i])));
- sender.sendMessage(message);
- }
- }
- public String[] getTopKills(int count) {
- return playerKills.entrySet().stream()
- .sorted(Map.Entry.<UUID, Integer>comparingByValue().reversed())
- .limit(count)
- .map(entry -> Bukkit.getOfflinePlayer(entry.getKey()).getName())
- .toArray(String[]::new);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment