Помогите (Решено) Сообщения повторяются

ermaksochi

Активный участник
Пользователь
Баллы
66
Имя в Minecraft
Serega007
Здравствуйте, пишу свой плагин под ивенты (мини-игры) конкретно под Spleef, и проблема такая что почему-то сообщения повторяются именно там где я использовал таймер BukkitScheduler. Причём если на сервере будет 2 игрока, оно будет повторяться по 2 раза, если 10 игроков будет, оно повториться по 10 раз а мне надо что б по одному сообщению писало.
Собсна исходники
Код:
name: Events
version: 1.0
description: Данный плагин реализует всю техническую часть ивентов (мини-игр)
main: klaster.main.Events
author: Serega007
commands:
  event:
    permission: events.event
    permission-message: Ю дон'т хев пермисион
    description: Основная команда плагина Events
    usage: /event <broadcast|start|stop> <название ивента>
Код:
package klaster.main;
import org.bukkit.plugin.java.JavaPlugin;
public class Events extends JavaPlugin {
 
    public void onEnable() {
        getCommand("event").setExecutor(new Commandevent(this));
    }
}
Код:
package klaster.main;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.*********ventory.ItemStack;
import org.*********ventory.meta.ItemMeta;
import org.bukkit.scheduler.BukkitScheduler;
public class Commandevent implements CommandExecutor {
    private Events plugin;
    public Commandevent(Events plugin) {
        this.plugin = plugin;
    }
    @SuppressWarnings("deprecation")
    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        if(args.length == 0) {
            return false;
        }
        else if(args[0].equals("start")) {
            if(args.length == 1) {
            sender.sendMessage("Укажите название ивента (Spleef)");
            return true;
            }
            if(args[0].equals("start") && args[1].equals("Spleef")) {
            //broadcast о ивенте
            Bukkit.broadcastMessage(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "[" + ChatColor.DARK_PURPLE + ChatColor.BOLD.toString() + "Spleef" + ChatColor.DARK_RED + ChatColor.BOLD.toString() + "] " + ChatColor.DARK_AQUA + ChatColor.BOLD.toString() + "Ивент " + ChatColor.GOLD + ChatColor.BOLD.toString() + "Spleef "+ ChatColor.DARK_AQUA + ChatColor.BOLD.toString() + "начался!");
            //Телепортация всех игроков на арену
            World world = Bukkit.getWorld("world");;
            Location e = new Location(world, -5, 81, -128);
            for(Player p : Bukkit.getOnlinePlayers()){
            p.teleport(e);
            //Выдача лопаты
            ItemStack items = new ItemStack(Material.DIAMOND_SPADE);
            items.addEnchantment(Enchantment.DURABILITY, 3);
            items.addEnchantment(Enchantment.DIG_SPEED, 5);
            List<String> lores = new ArrayList<String>();
            lores.add("§3Копает быстро");
            String myDisplayName = "§3§lЛопата §5§lСплифера";
            ItemMeta im = items.getItemMeta();
            im.setDisplayName(myDisplayName);
            im.setLore(lores);
            items.setItemMeta(im);
            p.getInventory().addItem(items);
            //Собсна отсчёт до начала ивента (всего 16 секунд)
            BukkitScheduler time15 = Bukkit.getServer().getScheduler();
            time15.scheduleSyncDelayedTask (plugin, new Runnable() {
                public void run(){
                    Bukkit.broadcastMessage(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "[" + ChatColor.DARK_PURPLE + ChatColor.BOLD.toString() + "Spleef" + ChatColor.DARK_RED + ChatColor.BOLD.toString() + "] " + ChatColor.DARK_AQUA + ChatColor.BOLD.toString() + "Начинаем через " + ChatColor.DARK_RED + ChatColor.BOLD.toString() + "15 "+ ChatColor.DARK_AQUA + ChatColor.BOLD.toString() + "секунд");
               }
            }, 20L);
        
            BukkitScheduler time10 = Bukkit.getServer().getScheduler();
            time10.scheduleSyncDelayedTask (plugin, new Runnable() {
                public void run(){
                    Bukkit.broadcastMessage(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "[" + ChatColor.DARK_PURPLE + ChatColor.BOLD.toString() + "Spleef" + ChatColor.DARK_RED + ChatColor.BOLD.toString() + "] " + ChatColor.DARK_AQUA + ChatColor.BOLD.toString() + "Начинаем через " + ChatColor.DARK_RED + ChatColor.BOLD.toString() + "10 "+ ChatColor.DARK_AQUA + ChatColor.BOLD.toString() + "секунд");
               }
            }, 120L);
        
            BukkitScheduler time5 = Bukkit.getServer().getScheduler();
            time5.scheduleSyncDelayedTask (plugin, new Runnable() {
                public void run(){
                    Bukkit.broadcastMessage(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "[" + ChatColor.DARK_PURPLE + ChatColor.BOLD.toString() + "Spleef" + ChatColor.DARK_RED + ChatColor.BOLD.toString() + "] " + ChatColor.DARK_AQUA + ChatColor.BOLD.toString() + "Начинаем через " + ChatColor.DARK_RED + ChatColor.BOLD.toString() + "5 "+ ChatColor.DARK_AQUA + ChatColor.BOLD.toString() + "секунд");
               }
            }, 220L);
        
            BukkitScheduler time4 = Bukkit.getServer().getScheduler();
            time4.scheduleSyncDelayedTask (plugin, new Runnable() {
                public void run(){
                    Bukkit.broadcastMessage(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "[" + ChatColor.DARK_PURPLE + ChatColor.BOLD.toString() + "Spleef" + ChatColor.DARK_RED + ChatColor.BOLD.toString() + "] " + ChatColor.DARK_RED + ChatColor.BOLD.toString() + "4 "+ ChatColor.DARK_AQUA + ChatColor.BOLD.toString() + "секунды");
               }
            }, 240L);
        
            BukkitScheduler time3 = Bukkit.getServer().getScheduler();
            time3.scheduleSyncDelayedTask (plugin, new Runnable() {
                public void run(){
                    Bukkit.broadcastMessage(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "[" + ChatColor.DARK_PURPLE + ChatColor.BOLD.toString() + "Spleef" + ChatColor.DARK_RED + ChatColor.BOLD.toString() + "] " + ChatColor.DARK_RED + ChatColor.BOLD.toString() + "3");
               }
            }, 260L);
        
            BukkitScheduler time2 = Bukkit.getServer().getScheduler();
            time2.scheduleSyncDelayedTask (plugin, new Runnable() {
                public void run(){
                    Bukkit.broadcastMessage(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "[" + ChatColor.DARK_PURPLE + ChatColor.BOLD.toString() + "Spleef" + ChatColor.DARK_RED + ChatColor.BOLD.toString() + "] " + ChatColor.DARK_RED + ChatColor.BOLD.toString() + "2");
               }
            }, 280L);
        
            BukkitScheduler time1 = Bukkit.getServer().getScheduler();
            time1.scheduleSyncDelayedTask (plugin, new Runnable() {
                public void run(){
                    Bukkit.broadcastMessage(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "[" + ChatColor.DARK_PURPLE + ChatColor.BOLD.toString() + "Spleef" + ChatColor.DARK_RED + ChatColor.BOLD.toString() + "] " + ChatColor.DARK_RED + ChatColor.BOLD.toString() + "1");
               }
            }, 300L);
        
            BukkitScheduler time0 = Bukkit.getServer().getScheduler();
            time0.scheduleSyncDelayedTask (plugin, new Runnable() {
                public void run(){
                    Bukkit.broadcastMessage(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "[" + ChatColor.DARK_PURPLE + ChatColor.BOLD.toString() + "Spleef" + ChatColor.DARK_RED + ChatColor.BOLD.toString() + "] " + ChatColor.DARK_RED + ChatColor.BOLD.toString() + "GO"+ ChatColor.DARK_AQUA + ChatColor.BOLD.toString() + "!");
                }
            }, 320L);
            //Регенерация арены на блок снега
            Location s = new Location(world, -44, 79, -172);
            int x1 = s.getBlockX();
            int y1 = s.getBlockY();
            int z1 = s.getBlockZ();
            int length = 76;
            int x2 = x1 + length;
            int y2 = y1;
            int z2 = z1 + length;
            World world1 = s.getWorld();
            for (int xPoint = x1; xPoint <= x2; xPoint++) {
            for (int yPoint = y1; yPoint <= y2; yPoint++) {
            for (int zPoint = z1; zPoint <= z2; zPoint++) {
            Block currentBlock = world1.getBlockAt(xPoint, yPoint, zPoint);
            currentBlock.setType(Material.SNOW_BLOCK);
            }}}
        
        
            }
            return true;
            }
        }
        else if(args[0].equals("broadcast")) {
            if(args.length == 1) {
            sender.sendMessage("Укажите название ивента (Spleef)");
            return true;
            }
            if(args[0].equals("broadcast") && args[1].equals("Spleef")) {
            Bukkit.broadcastMessage(ChatColor.DARK_RED + ChatColor.BOLD.toString() + "[" + ChatColor.DARK_PURPLE + ChatColor.BOLD.toString() + "Spleef" + ChatColor.DARK_RED + ChatColor.BOLD.toString() + "] " + ChatColor.DARK_AQUA + ChatColor.BOLD.toString() + "Скоро начнётся ивент " + ChatColor.GOLD + ChatColor.BOLD.toString() + "Spleef"+ ChatColor.DARK_AQUA + ChatColor.BOLD.toString() + "!");
        return true;
            }
        }
        else if(args[0].equals("stop")) {
            if(args.length == 1) {
            sender.sendMessage("Укажите название ивента (Spleef)");
            return true;
            }
            if(args.length == 2) {
                sender.sendMessage(ChatColor.RED + "Данная команда в разработке!");
        return true;
            }
        }
        return true;
    }
}
Снимок302.PNG.png
 
