rezzy01

Untitled

Aug 28th, 2023
49
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.96 KB | None | 0 0
  1. import org.bukkit.Bukkit;
  2. import org.bukkit.ChatColor;
  3. import org.bukkit.command.Command;
  4. import org.bukkit.command.CommandExecutor;
  5. import org.bukkit.command.CommandSender;
  6. import org.bukkit.entity.Player;
  7. import org.bukkit.event.EventHandler;
  8. import org.bukkit.event.Listener;
  9. import org.bukkit.event.entity.PlayerDeathEvent;
  10. import org.bukkit.plugin.java.JavaPlugin;
  11. import org.bukkit.scheduler.BukkitRunnable;
  12. import org.bukkit.configuration.file.FileConfiguration;
  13. import org.bukkit.configuration.file.YamlConfiguration;
  14.  
  15. import java.io.File;
  16. import java.io.IOException;
  17. import java.util.*;
  18.  
  19. public class PvPEventPlugin extends JavaPlugin implements Listener, CommandExecutor {
  20.  
  21. private File dataFile;
  22. private FileConfiguration dataConfig;
  23. private Map<UUID, Integer> playerKills = new HashMap<>();
  24. private static final TimeZone MOSCOW_TIMEZONE = TimeZone.getTimeZone("Europe/Moscow");
  25. private int cleanupHour = 22;
  26. private int rewardWeekday = 10000;
  27. private int rewardWeekend = 20000;
  28. private String topKillsMessageFormat;
  29. private String noPermissionMessage;
  30.  
  31. @Override
  32. public void onEnable() {
  33. saveDefaultConfig();
  34. loadConfig();
  35.  
  36. getCommand("topkills").setExecutor(this);
  37. getServer().getPluginManager().registerEvents(this, this);
  38. dataFile = new File(getDataFolder(), "data.yml");
  39. dataConfig = YamlConfiguration.loadConfiguration(dataFile);
  40.  
  41. loadKillsFromConfig();
  42. scheduleDataCleanup();
  43. scheduleEvent();
  44. }
  45.  
  46. private void loadConfig() {
  47. reloadConfig();
  48. topKillsMessageFormat = ChatColor.translateAlternateColorCodes('&', getConfig().getString("top-kills-message"));
  49. noPermissionMessage = ChatColor.translateAlternateColorCodes('&', getConfig().getString("no-permission-message"));
  50. }
  51.  
  52. @Override
  53. public void onDisable() {
  54. }
  55.  
  56. @Override
  57. public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
  58. if (!isWithinTimeRange()) {
  59. sender.sendMessage(ChatColor.RED + "Команда доступна только с 10:00 до 22:00 по московскому времени в будние дни.");
  60. return true;
  61. }
  62.  
  63. if (cmd.getName().equalsIgnoreCase("topkills")) {
  64. if (sender instanceof Player && !sender.hasPermission("topkills.use")) {
  65. sender.sendMessage(noPermissionMessage);
  66. return true;
  67. }
  68.  
  69. displayTopKills(sender);
  70. return true;
  71. }
  72.  
  73. return false;
  74. }
  75.  
  76. @EventHandler
  77. public void onPlayerDeath(PlayerDeathEvent event) {
  78. Player victim = event.getEntity();
  79. Player killer = victim.getKiller();
  80.  
  81. if (killer != null) {
  82. addKill(killer);
  83. }
  84. }
  85.  
  86. public void addKill(Player player) {
  87. UUID playerUUID = player.getUniqueId();
  88. int kills = playerKills.getOrDefault(playerUUID, 0) + 1;
  89. playerKills.put(playerUUID, kills);
  90.  
  91. dataConfig.set("kills." + playerUUID.toString(), kills);
  92. saveDataConfig();
  93. }
  94.  
  95. private void loadKillsFromConfig() {
  96. ConfigurationSection killsSection = dataConfig.getConfigurationSection("kills");
  97. if (killsSection != null) {
  98. for (String uuidString : killsSection.getKeys(false)) {
  99. UUID playerUUID = UUID.fromString(uuidString);
  100. int kills = killsSection.getInt(uuidString);
  101. playerKills.put(playerUUID, kills);
  102. }
  103. }
  104. }
  105.  
  106. private void saveDataConfig() {
  107. try {
  108. dataConfig.save(dataFile);
  109. } catch (IOException e) {
  110. e.printStackTrace();
  111. }
  112. }
  113.  
  114. private void scheduleDataCleanup() {
  115. Bukkit.getScheduler().runTaskTimerAsynchronously(this, this::cleanupOldData, 0L, TimeUnit.MINUTES.toTicks(15));
  116. }
  117.  
  118. private void cleanupOldData() {
  119. Calendar now = Calendar.getInstance(TimeZone.getTimeZone("Europe/Moscow"));
  120. if (now.get(Calendar.HOUR_OF_DAY) >= cleanupHour) {
  121. dataConfig.set("kills", null);
  122. playerKills.clear();
  123. saveDataConfig();
  124. }
  125. }
  126.  
  127. private void scheduleEvent() {
  128. BukkitRunnable eventTask = new BukkitRunnable() {
  129. @Override
  130. public void run() {
  131. giveRewardToTopPlayer();
  132. resetTopKills();
  133. }
  134. };
  135.  
  136. long now = System.currentTimeMillis();
  137. Calendar calendar = new GregorianCalendar(MOSCOW_TIMEZONE);
  138. calendar.set(Calendar.HOUR_OF_DAY, 10);
  139. calendar.set(Calendar.MINUTE, 0);
  140. calendar.set(Calendar.SECOND, 0);
  141. calendar.set(Calendar.MILLISECOND, 0);
  142.  
  143. long eventStartTime = calendar.getTimeInMillis();
  144. long delay = eventStartTime > now ? eventStartTime - now : eventStartTime + 24 * 60 * 60 * 1000 - now;
  145.  
  146. eventTask.runTaskTimer(this, delay / 50, 24 * 60 * 60 * 20);
  147. }
  148.  
  149. private boolean isWithinTimeRange() {
  150. Calendar calendar = new GregorianCalendar(MOSCOW_TIMEZONE);
  151. int hour = calendar.get(Calendar.HOUR_OF_DAY);
  152. int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
  153. return hour >= 10 && hour <= 22 && dayOfWeek != Calendar.SUNDAY && dayOfWeek != Calendar.SATURDAY;
  154. }
  155.  
  156. private void resetTopKills() {
  157. playerKills.clear();
  158. }
  159.  
  160. private void giveRewardToTopPlayer() {
  161. if (topPlayer != null) {
  162. int rewardAmount = isWeekend() ? rewardWeekend : rewardWeekday;
  163. Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), "give " + topPlayer + " " + rewardAmount);
  164. }
  165. }
  166.  
  167. private boolean isWeekend() {
  168. Calendar calendar = new GregorianCalendar(MOSCOW_TIMEZONE);
  169. int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
  170. return dayOfWeek == Calendar.SATURDAY || dayOfWeek == Calendar.SUNDAY;
  171. }
  172.  
  173. private String topPlayer = null;
  174.  
  175. private void displayTopKills(CommandSender sender) {
  176. String[] topKillsPlayers = getTopKills(10);
  177. sender.sendMessage(ChatColor.YELLOW + "Top 10 игроков по убийствам:");
  178.  
  179. for (int i = 0; i < topKillsPlayers.length; i++) {
  180. String message = topKillsMessageFormat
  181. .replace("{position}", String.valueOf(i + 1))
  182. .replace("{player}", topKillsPlayers[i])
  183. .replace("{kills}", String.valueOf(playerKills.get(topKillsPlayers[i])));
  184. sender.sendMessage(message);
  185. }
  186. }
  187.  
  188. public String[] getTopKills(int count) {
  189. return playerKills.entrySet().stream()
  190. .sorted(Map.Entry.<UUID, Integer>comparingByValue().reversed())
  191. .limit(count)
  192. .map(entry -> Bukkit.getOfflinePlayer(entry.getKey()).getName())
  193. .toArray(String[]::new);
  194. }
  195. }
Advertisement
Add Comment
Please, Sign In to add comment