Помогите Массив с аренами хелп

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

CamedoZzZ

Активный участник
Пользователь
Баллы
61
Вообщем перейду сразу к делу!
Имеется класс с хранением арен..
Код:
public class Arena extends ArenaManager{
    private List<String> players = new ArrayList<>(); // Лист с игроками
    private int time; // Время арены
    private int start = 2; // Кол-во игроков для старта
    private int max; // Максимальное кол-во игроков
    private String name; // Имя арены
    private Location spawn, lobby, end; // Локации
    private List<String> waiters = new ArrayList<>(); // Лист с ожидающими
   

    public Arena(String name, int time, int start, int max, Location spawn, Location lobby, Location end) {
        this.time = time;
        this.max = max;
        this.name = name;
        this.spawn = spawn;
        this.lobby = lobby;
        this.end = end;
   
    } //
    public List<String> getPlayers() { 
        return players;
    }
    ... И дальше возвращение переменных...


В другом классе регистрация этих арен, добавление, и поиск арены по иммени
Код:
public class ArenaManager {
    //private static ArenaManager am = new ArenaManager();
    public List<Arena> arenas = new ArrayList<>();
   
    public void registerNewArena(String name, int time, int start, int max, Location spawn, Location lobby, Location end) { // Как я и говорил, тут мы создаем арену, тоже самое, только тут мы ее еще будем хранить в листе

        Arena arena = new Arena(name, time, start, max, spawn, lobby, end);

        arenas.add(arena);
    }
public void addPlayer(Player p, String arenaname) { // Добавление игрока в арену
            Arena a = getArena(arenaname);
            p.setHealth(p.getMaxHealth()); // Лечим игрока
            p.setFireTicks(0); // Еще лечим
            p.teleport(a.getLobby()); // Телепорт игрока в лобби
            a.getPlayers().add(p.getName()); // Добавляем игрока к игрокам на арене
            int playersLeft = a.getStart() - a.getPlayers().size(); // Кол-во игроков минимум - кол-во игроков на арене
            if (playersLeft == 0) { // Если это число == 0, то старт арены
            }

       }
public Arena getArena(String name) {
        for(Arena a : arenas) {
            if(a.getName().equalsIgnoreCase(name)) {
                return a;
            }
        }
        return null;
    }

Есть Команды на создание и вход в эти арены
Код:
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        if(cmd.getName().equalsIgnoreCase("create")) {
            return Create(sender, args);
        }
        if(cmd.getName().equalsIgnoreCase("join")) {
            return addplayer(sender, args);
        }
        if(cmd.getName().equalsIgnoreCase("check")) {
            return check(sender, args);
        }
        return false;
    }
 
    public boolean Create(CommandSender sender, String[] args) {
        File file = new File(prison.getDataFolder(), "config.yml");;
        Player p = (Player)sender;
        if(p != (Player)sender) return false;
        Location spawn = p.getLocation();
        Location lobby = p.getLocation();
        Location end = p.getLocation();
        am.registerNewArena(args[0], 200, 2, 4 , spawn, lobby, end);
        prison.getLogger().info("GOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOD");
        p.sendMessage("Арена создана ");
        Arena m = am.getArena(args[0]);
        p.sendMessage("Арена создана "+ m.getName());
        ArenaUtil.saveArena(m, file);
       return true;
    }
 