Последнее редактирование:
Объявления в цикле for. Ты же получаешь игроков чтобы выдать лопаты и всё зачем тянуть его.
 
Мои глаза... Не знаю, на сколько мой вариант лучше, но точно лучше чем у ТС.
Переделай под мой вариант и посмотри будет ли ошибка.
PHP:
new BukkitRunnable() {
    private int second = 30;

    @Override
    public void run() {
        switch (second--) {
            case 30:
                Utility.sendTitleAllPlayers(ChatColor.GREEN + "Игра начнётся через 30 секунд!", "");
                sound();
                break;
            case 15:
                Utility.sendTitleAllPlayers(ChatColor.GREEN + "Игра начнётся через 15 секунд!", "");
                sound();
                break;
            case 5:
                Utility.sendTitleAllPlayers(ChatColor.GREEN + "Игра начнётся через 5 секунд!", "");
                sound();
                break;
            case 3:
            case 2:
            case 1:
                tick();
                break;
            case 0:
                //типа начинаем игру
                this.source.getGameManager().preparingPlayersForGame();
                this.source.setEventRunning(true);
                super.cancel();
                break;

        }
    }

    private void sound() {
        Utility.playSoundAllPlayers(Sound.ENTITY_PLAYER_LEVELUP);
    }

    private void tick() {
        Utility.playSoundAllPlayers(Sound.ENTITY_EXPERIENCE_ORB_PICKUP);
    }

}.runTaskTimer(this.source, 0, 20);
 
