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

Помогите Почему не вставляется schematic

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

DakEnviy

Активный участник
Пользователь
Баллы
66
Имя в Minecraft
DakEnviy
Приветствую вас, форумчане!
Пытаюсь востановить арену вот этим кодом:
Код:
public static boolean loadSchematic(String schemFile, World world, Location location) throws MaxChangedBlocksException, IOException, DataException {
      
        File file = new File("plugins/WorldEdit/schematics/" + schemFile + ".schematic");
        Vector v = new Vector(location.getBlockX(), location.getBlockY(), location.getBlockZ());
        SchematicFormat format = SchematicFormat.getFormat(file);
        if (format == null)
        {
            return false;
        }
        EditSession es = WorldEdit.getInstance().getEditSessionFactory().getEditSession(new BukkitWorld(world), 0x3b9ac9ff);
       
        CuboidClipboard cc = format.load(file);
        cc.paste(es, v, false);
        return true;
    }

И вот этим:
Код:
public RestartArena (Arena a) {
        this.a = a;
    }
  
    public void run() {
        if (a.isState(ArenaState.RESTARTING)) {
            a.sendMessage(MessageType.INFO, "Рестарт арены...");
          
            int timer = 20;
            for (; timer >= 0; timer--) {
              
                if (timer == 0) {
                    a.setState(ArenaState.WAITING);
                    for (Sign s : a.signs) {
                        if (a.getState() == ArenaState.DISABLED) {
                            s.setLine(0, ChatColor.RED + "[OFFLINE]");
                        }
                        if (a.getState() == ArenaState.WAITING) {
                            s.setLine(0, ChatColor.GREEN + "[WAITING]");
                        }
                        if (a.getState() == ArenaState.IN_GAME) {
                            s.setLine(0, ChatColor.RED + "[IN_GAME]");
                        }
                        if (a.getState() == ArenaState.RESTARTING) {
                            s.setLine(0, ChatColor.YELLOW + "[RESTARTING]");
                        }
                        s.setLine(1, null);
                        s.setLine(2, ChatColor.AQUA + a.getName());
                        s.setLine(3, ChatColor.GOLD + "" + a.getCurrentPlayers() + ChatColor.GRAY + " из " + ChatColor.GOLD + "6");
                        s.update();
                    }
                    break;
                }
                if (timer == 15) {
                    try {
                        SchematicUtil.loadSchematic(a.getName(), a.getLobbyPoint().getWorld(), a.getLobbyPoint());
                    } catch (MaxChangedBlocksException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    } catch (DataException e) {
                        e.printStackTrace();
                    }
                }
                if (timer == 5) {
                    a.sendMessage(MessageType.INFO, "asdasdasd");
                    a.setBlueCount(0);
                    a.setRedCount(0);
                }
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    Bukkit.shutdown();
                }
            }
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
                Bukkit.shutdown();
            }
        }
    }

Не знаю в чём проблема. Помогите, чем сможете)
 
Ясен пень что если доки не читать то нихрена не выйдет.
Какого хрена вы мир модифицируете не из главного потока?
 
