Untitled
unknown
java
a year ago
11 kB
6
Indexable
import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerItemConsumeEvent; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.ChatColor; import java.util.HashMap; import java.util.Map; public class Main extends JavaPlugin implements Listener { private FileConfiguration config; private Map<Player, Long> lastBreakTime; // Czas ostatniego wykopania bloku private Map<Player, Long> breakCooldown; // Czas końca przerwy private Map<Player, Boolean> hasStartedBreak; // Czy rozpoczęto liczenie czasu do przerwy private Map<Player, Boolean> warnedAboutBreak; // Flaga ostrzeżenia o przerwie private long blockBreakInterval; // Czas do przerwy private long breakResetTime; // Czas przerwy private long warningTime; // Czas ostrzeżenia przed przerwą @Override public void onEnable() { saveDefaultConfig(); config = getConfig(); blockBreakInterval = config.getLong("block-break-interval") * 60 * 1000; // w milisekundach breakResetTime = config.getLong("break-reset-time") * 60 * 1000; // w milisekundach warningTime = config.getLong("warning-time") * 60 * 1000; // w milisekundach lastBreakTime = new HashMap<>(); breakCooldown = new HashMap<>(); hasStartedBreak = new HashMap<>(); warnedAboutBreak = new HashMap<>(); getServer().getPluginManager().registerEvents(this, this); getCommand("przerwa").setExecutor((sender, command, label, args) -> { if (sender instanceof Player) { Player player = (Player) sender; long remainingTime = getRemainingBreakTime(player); long currentTime = System.currentTimeMillis(); if (breakCooldown.containsKey(player)) { long cooldownEnd = breakCooldown.get(player); if (currentTime < cooldownEnd) { player.sendMessage(ChatColor.RED + "Jesteś w przerwie! Pozostało " + formatTime(cooldownEnd - currentTime) + " do jej zakończenia."); } else { player.sendMessage(ChatColor.GREEN + "Przerwa zakończona. Możesz teraz kopać bloki."); breakCooldown.remove(player); // Usuń z mapy po zakończeniu przerwy hasStartedBreak.put(player, false); // Ustaw flagę na false warnedAboutBreak.put(player, false); // Resetuj flagę ostrzeżenia lastBreakTime.remove(player); // Resetuj czas ostatniego wykopania } } else if (lastBreakTime.containsKey(player)) { long timeSinceLastBreak = currentTime - lastBreakTime.get(player); if (timeSinceLastBreak < blockBreakInterval) { player.sendMessage(ChatColor.GREEN + "Czas do przerwy: " + formatTime(blockBreakInterval - timeSinceLastBreak)); } else { player.sendMessage(ChatColor.GREEN + "Czas do przerwy już minął."); } } else { player.sendMessage(ChatColor.RED + "Nie rozpocząłeś jeszcze liczenia czasu do przerwy."); } } else { sender.sendMessage(ChatColor.RED + "Ta komenda jest dostępna tylko dla graczy."); } return true; }); // Monitorowanie graczy i wysyłanie ostrzeżeń o przerwie new BukkitRunnable() { @Override public void run() { long currentTime = System.currentTimeMillis(); for (Player player : Bukkit.getOnlinePlayers()) { if (lastBreakTime.containsKey(player) && !breakCooldown.containsKey(player)) { long timeSinceLastBreak = currentTime - lastBreakTime.get(player); if (timeSinceLastBreak >= blockBreakInterval - warningTime && timeSinceLastBreak < blockBreakInterval) { if (!warnedAboutBreak.getOrDefault(player, false)) { long timeLeft = blockBreakInterval - timeSinceLastBreak; player.sendMessage(ChatColor.RED + "Uwaga! Kopiesz już od dłuższego czasu. Za " + formatTime(timeLeft) + " będziesz musiał odpocząć."); warnedAboutBreak.put(player, true); // Ustaw flagę, że ostrzeżenie zostało wysłane } } if (timeSinceLastBreak >= blockBreakInterval) { // Rozpocznij przerwę, jeśli gracz nie jest jeszcze w przerwie if (!breakCooldown.containsKey(player)) { breakCooldown.put(player, currentTime + breakResetTime); hasStartedBreak.put(player, true); // Ustaw flagę, że przerwa się rozpoczęła warnedAboutBreak.put(player, false); // Resetuj flagę ostrzeżenia player.sendMessage(ChatColor.RED + "Przerwa! Musisz odczekać " + formatTime(breakResetTime) + " przed ponownym kopaniem."); } } } } } }.runTaskTimer(this, 0L, 20L * 5); // co 5 sekund } @EventHandler public void onBlockBreak(BlockBreakEvent event) { Player player = event.getPlayer(); Material blockType = event.getBlock().getType(); long currentTime = System.currentTimeMillis(); // Jeśli gracz jest w przerwie, zablokuj kopanie i zresetuj timer if (breakCooldown.containsKey(player)) { long cooldownEnd = breakCooldown.get(player); if (currentTime < cooldownEnd) { event.setCancelled(true); player.sendMessage(ChatColor.RED + "Jesteś w przerwie! Musisz odczekać przed ponownym kopaniem."); // Resetuj czas przerwy na nowo, jeśli gracz spróbuje wykopać blok podczas przerwy breakCooldown.put(player, currentTime + breakResetTime); player.sendMessage(ChatColor.RED + "Czas przerwy został przedłużony. Musisz odczekać dodatkowe " + formatTime(breakResetTime) + " przed ponownym kopaniem."); return; } } // Jeśli blok jest typu naturalnie wykopującego się kilofem if (isBreakableByPickaxe(blockType)) { // Jeśli czas ostatniego wykopania bloku nie jest zapisany, oznacza to rozpoczęcie liczenia if (!lastBreakTime.containsKey(player)) { lastBreakTime.put(player, currentTime); hasStartedBreak.put(player, true); // Ustaw flagę, że rozpoczęto liczenie czasu do przerwy warnedAboutBreak.put(player, false); // Resetuj flagę ostrzeżenia player.sendMessage(ChatColor.GREEN + "Rozpoczęto liczenie czasu do przerwy."); } else { // Resetowanie czasu przerwy tylko, gdy gracz nie jest w przerwie if (!hasStartedBreak.getOrDefault(player, false)) { lastBreakTime.put(player, currentTime); } } } } @EventHandler public void onPlayerInteract(PlayerInteractEvent event) { Player player = event.getPlayer(); Material blockType = event.getClickedBlock() != null ? event.getClickedBlock().getType() : null; // Jeśli blok jest naturalnie kopalny kilofem i gracz jest w przerwie if (blockType != null && isBreakableByPickaxe(blockType)) { if (breakCooldown.containsKey(player)) { long currentTime = System.currentTimeMillis(); long cooldownEnd = breakCooldown.get(player); if (currentTime < cooldownEnd) { event.setCancelled(true); player.sendMessage(ChatColor.RED + "Jesteś w przerwie! Musisz odczekać przed ponownym kopaniem."); } } } } @EventHandler public void onPlayerEat(PlayerItemConsumeEvent event) { Player player = event.getPlayer(); long currentTime = System.currentTimeMillis(); // Jeśli gracz jest w przerwie, przedłuż przerwę if (breakCooldown.containsKey(player)) { long cooldownEnd = breakCooldown.get(player); if (currentTime < cooldownEnd) { breakCooldown.put(player, cooldownEnd + breakResetTime); player.sendMessage(ChatColor.GREEN + "Odczekałeś przerwę. Musisz teraz poczekać " + formatTime(breakResetTime) + " przed ponownym kopaniem."); } } } private boolean isBreakableByPickaxe(Material material) { // Bloki, które naturalnie wykopuje się kilofem switch (material) { case STONE: case IRON_ORE: case GOLD_ORE: case DIAMOND_ORE: case EMERALD_ORE: case REDSTONE_ORE: case LAPIS_ORE: case DEEPSLATE: case DEEPSLATE_COAL_ORE: case DEEPSLATE_IRON_ORE: case DEEPSLATE_GOLD_ORE: case DEEPSLATE_DIAMOND_ORE: case DEEPSLATE_EMERALD_ORE: case DEEPSLATE_REDSTONE_ORE: case DEEPSLATE_LAPIS_ORE: case OBSIDIAN: return true; default: return false; } } private String formatTime(long millis) { long seconds = millis / 1000; long minutes = seconds / 60; long hours = minutes / 60; seconds %= 60; minutes %= 60; return String.format("%02d:%02d:%02d", hours, minutes, seconds); } private long getRemainingBreakTime(Player player) { if (breakCooldown.containsKey(player)) { long currentTime = System.currentTimeMillis(); long timeLeft = breakCooldown.get(player) - currentTime; return timeLeft > 0 ? timeLeft : 0; } return 0; } }
Editor is loading...
Leave a Comment