Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Помогите Поставить cooldown

Статус
Закрыто для дальнейших ответов.

Slaand

Старожил
Пользователь
Баллы
103
Имя в Minecraft
Slaand
Привет форумчане, нужна небольшая помощь. Ломаю голову, пока не получается ввести cooldown в 20 секунд для использования команды(да я нуп, первая неделя испытаний) :lol:
Собсна вот код, надо чтобы был cooldown для использования команды (rspawn).

JavaScript:
package me.slaand.rspawn;

import java.util.Random;
import org.bukkit.*;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;

public class Main extends JavaPlugin
{

    public Main()
    {
    }

    public void onEnable()
    {
        getLogger().info("RSpawn plugin Enabled.");
    }

    public void onDisable()
    {
        getLogger().info("RSpawn plugin Disabled.");
    }

    public boolean onCommand(CommandSender sender, Command cmd, String label, String args[])
    {
        Player p = (Player)sender;
        if(cmd.getName().equalsIgnoreCase("rspawn") && (sender instanceof Player))
        {
            Player player = (Player)sender;
            Random random = new Random();
            Location teleportLocation = null;
            int x = random.nextInt(6000) + 1;
            int y = 150;
            int z = random.nextInt(6000) + 1;
            for(boolean isOnLand = false; !isOnLand;)
            {
                teleportLocation = new Location(player.getWorld(), x, y, z);
                if(teleportLocation.getBlock().getType() != Material.AIR)
                    isOnLand = true;
                else
                    y--;
            }

            player.teleport(new Location(player.getWorld(), teleportLocation.getX(), teleportLocation.getY() + 1.0D, teleportLocation.getZ()));
            player.sendMessage(ChatColor.GRAY + "Ты был телепортирован на рандомную позицию. Удачи! :)");
        }
        return false;
    }
}
 
Знач смотри. При использовании команды игроком заносишь его в HashMap<Player, Long>
Где player - сам игрок, а long - текущее время в мсек (получаешь с помощью System.currentTimeMillis()).
Далее, перед использованием команды делаешь такую проверку:

if(System.currentTimeMillis() - delay.get(player.getName()) < 20000)

Где delay - имя твоего hashmap'a, 20000 - задержка между использованиями команд в мсек.
Если проверка пройдена, выполняешь команду, И ЗАНОСИШЬ В HASHMAP НОВЫЕ ДАННЫЕ (я в первой строке сообщения написал, как)
Если проверка не пройдена, то пишешь "Ололо, жди 20 сек".
 
p.s. onCommand() должно возвращать true, если возвращает false то вылезет справка по использованию команды.
 
Ладно, спасибо за ответы :good::good:
Подниму тему, чтобы не засирать новыми. В общем решил добавить пермишен, вроде if есть но не тут то было.
На 62 строке пишет: 'else' without 'if'
Не знаю, где я пропустил это, не пойму. поможете? :D

JavaScript:
package me.slaand.rspawn;

import java.util.Random;
import java.util.HashMap;
import org.bukkit.*;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;

public class Main extends JavaPlugin
{

    public HashMap<String, Long> cooldowns = new HashMap<String, Long>();
  
    public void onEnable()
    {
        getLogger().info("Spawn plugin Enabled.");
    }

    public void onDisable()
    {
        getLogger().info("Spawn plugin Disabled.");
    }
  
    public boolean onCommand(CommandSender sender, Command cmd, String label, String args[])
    {
        Player p = (Player)sender;
        int cooldownTime = 20; // Установить количество секунд для команды

        if(cmd.getName().equalsIgnoreCase("rspawn") && (sender instanceof Player))
            if(sender.hasPermission("spawn.random"))
                if(cooldowns.containsKey(sender.getName())) {
                    long secondsLeft = ((cooldowns.get(sender.getName())/1000)+cooldownTime) - (System.currentTimeMillis()/1000);
                    if(secondsLeft>0) {
                        // Ещё идет время
                        sender.sendMessage(ChatColor.RED + "Ты не можешь использовать эту команду ещё "+ secondsLeft +" секунд(-ы) :(");
                        return true;
                    }
                }
                {
                    Player player = (Player)sender;
                    Random random = new Random();
                    Location teleportLocation = null;
                    int x = random.nextInt(6000) + 1;
                    int y = 150;
                    int z = random.nextInt(6000) + 1;
                    for(boolean isOnLand = false; !isOnLand;)
                    {
                        teleportLocation = new Location(player.getWorld(), x, y, z);
                        if(teleportLocation.getBlock().getType() != Material.AIR)
                            isOnLand = true;
                        else
                            y--;
                    }

                    player.teleport(new Location(player.getWorld(), teleportLocation.getX(), teleportLocation.getY() + 1.0D, teleportLocation.getZ()));
                    sender.sendMessage(ChatColor.GRAY + "Вы были телепортированы на рандомную позицию. Удачи! :)");
                    sender.sendMessage(ChatColor.GRAY + "Для повторной телепортации пишите команду /rspawn (если вы в воде).");
                    cooldowns.put(sender.getName(), System.currentTimeMillis());
                } else
            {
                sender.sendMessage(ChatColor.RED + "У тебя нет прав для использования этой команды!");
            }
        return false;
    }
}
 
Вы понимаете предназначение фигурных скобок? А вообще загляните на строку 40.
 
Статус
Закрыто для дальнейших ответов.

Поделиться этой страницей

Назад
Верх