И еще у меня возникла проблема.
Я использую этом метод:
Код:
for (Player redPlayer : redTeam.getPlayers()) {
И у меня вот что выдаёт консоль:
Код:
[23:33:12] [Server thread/ERROR]: Could not pass event BlockBreakEvent to ObsidianGame v3.0
org.bukkit.event.EventException
    at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:302) ~[spigot.jar:git-Spigot-1649]
    at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[spigot.jar:git-Spigot-1649]
    at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:514) [spigot.jar:git-Spigot-1649]
    at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:499) [spigot.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.PlayerInteractManager.breakBlock(PlayerInteractManager.java:264) [spigot.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.PlayerInteractManager.dig(PlayerInteractManager.java:118) [spigot.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.PlayerConnection.a(PlayerConnection.java:552) [spigot.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.PacketPlayInBlockDig.a(PacketPlayInBlockDig.java:41) [spigot.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.PacketPlayInBlockDig.handle(PacketPlayInBlockDig.java:65) [spigot.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.NetworkManager.a(NetworkManager.java:186) [spigot.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.ServerConnection.c(ServerConnection.java:81) [spigot.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.MinecraftServer.v(MinecraftServer.java:734) [spigot.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.DedicatedServer.v(DedicatedServer.java:289) [spigot.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.MinecraftServer.u(MinecraftServer.java:584) [spigot.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.MinecraftServer.run(MinecraftServer.java:490) [spigot.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.ThreadServerApplication.run(SourceFile:628) [spigot.jar:git-Spigot-1649]
Caused by: java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(Unknown Source) ~[?:1.8.0_25]
    at java.util.ArrayList$Itr.next(Unknown Source) ~[?:1.8.0_25]
    at ru.dakenviy.og.listengers.player.WinDetection.onBlockBreak(WinDetection.java:56) ~[?:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_25]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_25]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_25]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_25]
    at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:298) ~[spigot.jar:git-Spigot-1649]
    ... 15 more

Помогите!
 
И еще у меня возникла проблема.
Я использую этом метод:
Код:
for (Player redPlayer : redTeam.getPlayers()) {
И у меня вот что выдаёт консоль:
Код:
[23:33:12] [Server thread/ERROR]: Could not pass event BlockBreakEvent to ObsidianGame v3.0
org.bukkit.event.EventException
    at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:302) ~[spigot.jar:git-Spigot-1649]
    at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[spigot.jar:git-Spigot-1649]
    at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:514) [spigot.jar:git-Spigot-1649]
    at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:499) [spigot.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.PlayerInteractManager.breakBlock(PlayerInteractManager.java:264) [spigot.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.PlayerInteractManager.dig(PlayerInteractManager.java:118) [spigot.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.PlayerConnection.a(PlayerConnection.java:552) [spigot.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.PacketPlayInBlockDig.a(PacketPlayInBlockDig.java:41) [spigot.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.PacketPlayInBlockDig.handle(PacketPlayInBlockDig.java:65) [spigot.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.NetworkManager.a(NetworkManager.java:186) [spigot.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.ServerConnection.c(ServerConnection.java:81) [spigot.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.MinecraftServer.v(MinecraftServer.java:734) [spigot.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.DedicatedServer.v(DedicatedServer.java:289) [spigot.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.MinecraftServer.u(MinecraftServer.java:584) [spigot.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.MinecraftServer.run(MinecraftServer.java:490) [spigot.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.ThreadServerApplication.run(SourceFile:628) [spigot.jar:git-Spigot-1649]
Caused by: java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(Unknown Source) ~[?:1.8.0_25]
    at java.util.ArrayList$Itr.next(Unknown Source) ~[?:1.8.0_25]
    at ru.dakenviy.og.listengers.player.WinDetection.onBlockBreak(WinDetection.java:56) ~[?:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_25]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_25]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_25]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_25]
    at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:298) ~[spigot.jar:git-Spigot-1649]
    ... 15 more

Помогите!
Это хорошо, что Вы цикл используете. Только почему вы не показали, что у Вас в 56-й строке класса WinDetection.java?
 
И еще у меня возникла проблема.
Я использую этом метод:
Код:
for (Player redPlayer : redTeam.getPlayers()) {
И у меня вот что выдаёт консоль:
Код:
[23:33:12] [Server thread/ERROR]: Could not pass event BlockBreakEvent to ObsidianGame v3.0
org.bukkit.event.EventException
    at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:302) ~[spigot.jar:git-Spigot-1649]
    at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[spigot.jar:git-Spigot-1649]
    at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:514) [spigot.jar:git-Spigot-1649]
    at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:499) [spigot.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.PlayerInteractManager.breakBlock(PlayerInteractManager.java:264) [spigot.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.PlayerInteractManager.dig(PlayerInteractManager.java:118) [spigot.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.PlayerConnection.a(PlayerConnection.java:552) [spigot.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.PacketPlayInBlockDig.a(PacketPlayInBlockDig.java:41) [spigot.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.PacketPlayInBlockDig.handle(PacketPlayInBlockDig.java:65) [spigot.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.NetworkManager.a(NetworkManager.java:186) [spigot.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.ServerConnection.c(ServerConnection.java:81) [spigot.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.MinecraftServer.v(MinecraftServer.java:734) [spigot.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.DedicatedServer.v(DedicatedServer.java:289) [spigot.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.MinecraftServer.u(MinecraftServer.java:584) [spigot.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.MinecraftServer.run(MinecraftServer.java:490) [spigot.jar:git-Spigot-1649]
    at net.minecraft.server.v1_7_R4.ThreadServerApplication.run(SourceFile:628) [spigot.jar:git-Spigot-1649]
Caused by: java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(Unknown Source) ~[?:1.8.0_25]
    at java.util.ArrayList$Itr.next(Unknown Source) ~[?:1.8.0_25]
    at ru.dakenviy.og.listengers.player.WinDetection.onBlockBreak(WinDetection.java:56) ~[?:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_25]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_25]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_25]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_25]
    at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:298) ~[spigot.jar:git-Spigot-1649]
    ... 15 more

Помогите!
Нельзя удалять элементы листа во время прохода по нему.
 
Можно, если через нормальный итератор.
А ещё можно запилить свой собственный лист который будет нормально пережёвывать удаление элементов :D.
Или всякие ленивые ушлёпки могут сделать копию листа и итерировать по ней. Главное потом это в API не выставлять, а то получится как с котлом, там список игроков простой ArrayList, в то время как в ведре - CopyOnWrite, что вызывает на котле CME когда в цикле кикаешь всех онлайн игроков :D.
 
Я как самый ленивый, когда мне надо удалять что-то в List'ах прохожусь по ним в обратном порядке. Работает ещё со времен бейсика и паскаля ;)
 
for( : ), кстати, работает через итератор, только к нему обращаться напрямую нельзя.
Ну, а как мне исправить проблему в коде? Я просто первый раз слышу про итератор.(Сори за тупость)
 
@DakEnviy

Ну вы же так и не написали, что в у Вас там в коде происходит. Это только мы предполагаем, что Вы в цикле элементы списка удаляете.

Ну а вообще почитайте статью, там под номером 3 как раз рассматривается удаление.
 
@DakEnviy

Ну вы же так и не написали, что в у Вас там в коде происходит. Это только мы предполагаем, что Вы в цикле элементы списка удаляете.

Ну а вообще почитайте статью, там под номером 3 как раз рассматривается удаление.

Вот WinDetection.java
Код:
public class WinDetection implements Listener {
   
    @EventHandler
    public void onBlockBreak (BlockBreakEvent e) {
       
        Economy econ = ObsidianGame.instance().economy;
       
        Permission vip = new Permission("og.VIP");
        Permission ultra = new Permission("og.ULTRA");
        Permission hero = new Permission("og.HERO");
       
        Player p = e.getPlayer();
        Material itemInHand = p.getItemInHand().getType();
        Material blockToDestroy = e.getBlock().getType();
        Arena arena = ArenaManager.getInstance().getArena(p);
       
        if (arena == null) return;
       
        if (blockToDestroy == Material.OBSIDIAN) {   
            if (itemInHand != Material.GOLD_PICKAXE) {
                MessageManager.getInstance().msg(p, MessageType.BAD, "Дундук, ломай золотой киркой!");
                e.setCancelled(true);
            } else {
                Team team = TeamManager.getInstance().getTeam(p);
                Team redTeam = TeamManager.getInstance().getTeam("Red", arena);
                Team blueTeam = TeamManager.getInstance().getTeam("Blue", arena);
               
                if (team == redTeam) {
                    team.setScore(team.getScore() + 1);
                   
                    arena.sendMessage(MessageType.INFO, p.getName() + " сломал обсидиан! Счёт: " +
                            "Красные- " + redTeam.getScore() +
                            " Синие- " + blueTeam.getScore());
                    if (redTeam.getScore() == 3 && blueTeam.getScore() == 0) {
                        arena.sendMessage(MessageType.INFO, "Красная команда победила!");   
                        for (Player redPlayer : redTeam.getPlayers()) {
                           
                            redPlayer.sendMessage(ChatColor.GREEN + "==============================");
                            redPlayer.sendMessage("Металиков заработано:");
                            redPlayer.sendMessage("");
                            redPlayer.sendMessage(ChatColor.GREEN + "+10 металиков" + ChatColor.RESET + " - За игру");
                            redPlayer.sendMessage(ChatColor.GREEN + "+15 металиков" + ChatColor.RESET + " - За победу");
                           
                            econ.depositPlayer(redPlayer.getName(), 25);
                            if (redPlayer.hasPermission(vip)) {
                                econ.depositPlayer(redPlayer.getName(), 10);
                                redPlayer.sendMessage(ChatColor.GREEN + "+10 металиков" + ChatColor.RESET + " - За " + ChatColor.GOLD + "VIP");
                            }
                            if (redPlayer.hasPermission(ultra)) {
                                econ.depositPlayer(redPlayer.getName(), 25);
                                redPlayer.sendMessage(ChatColor.GREEN + "+25 металиков" + ChatColor.RESET + " - За " + ChatColor.DARK_PURPLE + "ULTRA");
                            }
                            if (redPlayer.hasPermission(hero)) {
                                econ.depositPlayer(redPlayer.getName(), 50);
                                redPlayer.sendMessage(ChatColor.GREEN + "+50 металиков" + ChatColor.RESET + " - За " + ChatColor.GREEN + "HERO");
                            }
                            redPlayer.sendMessage("");
                            redPlayer.sendMessage("Всего металиков: " + ChatColor.GREEN + econ.getBalance(redPlayer.getName()));
                            redPlayer.sendMessage(ChatColor.GREEN + "==============================");
                           
                            redTeam.setScore(0);
                            blueTeam.setScore(0);
                           
                            arena.removePlayer(p);
                            team.remove(p);
                            if (KitManager.getInstance().getKit(p) != null) {
                                KitManager.getInstance().getKit(p).removeKit(p);
                            }
                            arena.restart();
                        }
                        for (Player bluePlayer : blueTeam.getPlayers()) {
                           
                            bluePlayer.sendMessage(ChatColor.GREEN + "==============================");
                            bluePlayer.sendMessage("Металиков заработано:");
                            bluePlayer.sendMessage("");
                            bluePlayer.sendMessage(ChatColor.GREEN + "+10 металиков" + ChatColor.RESET + " - За игру");
                           
                            econ.depositPlayer(bluePlayer.getName(), 10);
                            if (bluePlayer.hasPermission(vip)) {
                                econ.depositPlayer(bluePlayer.getName(), 5);
                                bluePlayer.sendMessage(ChatColor.GREEN + "+5 металиков" + ChatColor.RESET + " - За " + ChatColor.GOLD + "VIP");
                            }
                            if (bluePlayer.hasPermission(ultra)) {
                                econ.depositPlayer(bluePlayer.getName(), 10);
                                bluePlayer.sendMessage(ChatColor.GREEN + "+25 металиков" + ChatColor.RESET + " - За " + ChatColor.DARK_PURPLE + "ULTRA");
                            }
                            if (bluePlayer.hasPermission(hero)) {
                                econ.depositPlayer(bluePlayer.getName(), 20);
                                bluePlayer.sendMessage(ChatColor.GREEN + "+50 металиков" + ChatColor.RESET + " - За " + ChatColor.GREEN + "HERO");
                            }
                            bluePlayer.sendMessage("");
                            bluePlayer.sendMessage("Всего металиков: " + ChatColor.GREEN + econ.getBalance(bluePlayer.getName()));
                            bluePlayer.sendMessage(ChatColor.GREEN + "==============================");
                           
                            redTeam.setScore(0);
                            blueTeam.setScore(0);
                           
                            arena.removePlayer(p);
                            team.remove(p);
                            if (KitManager.getInstance().getKit(p) != null) {
                                KitManager.getInstance().getKit(p).removeKit(p);
                            }
                            arena.restart();
                        }
                    }
Это только часть, но дальше там одно и тоже)
 
team.remove(p); наверняка убирает игрока из redTeam. Если так, то изучайте итераторы.
 
В чем разница между нормальными и обычными итераторами?

Ты читаешь между строчек? Где я вообще ставил вопрос нормальный и обычный? Я всего лишь написал, чтобы он создал объект Iterator и с ним производил работу, это для меня Нормальный и Обычный итератор в одном флаконе.

А то, что java предлагает свой аналог foreach - это не Итератор, объект просто реализует Iterable, я рад, что ты знаешь про это и понимаешь, как оно устроено. Но работать через Итератор и работать с Итератором - это немного различные вещи.
 
Статус
Закрыто для дальнейших ответов.

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

Назад
Верх