Последнее редактирование:
Объявления в цикле for. Ты же получаешь игроков чтобы выдать лопаты и всё зачем тянуть его.
Я понял свою ошибку, одну скобку } переместил в другое место (после выдачи лопаты) и всё нормально заработало, спасибо.

Мои глаза... Не знаю, на сколько мой вариант лучше, но точно лучше чем у ТС.
Переделай под мой вариант и посмотри будет ли ошибка.
Я новичок и первый раз пишу плагин, Eclipse много ошибок выдавал либо я чего-то не понимаю в твоём коде, если что я пишу на версии minecraft 1.7.10
 
Последнее редактирование:
Ну да, у меня версия 1.12 в данном случае. Но сути не меняет, там де утилиты - это просто более удобный метод отправки звука для всех игроков, его можешь просто удалить и всё. Остальное не должно было поменяться. this.source - это объект плагина в данном случае, поменяй на свой чтобы подтвердить таймер и всё.
А сам код - отчёт времени в отдельном потоке. Каждые 20 тиков == 1 секунда переменная уменьшается на единицу, через switch таким образом мы проводим(как по мне) удобный отсчёт времени до начала игры, после чего отменяем задачу вызвав cancel и запустив игру.
 
после чего отменяем задачу вызвав cancel
Можно отменить эту задачу в конце игры? Допустим у меня идёт сужение арены каждые 30 секунд, игроки уже сразились, объявили победителя и как прекратить это сужение арены?
 
Назад
Верх