    public boolean addplayer(CommandSender sender, String[] args) {
        am.addPlayer((Player)sender, args[0]);
       return true;
    }
В чем собсна проблема.
Арена создаётся, все хорошо (проверил записью в yml), пишется название арены при создании, тоесть не коверкается.
При попытке войти, выдаёт вот эту ошибку
Код:
[13:30:24] [Server thread/INFO]: Graff issued server command: /create test
[13:30:24] [Server thread/INFO]: [PrisonBreak] GOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOD
[13:30:28] [Server thread/INFO]: Graff issued server command: /join test
[13:30:28] [Server thread/ERROR]: null
org.bukkit.command.CommandException: Unhandled exception executing command 'join' in plugin PrisonBreak v1.0
    at org.bukkit.command.PluginCommand.execute(PluginCommand.java:46) ~[craftbukkit.jar:git-Spigot-db6de12-18fbb24]
    at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141) ~[craftbukkit.jar:git-Spigot-db6de12-18fbb24]
    at org.bukkit.craftbukkit.v1_8_R3.CraftServer.dispatchCommand(CraftServer.java:641) ~[craftbukkit.jar:git-Spigot-db6de12-18fbb24]
    at net.minecraft.server.v1_8_R3.PlayerConnection.handleCommand(PlayerConnection.java:1162) [craftbukkit.jar:git-Spigot-db6de12-18fbb24]
    at net.minecraft.server.v1_8_R3.PlayerConnection.a(PlayerConnection.java:997) [craftbukkit.jar:git-Spigot-db6de12-18fbb24]
    at net.minecraft.server.v1_8_R3.PacketPlayInChat.a(PacketPlayInChat.java:45) [craftbukkit.jar:git-Spigot-db6de12-18fbb24]
    at net.minecraft.server.v1_8_R3.PacketPlayInChat.a(PacketPlayInChat.java:1) [craftbukkit.jar:git-Spigot-db6de12-18fbb24]
    at net.minecraft.server.v1_8_R3.PlayerConnectionUtils$1.run(SourceFile:13) [craftbukkit.jar:git-Spigot-db6de12-18fbb24]
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [?:1.8.0_171]
    at java.util.concurrent.FutureTask.run(Unknown Source) [?:1.8.0_171]
    at net.minecraft.server.v1_8_R3.SystemUtils.a(SourceFile:44) [craftbukkit.jar:git-Spigot-db6de12-18fbb24]
    at net.minecraft.server.v1_8_R3.MinecraftServer.B(MinecraftServer.java:715) [craftbukkit.jar:git-Spigot-db6de12-18fbb24]
    at net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:374) [craftbukkit.jar:git-Spigot-db6de12-18fbb24]
    at net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:654) [craftbukkit.jar:git-Spigot-db6de12-18fbb24]
    at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:557) [craftbukkit.jar:git-Spigot-db6de12-18fbb24]
    at java.lang.Thread.run(Unknown Source) [?:1.8.0_171]
Caused by: java.lang.NullPointerException
    at prison.main.ArenaManager.addPlayer(ArenaManager.java:23) ~[?:?]
    at prison.main.Commands.addplayer(Commands.java:53) ~[?:?]
    at prison.main.Commands.onCommand(Commands.java:28) ~[?:?]
    at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44) ~[craftbukkit.jar:git-Spigot-db6de12-18fbb24]
    ... 15 more

Указывает на строчки : 23. p.teleport(a.getLobby()); // Телепорт игрока в лобби / Видимо не может получит локацию
53: am.addPlayer((Player)sender, args[0]); Ваще безпонятия, должно быть норм
28: Сама команда
Код:
if(cmd.getName().equalsIgnoreCase("join")) {
            return addplayer(sender, args);
        }

Застрял на этом, не могу понять, прошу помощи :3
 
У тебя getArena(arenaname) в методе addPlayer возвращает null, а потом ты вызываешь из null метод: a.getLobby()
Если находит имя, он возвращает эту арену (По идее)
Код:
if(a.getName().equalsIgnoreCase(name)) {
                return a;
            }
Имя арены пишу правильно, всё равно получается возвращает null. Чет не врублюсь
 
Если находит имя, он возвращает эту арену (По идее)
Код:
if(a.getName().equalsIgnoreCase(name)) {
                return a;
            }
Имя арены пишу правильно, всё равно получается возвращает null. Чет не врублюсь
Твой мозг не осилил даже заюзать HashMap. Рано тебе в плагины лезть.
 
PHP:
public Arena getArena(String name) {
    for(Arena a : arenas) {
        if(a.getName().equalsIgnoreCase(name)) {
            return a;
        }
    }
    return null; // ВОТ что оно возвращает
}
Ну возьми продебажь, выведи все арены которые в данный момент в списке, выведи для себя итерацию проверок в getArena и т.д., там уже проблема сама собой выйдет наружу.

P.S. И да, будет полезно узнать про Maps, незаменимая вещь во многих случаях.
Уже продебажил, понял что арена не записывается, то есть на этой строчке am.registerNewArena(args[0], 20, 2, 4, spawn, lobby, end); выходит ошибка, пытаюсь разобраться
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх