Untitled

 avatar
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