[СТАТЬЯ] Как сделать мини игру?

  • Автор темы Автор темы BeLkA
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

BeLkA

Старожил
Пользователь
Баллы
153
МИНИ ИГРА

На самом деле, писать мини игру не так уж и сложно. Нужны просто вспомогательные классы. В первой части о написании мини игр, я напишу код класса Arena, ArenaManager, и ArenaUtil (класс, добавленный мной, для хранения арен). Класс Arena будет служить для нас чуть ли не основой плагина. Начнем с него.

Что такое арена, думаю знают многие (в смысле MineCraft).

У арены должно быть имя, минимальное кол-во игроков, для ее старта, максимальное кол-во игроков, List<String> с именами игроков, которые есть на арене, List<String> с ожидающими, булевское значение "в игре", время арены, и три локации - лобби, спавн, и локация конца игры.

Начнем, наш класс арены:

Java:
package me.belka.energyapi;

import java.util.ArrayList;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.Location;

public class Arena extends ArenaManager {

    private List<String> players = new ArrayList<>(); // Лист с игроками
    private int time; // Время арены
    private int start; // Кол-во игроков для старта
    private int max; // Максимальное кол-во игроков
    private String name; // Имя арены
    private Location spawn, lobby, end; // Локации
    private List<String> waiters = new ArrayList<>(); // Лист с ожидающими
    private boolean inGame; // Булевское значение - в игре

    public Arena(String name, String prefix, 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;
        this.prefix = prefix;

    } // Функция для создания арены. Для этого нам потребуются некоторые аргументы. Чтобы создать арену, нам нужно будет сделать переменную арены типа этой: Arena a = new Arena(...); , и затем пользоваться ей, но так арену мы создавать не будем, будем создавать ее через ArenaManager, об этом чуть позже

    public List<String> getPlayers() { // Метод getPlayers() возвращает лист игроков, который можно изменять.
        return players;
    }

    public int getTime() {// Метод getTime() возвращает время арены
        return time;
    }

    public void setTime(int time) { // Установка времени
        this.time = time;
    }

    public int getStart() { // Возвращает кол-во игроков для старта
        return start;
    }

    public void setStart(int start) { // Установка кол-ва игроков для старта
        this.start = start;
    }

    public int getMax() { // Возвращает кол-во макс. игроков
        return max;
    }

    public void setMax(int max) { // Установка числа макс. игроков
        this.max = max;
    }

    public String getName() { // Возвращает имя
        return name;
    }

    public void setName(String name) { // Установка имени
        this.name = name;
    }

    public Location getSpawn() { // Возвращает локацию спавна
        return spawn;
    }

    public void setSpawn(Location spawn) { // Установка локации спавна
        this.spawn = spawn;
    }

    public Location getLobby() { // Возвращает локацию лобби
        return lobby;
    }

    public void setLobby(Location lobby) { // Установка локации лобби
        this.lobby = lobby;
    }

    public Location getEnd() { // Возвращает локацию конца игры
        return end;
    }

    public void setEnd(Location end) { // Установка локации конца игры
        this.end = end;
    }

    public boolean isFull() { // Булевское значение, которое проверяет, полная ли арена

        if (players.size() >= max) {
        return true;
        } else {
        return false;
        }

    }

    public void sendMessage(String msg) { // Отсылка сообщения всем игрокам в арене
        for(String str : players) {

            Bukkit.getPlayer(str).sendMessage(msg);

        }
    }

    public boolean isInGame() { // Проверка, в игре ли арена
        return inGame;
    }

    public void setInGame(boolean inGame) { // Установка булевского значения "в игре"
        this.inGame = inGame;
    }

}

И теперь следующий класс, ArenaManager

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

Java:
package me.belka.energyapi;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;

public class ArenaManager {

    private static ArenaManager am = new ArenaManager(); // Наш менеджер
    public List<Arena> arenas = new ArrayList<>(); // Лист с аренами, которые будут храниться временно

    public static ArenaManager getManager() { // Для того, чтобы использовать менеджер.
        return am;
    }

    public void addPlayer(Player p, Arena arena) { // Добавление игрока в арену
        if(arena == null) { // Проверка, существует ли арена
            p.sendMessage("§cNo arena!");
            return;
        }

        if(arena.isFull()) { // А она не заполнена?
            p.sendMessage(arena.getPrefix() +  "Arena is full!");
            return;
        }

        if(arena.isInGame()) { // А если она в игре?
            p.sendMessage(arena.getPrefix() + "Arena is already in game!");
            return;
        }

        p.setHealth(p.getMaxHealth()); // Лечим игрока
        p.setFireTicks(0); // Еще лечим

        p.teleport(arena.getLobby()); // Телепорт игрока в лобби
 
        arena.getPlayers().add(p.getName()); // Добавляем игрока к игрокам на арене

        int playersLeft = arena.getStart() - arena.getPlayers().size(); // Кол-во игроков минимум - кол-во игроков на арене

        if (playersLeft == 0) { // Если это число == 0, то старт арены
        startArena(arena);
        }

    }

    public void startArena(final Arena arena) { // Метод старта арены
        if(arena.getPlayers() != null) // Проверяем, не повыходили ли игроки?

                          for(String str : arena.getPlayers()) { // Берем все имена игроков

                            Player pl = Bukkit.getPlayer(str); // Превращяем их в игроков

                            pl.teleport(arena.getSpawn());

                            arena.setInGame(true); // Арена в игре!

                            arena.getWaiters().clear(); // Очищаем список ожидающих

                          }

        Bukkit.getScheduler().scheduleSyncDelayedTask(EnergyAPI.getAPI(), new Runnable() { // Запускаем шедулер, здесь мы его запустим, чтобы через какое-то время арена кончилась.

            public void run() {
                endArena(arena); // Метод завершения игры на арене
            }

        }, arena.getTime() * 20); // Время арены в тиках умноженное на 20, чтобы это были секунды

    }

    public void endArena(Arena arena) { // Метод завершения игры на арене
        if(arena == null) { // А существует ли арена?
            return;
        }

        if(arena.getPlayers() != null) { // А на арене есть игроки?

            arena.sendMessage(arena.getPrefix() + "The end of the game!");
            arena.setInGame(false); // Арена не в игре!

            Iterator<String> players = arena.getPlayers().iterator(); // Итератор - почти тоже самое, что у оператор for, но только если здесь вы используете for, и начнете чистить список играющих, то у вас вылетит ConcurrentModificationException, поэтому здесь используем Iterator

            while(players.hasNext())
            { // Пока у итератора не кончились ячейки
            String str = players.next(); // Тоже, что и for (String str : arena.getPlayers())

            Player p = Bukkit.getPlayer(str); // Теперь это у нас игрок

            players.remove(); // Очищаем список играющих

            p.setHealth(p.getMaxHealth()); // Лечим игрока

            p.setFireTicks(0); // Еще лечим игрока

            removePlayer(p); // Убиарем игрока из арены

            p.teleport(arena.getEnd());

            }

        }

    }

    public void removePlayer(Player p) { // Метод удаления игрока из арены
        for(Arena arena : arenas) { // Проходимя по всем аренам

        if (arena == null) { // Арена существует?
            p.sendMessage("§cNo arena!");
            return;
        }

            if(arena.getPlayers().contains(p.getName())) { // А в ней есть игрок?

            p.setHealth(p.getMaxHealth()); // Лечим, потом еще
            p.setFireTicks(0);

            p.teleport(arena.getEnd());

            arena.getPlayers().remove(p.getName()); // Удаляем игрока из играющих

            arena.sendMessage(arena.getPrefix() + p.getName() + " left the game! §6" + arena.getPlayers().size() + "§4/§6" + arena.getMax()); // Он покинул нас :c

            if(arena.getPlayers().size() <= 1) { // А на арене остался только один, или нет игроков вообще? Заканчиваем арену.
                endArena(arena);
            }

            }

        }

    }


    public void registerNewArena(String name, String prefix, int time, int start, int max, Location spawn, Location lobby, Location end) { // Как я и говорил, тут мы создаем арену, тоже самое, только тут мы ее еще будем хранить в листе

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

        arenas.add(arena);

    }

    public boolean isInGame(Player p) { // Булевское значение, утилита. В игре ли игрок?
        for(Arena a : arenas) {

            if(a.getPlayers().contains(p.getName())) {
                return true;
            }
        }
        return false;
    }


    public boolean isWaiter(Player p) { // А если игрок ожидающий? Еще одна утилита.
        for(Arena a : arenas) {
            if(a.getWaiters().contains(p.getName())) {
                return true;
            }
        }
        return false;
    }


    public boolean hasPlayerInGame(Arena arena, Player p) { // Играет ли игрок на определенной арене?
        if(arena.getPlayers().contains(p.getName()) && !arena.getWaiters().contains(p.getName())) {
            return true;

        }
        return false;
    }


    public boolean hasWaiter(Arena arena, Player p) { // А может, он только ожидающий на этой арене?
        if(!arena.getPlayers().contains(p.getName()) && arena.getWaiters().contains(p.getName())) {
            return true;
        }
        return false;
    }


    public Arena getArena(String name) { // Найдем арену по имени
        for(Arena a : arenas) {
            if(a.getName().equalsIgnoreCase(name)) {
                return a;
            }
        }
        return null;
    }


    public Arena getPlayingArena(Player p) { // В какой же арене играет игрок? Утилита.
        for(Arena a : arenas) {
            if(a.getPlayers().contains(p.getName())) {
                return a;
            }
        }
        return null;
    }

    public void removeArena(Arena arena) { // Метод удаления арены
        if(arena != null) {
            arenas.remove(arena);
        }
    }


}

Так как с каждой перезагрузкой сервера каждый List любого типа в плагине очищается, и арена перестает существовать, то нам понадобится хранить арену в конфигурационном файле. Этю плюшку я для вас тоже приготовил :3

И так, наш код, с идеальными комментариями будет ниже, т.к. Admin запретил больше 15 КК символов в сообщении :3
 
Последнее редактирование модератором:
Класс ArenaUtil не делает ничего такого супер офигенного. Он просто сохраняет, и загружает данные из конфига.

Java:
package me.belka.energyapi;

import java.io.File;

import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.configuration.file.YamlConfiguration;

public class ArenaUtil {

    public static void saveArena(Arena arena, File f) { // Метод сохранения арены. Два аргумента - арена, и файл, куда сохранять.
   
        String name = arena.getName(); // Имя арены. Дальше просто разделяем каждую составляющую арены на части.
   
        YamlConfiguration config = YamlConfiguration.loadConfiguration(f); // Наша конфигурация
   
        config.set("arenas." + name + ".prefix", arena.getPrefix().replace("&", "§"));
   
        config.set("arenas." + name + ".spawn.loc.world", arena.getSpawn().getWorld().getName());
        config.set("arenas." + name + ".spawn.loc.x", arena.getSpawn().getX());
        config.set("arenas." + name + ".spawn.loc.y", arena.getSpawn().getY());
        config.set("arenas." + name + ".spawn.loc.z", arena.getSpawn().getZ());
   
        config.set("arenas." + name + ".lobby.loc.world", arena.getLobby().getWorld().getName());
        config.set("arenas." + name + ".lobby.loc.x", arena.getLobby().getX());
        config.set("arenas." + name + ".lobby.loc.y", arena.getLobby().getY());
        config.set("arenas." + name + ".lobby.loc.z", arena.getLobby().getZ());
   
        config.set("arenas." + name + ".end.loc.world", arena.getEnd().getWorld().getName());
        config.set("arenas." + name + ".end.loc.x", arena.getEnd().getX());
        config.set("arenas." + name + ".end.loc.y", arena.getEnd().getY());
        config.set("arenas." + name + ".end.loc.z", arena.getEnd().getZ());
   
        config.set("arenas." + name + ".time", arena.getTime());
        config.set("arenas." + name + ".start", arena.getStart());
        config.set("arenas." + name + ".max", arena.getMax());
   
        try {
            config.save(f);
            config.load(f);
        } catch(Exception e1) {
            e1.printStackTrace();
        } // Типа сохранили, и подгрузили конфиг.
    }

    public static void loadArena(String name, File f) { // Загружаем арену, но тут в аргументах не арена, а строка, какую мы будем подгружать.
        YamlConfiguration config = YamlConfiguration.loadConfiguration(f); // Наша конфигурация
   
// Дальше идут три наших локации арены

        Location spawn = new Location(Bukkit.getWorld(config.getString("arenas." + name + ".spawn.loc.world")),
                config.getDouble("arenas." + name + ".spawn.loc.x"),
                config.getDouble("arenas." + name + ".spawn.loc.y"),
                config.getDouble("arenas." + name + ".spawn.loc.z"));
   
        Location lobby = new Location(Bukkit.getWorld(config.getString("arenas." + name + ".lobby.loc.world")),
                config.getDouble("arenas." + name + ".lobby.loc.x"),
                config.getDouble("arenas." + name + ".lobby.loc.y"),
                config.getDouble("arenas." + name + ".lobby.loc.z"));
   
        Location end = new Location(Bukkit.getWorld(config.getString("arenas." + name + ".end.loc.world")),
                config.getDouble("arenas." + name + ".end.loc.x"),
                config.getDouble("arenas." + name + ".end.loc.y"),
                config.getDouble("arenas." + name + ".end.loc.z"));
   
        if(config.getConfigurationSection("arenas." + name) != null) {
            EnergyAPI.am.registerNewArena(name, config.getString("arenas." + name + ".prefix").replace("&", "§"),
                config.getInt("arenas." + name + ".time"),
                config.getInt("arenas." + name + ".start"),
                config.getInt("arenas." + name + ".max"),
                spawn,
                lobby,
                end);
       
            // Тут мы создали, и подгрузили арену.

            EnergyAPI.am.getArena(name).setInGame(false);
            EnergyAPI.am.getArena(name).setSpawn(spawn);
            EnergyAPI.am.getArena(name).setEnd(end);
            EnergyAPI.am.getArena(name).setLobby(lobby);
            EnergyAPI.am.getArena(name).setPrefix(config.getString("arenas." + name + ".prefix").replace("&", "§"));
            EnergyAPI.am.getArena(name).setTime(config.getInt("arenas." + name + ".time"));
            EnergyAPI.am.getArena(name).setMax(config.getInt("arenas." + name + ".max"));
            EnergyAPI.am.getArena(name).setStart(config.getInt("arenas." + name + ".start"));

// И так, тут мы уже добавляем арену во временное хранение, в пожизненном хранении никуда ее не деваем.

        }
    }

    public static void loadAllArenas(File f) { // Метод, для удобной подгрузки всех арен из конфигурации в методе onEnable()
   
        YamlConfiguration config = YamlConfiguration.loadConfiguration(f); // Наша конфигурация
   
        if(config.getConfigurationSection("arenas") != null) { // Проверяем, есть ли в конфиге секция "arenas"
       
        for(String an : config.getConfigurationSection("arenas").getValues(false).keySet()) { // Проходимся по всем подсекциям в секции "arenas"
            loadArena(an, f); // И тут загружаем каждую
        }
       
        }
    }

// Далее пойдут методы для каждой функции, которые будет производиться не во временном, а в пожизненном хранении.

    public static void removeArena(String name, File f) { // Метод удаления арены

        YamlConfiguration config = YamlConfiguration.loadConfiguration(f);
   
        if(config.getConfigurationSection("arenas." + name) != null) { // Есть ли секция arenas.name?
            config.set("arenas." + name, null); // Теперь эта секция - null
        }
   
        try {
            config.save(f);
            config.load(f);
        } catch(Exception e1) {
            e1.printStackTrace();
        }
    }

    public static void setStart(int i, Arena arena, File f) { // Метод для установки кол-ва игроков для старта

        YamlConfiguration config = YamlConfiguration.loadConfiguration(f);
   
        if(config.getConfigurationSection("arenas." + arena.getName()) != null) {
            config.set("arenas." + arena.getName() + ".start", i);
        }
   
        try {
            config.save(f);
            config.load(f);
        } catch(Exception e1) {
            e1.printStackTrace();
        }
    }

    public static void setMax(int i, Arena arena, File f) { // Метод для установки макс. игроков

        YamlConfiguration config = YamlConfiguration.loadConfiguration(f);
   
        if(config.getConfigurationSection("arenas." + arena.getName()) != null) {
            config.set("arenas." + arena.getName() + ".max", i);
        }
   
        try {
            config.save(f);
            config.load(f);
        } catch(Exception e1) {
            e1.printStackTrace();
        }
    }

    public static void setTime(int i, Arena arena, File f) { // Метод установки времени для арены

        YamlConfiguration config = YamlConfiguration.loadConfiguration(f);
   
        if(config.getConfigurationSection("arenas." + arena.getName()) != null) {
            config.set("arenas." + arena.getName() + ".time", i);
        }
   
        try {
            config.save(f);
            config.load(f);
        } catch(Exception e1) {
            e1.printStackTrace();
        }
    }

    public static void setSpawn(Location loc, Arena arena, File f) { // Метод установки локации спавна

        YamlConfiguration config = YamlConfiguration.loadConfiguration(f);
   
        String name = arena.getName();
   
        if(config.getConfigurationSection("arenas." + arena.getName()) != null) { // Есть такая секция? Далее разбиваем локацию на мир, x, y ,z.
            config.set("arenas." + name + ".spawn.loc.world", arena.getSpawn().getWorld().getName());
            config.set("arenas." + name + ".spawn.loc.x", arena.getSpawn().getX());
            config.set("arenas." + name + ".spawn.loc.y", arena.getSpawn().getY());
            config.set("arenas." + name + ".spawn.loc.z", arena.getSpawn().getZ());
        }
   
        try {
            config.save(f);
            config.load(f);
        } catch(Exception e1) {
            e1.printStackTrace();
        }
    }

    public static void setLobby(Location loc, Arena arena, File f) { // Метод установки локации лобби

        YamlConfiguration config = YamlConfiguration.loadConfiguration(f);
   
        String name = arena.getName();
   
        if(config.getConfigurationSection("arenas." + arena.getName()) != null) { // Есть такая секция? Далее разбиваем локацию на мир, x, y ,z.
            config.set("arenas." + name + ".lobby.loc.world", arena.getLobby().getWorld().getName());
            config.set("arenas." + name + ".lobby.loc.x", arena.getLobby().getX());
            config.set("arenas." + name + ".lobby.loc.y", arena.getLobby().getY());
            config.set("arenas." + name + ".lobby.loc.z", arena.getLobby().getZ());
        }
   
        try {
            config.save(f);
            config.load(f);
        } catch(Exception e1) {
            e1.printStackTrace();
        }
    }

    public static void setEnd(Location loc, Arena arena, File f) { // Метод установки локации конца игры

        YamlConfiguration config = YamlConfiguration.loadConfiguration(f);
   
        String name = arena.getName();
   
        if(config.getConfigurationSection("arenas." + arena.getName()) != null) { // Есть такая секция? Далее разбиваем локацию на мир, x, y ,z.
            config.set("arenas." + name + ".end.loc.world", arena.getEnd().getWorld().getName());
            config.set("arenas." + name + ".end.loc.x", arena.getEnd().getX());
            config.set("arenas." + name + ".end.loc.y", arena.getEnd().getY());
            config.set("arenas." + name + ".end.loc.z", arena.getEnd().getZ());
        }
   
        try {
            config.save(f);
            config.load(f);
        } catch(Exception e1) {
            e1.printStackTrace();
        }
    }

}

С классом ArenaUtil закончили! Теперь арены можно сохранять, и не бояться за потерю данных.

Теперь мы сделаем команды для арен! Класс GameTeam для этого и создан.

Java:
package me.belka.energyapi;

import java.util.ArrayList;
import java.util.List;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;

public class GameTeam extends TeamManager {

    private List<String> teamPlayers = new ArrayList<>(); // Список игроков в команде
    private ChatColor color; // Цвет, который будет у игрока над головой
    private String name; // Имя команды
    private Arena arena; // Арена, в которой будет эта команда
 
    public GameTeam(String name, ChatColor color, Arena arena) { // Метод создания команды, затронем его в TeamManager
        this.name = name;
        this.color = color;
        this.arena = arena;
    }
 
    public String getName() { // Возвращает имя команды
        return name;
    }
 
    public void setName(String name) { // Устанавливает имя команды
        this.name = name;
    }

    public ChatColor getColor() { // Возвращает цвет команды... Дальше все понятно, все так же.
        return color;
    }

    public void setColor(ChatColor color) {
        this.color = color;
    }

    public List<String> getTeamPlayers() {
        return teamPlayers;
    }

    public void setTeamPlayers(List<String> teamPlayers) {
        this.teamPlayers = teamPlayers;
    }

    public Arena getArena() {
        return arena;
    }

    public void setArena(Arena arena) {
        this.arena = arena;
    }
 
    public void sendMessage(String msg) { // Утилита отсылки сообщения команде
        for(String players : teamPlayers) {
            Bukkit.getPlayer(players).sendMessage(msg);
        }
    }
 
    public boolean isFull() { // Утилита проверки - полная ли команда?
        if(teamPlayers.size() >= (arena.getPlayers().size() / 2)) {
            return true;
        }
        return false;
    }
 
}

Теперь приступим к классу TeamManager
 
Последнее редактирование:
тыц. Здесь был тутор, теперь он наверху.
 
Последнее редактирование:
Как я и обещал... Туториал каркасов для мини игры!

2. МИНИ ИГРА (1)

На самом деле, писать мини игру не так уж и сложно. Нужны просто вспомогательные классы. В первой части о написании мини игр, я напишу код класса Arena, ArenaManager, и ArenaUtil (класс, добавленный мной, для хранения арен). Класс Arena будет служить для нас чуть ли не основой плагина. Начнем с него.

Что такое арена, думаю знают многие (в смысле MineCraft).
У арены должно быть имя, минимальное кол-во игроков, для ее старта, максимальное кол-во игроков, List<String> с именами игроков, которые есть на арене, List<String> с ожидающими, булевское значение "в игре", время арены, и три локации - лобби, спавн, и локация конца игры.

Начнем, наш класс арены:
Java:
package me.belka.energyapi;

import java.util.ArrayList;
import java.util.List;

import org.bukkit.Bukkit;
import org.bukkit.Location;

public class Arena extends ArenaManager {

    private List<String> players = new ArrayList<>(); // Лист с игроками
    private int time; // Время арены
    private int start; // Кол-во игроков для старта
    private int max; // Максимальное кол-во игроков
    private String name; // Имя арены
    private Location spawn, lobby, end; // Локации
    private List<String> waiters = new ArrayList<>(); // Лист с ожидающими
    private boolean inGame; // Булевское значение - в игре
  
    public Arena(String name, String prefix, 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;
        this.prefix = prefix;
    } // Функция для создания арены. Для этого нам потребуются некоторые аргументы. Чтобы создать арену, нам нужно будет сделать переменную арены типа этой: Arena a = new Arena(...); , и затем пользоваться ей, но так арену мы создавать не будем, будем создавать ее через ArenaManager, об этом чуть позже
  
    public List<String> getPlayers() { // Метод getPlayers() возвращает лист игроков, который можно изменять.
        return players;
    }

    public int getTime() {// Метод getTime() возвращает время арены
        return time;
    }

    public void setTime(int time) { // Установка времени
        this.time = time;
    }

    public int getStart() { // Возвращает кол-во игроков для старта
        return start;
    }

    public void setStart(int start) { // Установка кол-ва игроков для старта
        this.start = start;
    }

    public int getMax() { // Возвращает кол-во макс. игроков
        return max;
    }

    public void setMax(int max) { // Установка числа макс. игроков
        this.max = max;
    }

    public String getName() { // Возвращает имя
        return name;
    }

    public void setName(String name) { // Установка имени
        this.name = name;
    }

    public Location getSpawn() { // Возвращает локацию спавна
        return spawn;
    }

    public void setSpawn(Location spawn) { // Установка локации спавна
        this.spawn = spawn;
    }

    public Location getLobby() { // Возвращает локацию лобби
        return lobby;
    }

    public void setLobby(Location lobby) { // Установка локации лобби
        this.lobby = lobby;
    }

    public Location getEnd() { // Возвращает локацию конца игры
        return end;
    }

    public void setEnd(Location end) { // Установка локации конца игры
        this.end = end;
    }
  
    public boolean isFull() { // Булевское значение, которое проверяет, полная ли арена
        if (players.size() >= max) {
        return true;
        } else {
        return false;
        }
    }
  
    public void sendMessage(String msg) { // Отсылка сообщения всем игрокам в арене
        for(String str : players) {
            Bukkit.getPlayer(str).sendMessage(msg);
        }
    }

    public boolean isInGame() { // Проверка, в игре ли арена
        return inGame;
    }

    public void setInGame(boolean inGame) { // Установка булевского значения "в игре"
        this.inGame = inGame;
    }
  
}

И теперь следующий класс, ArenaManager

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

Java:
package me.belka.energyapi;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;

public class ArenaManager {
  
    private static ArenaManager am = new ArenaManager();
    public List<Arena> arenas = new ArrayList<>();
    public HashMap<String, Integer> cooldownTime = new HashMap<>();
    public HashMap<String, BukkitRunnable> cooldownTask = new HashMap<>();
   
    public static ArenaManager getManager() { // Для того, чтобы использовать менеджер.
        return am;
    }
  
    public void addPlayer(Player p, Arena arena) { // Добавление игрока в арену
        if(arena == null) { // Проверка, существует ли арена
            p.sendMessage("§cNo arena!");
            return;
        }
          
        if(arena.isFull()) { // А она не заполнена?
            p.sendMessage(arena.getPrefix() +  "Arena is full!");
            return;
        }
      
        if(arena.isInGame()) { // А если она в игре?
            p.sendMessage(arena.getPrefix() + "Arena is already in game!");
            return;
        }
      
        p.setHealth(p.getMaxHealth()); // Лечим игрока
        p.setFireTicks(0); // Еще лечим
      
        p.teleport(arena.getLobby()); // Телепорт игрока в лобби
      
        arena.getPlayers().add(p.getName()); // Добавляем игрока к игрокам на арене
      
        int playersLeft = arena.getStart() - arena.getPlayers().size(); // Кол-во игроков минимум - кол-во игроков на арене
      
        if (playersLeft == 0) { // Если это число == 0, то старт арены
        startArena(arena);
        }
      
    }
  
    @SuppressWarnings("deprecation")
    public void startArena(final Arena arena) { // Метод старта арены. Пока тут остановлюсь в комментариях, допишу чуть позже
      
        // TODO: Доделать описание
        if(arena.getPlayers() != null)
        arena.sendMessage(arena.getPrefix() + "Game starts in 30 seconds!");
      
        cooldownTime.put(arena.getName() + "_start", 30);
      
        cooldownTask.put(arena.getName() + "_start", new BukkitRunnable() {
                public void run() {
                      if(cooldownTime.get(arena.getName() + "_start") != null && cooldownTime.get(arena.getName() + "_start") == 0) {
                        this.cancel();
                          cooldownTime.remove(arena.getName() + "_start");
                          cooldownTask.remove(arena.getName() + "_start");
                        
                          arena.sendMessage(arena.getPrefix() + "Game have been started, PVP will enable in 5 seconds!");
                        
                          for(String str : arena.getPlayers()) {
                              Player pl = Bukkit.getPlayer(str);
                            
                            pl.teleport(arena.getSpawn());
                          
                            arena.setInGame(true);
                            arena.getWaiters().clear();
                          
                            arena.setInGame(true);
                          }
                        
                          Bukkit.getScheduler().scheduleSyncDelayedTask(EnergyAPI.getAPI(), new Runnable() {

                            public void run() {
                                arena.getNoDamageable().clear();
                                arena.sendMessage(arena.getPrefix() + "YEAH! THE GAME HAVE BEEN STARTED!");
                            }
                            
                          }, 100L);
                        
                        }
                  
                      if (cooldownTime.get(arena.getName() + "_start") != null && cooldownTime.get(arena.getName() + "_start") <= 10 && cooldownTime.get(arena.getName() + "_start") != 0) {
                        arena.sendMessage(arena.getPrefix() + "Game starts in " + cooldownTime.get(arena.getName() + "_start") + "...");
                      }
                      if(cooldownTime.get(arena.getName() + "_start") != null) {
                        cooldownTime.put(arena.getName() + "_start", cooldownTime.get(arena.getName() + "_start") - 1);
                      }
                      }
        });
      
        Bukkit.getScheduler().scheduleSyncDelayedTask(EnergyAPI.getAPI(), new Runnable() {

            public void run() {
                endArena(arena);
            }
          
        }, arena.getTime() * 20);
      
    }
  
    public void endArena(Arena arena) {
        if(arena == null) {
            return;
        }
      
        if(arena.getPlayers() != null) {
            arena.sendMessage(arena.getPrefix() + "The end of the game!");
          
            arena.setInGame(false);
          
            Iterator<String> players = arena.getPlayers().iterator();
            while(players.hasNext())
            {
            String str = players.next();
          
            @SuppressWarnings("deprecation")
            Player p = Bukkit.getPlayer(str);
          
            players.remove();
            p.setFoodLevel(20);
            p.setHealth(p.getMaxHealth());
            p.setFireTicks(0);
            EnergyAPI.am.removePlayer(p);
          
            p.teleport(arena.getEnd());
          
            }
        }
    }

    public void removePlayer(Player p) {
      
        for(Arena arena : arenas) {
      
        if (arena == null) {
            p.sendMessage("§cNo arena!");
            return;
        }
           
            if(arena.getPlayers().contains(p.getName())) {
           
            p.setHealth(p.getMaxHealth());
            p.setFireTicks(0);
          
            p.teleport(arena.getEnd());
           
            arena.getPlayers().remove(p.getName());
           
            arena.sendMessage(arena.getPrefix() + p.getName() + " left the game! §6" + arena.getPlayers().size() + "§4/§6" + arena.getMax());
          
            if(arena.getPlayers().size() <= 1) {
                endArena(arena);
            }
          
            }
        }  
    }
  
    public void registerNewArena(String name, String prefix, int time, int start, int max, Location spawn, Location lobby, Location end) {
        Arena arena = new Arena(name, prefix, time, start, max, spawn, lobby, end);
      
        arenas.add(arena);
    }
  
    public boolean isInGame(Player p) {
        for(Arena a : arenas) {
            if(a.getPlayers().contains(p.getName())) {
                return true;
            }
        }
        return false;
    }
  
    public boolean isWaiter(Player p) {
        for(Arena a : arenas) {
            if(a.getWaiters().contains(p.getName())) {
                return true;
            }
        }
        return false;
    }
  
    public boolean hasPlayerInGame(Arena arena, Player p) {
        if(arena.getPlayers().contains(p.getName()) && !arena.getWaiters().contains(p.getName())) {
            return true;
        }
        return false;
    }
  
    public boolean hasWaiter(Arena arena, Player p) {
        if(!arena.getPlayers().contains(p.getName()) && arena.getWaiters().contains(p.getName())) {
            return true;
        }
        return false;
    }
  
    public boolean isInArena(Player p, Arena arena) {
        if(arena.getPlayers().contains(p.getName()) || arena.getWaiters().contains(p.getName())) {
            return true;
        }
        return false;
    }
  
    public Arena getArena(String name) {
        for(Arena a : arenas) {
            if(a.getName().equalsIgnoreCase(name)) {
                return a;
            }
        }
        return null;
    }
  
    public Arena getPlayingArena(Player p) {
        for(Arena a : arenas) {
            if(a.getPlayers().contains(p.getName())) {
                return a;
            }
        }
        return null;
    }
  
    public void removeArena(Arena arena) {
        if(arena != null) {
            arenas.remove(arena);
        }
    }
  
}
Молодец!
 
УХУХУХУХУХХУ, Ну ты меня и вдохновил, всеее, парень, держись, там около 7-9 классов :D

P.S. Все они по существу написаны.
Ты же вроде Старожил, перемести все туторы в первое и второе сообщение, чтобы красивее было.
 
Ты же вроде Старожил, перемести все туторы в первое и второе сообщение, чтобы красивее было.
Допишу тутор по мини игре, и сделаю. Я вот тоже сначала думал делать резервы, но потом передумал. Ну что ж, чего людя хотят, то и сделаю.
 
Мини игры очень полезный тутор :good:
Здешние туторы == Туторы собранные с форумов баккита мной, и переведенные на русский язык. Следующий тутор будет про дизгайзы.
Здешний тутор перекочевал на верх.
 
Последнее редактирование:
Как это бы мне это разбросать на сервере на миры? Жду тутора мини-игр с использованием Multiverse API (каждая арена в своём мире, выгрузка мира из памяти по окончанию раунда и регенерация арены)
 
Как это бы мне это разбросать на сервере на миры? Жду тутора мини-игр с использованием Multiverse API (каждая арена в своём мире, выгрузка мира из памяти по окончанию раунда и регенерация арены)
Тут все просто (без регенерации арены, прост я пока хз как сделать.) - Берешь, создаешь миры, и в них ставишь локацию лобби, спавна, и еще где-нибудь локацию конца игры. Поддержка разных миров у арен есть.
 
config.set("arenas." + name + ".spawn.loc.world", arena.getSpawn().getWorld().getName());
config.set("arenas." + name + ".spawn.loc.x", arena.getSpawn().getX());
config.set("arenas." + name + ".spawn.loc.y", arena.getSpawn().getY());
config.set("arenas." + name + ".spawn.loc.z", arena.getSpawn().getZ());

config.set("arenas." + name + ".lobby.loc.world", arena.getLobby().getWorld().getName());
config.set("arenas." + name + ".lobby.loc.x", arena.getLobby().getX());
config.set("arenas." + name + ".lobby.loc.y", arena.getLobby().getY());
config.set("arenas." + name + ".lobby.loc.z", arena.getLobby().getZ());

config.set("arenas." + name + ".end.loc.world", arena.getEnd().getWorld().getName());
config.set("arenas." + name + ".end.loc.x", arena.getEnd().getX());
config.set("arenas." + name + ".end.loc.y", arena.getEnd().getY());
config.set("arenas." + name + ".end.loc.z", arena.getEnd().getZ());

config.set("arenas." + name + ".time", arena.getTime());
config.set("arenas." + name + ".start", arena.getStart());
config.set("arenas." + name + ".max", arena.getMax());
хреновый, очень хреновый пример.
Подобные вещи надо выносить в методы.
Код:
public Location getLocationFromConfig(String path){
     return getLocationFromCustomConfig(this.getConfig(), path);
   }
   
   public Location getLocationFromCustomConfig(FileConfiguration file, String path){
     if(!file.contains(path)) return null;
     return new Location(Bukkit.getWorld(file.getString(path+".world")),
         file.getInt(path+".x"),
         file.getInt(path+".y"),
         file.getInt(path+".z"));
   }
   
   public void writeLocationToConfig(String path, Location loc){
     writeLocationToCustomConfig(this.getConfig(), path, loc);
   }
   
   public void writeLocationToCustomConfig(FileConfiguration file, String path, Location loc){
     if(loc == null){
       this.getConfig().set(path, null);
       return;
     }
     file.set(path+".world", loc.getWorld().getName());
     file.set(path+".x", loc.getBlockX());
     file.set(path+".y", loc.getBlockY());
     file.set(path+".z", loc.getBlockZ());
   }
p.s. здесь я пренебрёг проверкой на существование мира, указанного в конфиге, так как плагин, из которого часть кода, я делал для себя, и там я знал, что
неправильных входных данных быть не может.
 
хреновый, очень хреновый пример.
Подобные вещи надо выносить в методы.
Код:
public Location getLocationFromConfig(String path){
     return getLocationFromCustomConfig(this.getConfig(), path);
   }
  
   public Location getLocationFromCustomConfig(FileConfiguration file, String path){
     if(!file.contains(path)) return null;
     return new Location(Bukkit.getWorld(file.getString(path+".world")),
         file.getInt(path+".x"),
         file.getInt(path+".y"),
         file.getInt(path+".z"));
   }
  
   public void writeLocationToConfig(String path, Location loc){
     writeLocationToCustomConfig(this.getConfig(), path, loc);
   }
  
   public void writeLocationToCustomConfig(FileConfiguration file, String path, Location loc){
     if(loc == null){
       this.getConfig().set(path, null);
       return;
     }
     file.set(path+".world", loc.getWorld().getName());
     file.set(path+".x", loc.getBlockX());
     file.set(path+".y", loc.getBlockY());
     file.set(path+".z", loc.getBlockZ());
   }
p.s. здесь я пренебрёг проверкой на существование мира, указанного в конфиге, так как плагин, из которого часть кода, я делал для себя, и там я знал, что
неправильных входных данных быть не может.
Ну что ж, это лично мой метод записи данных. Вы можете изменять код, так, как Вам угодно. Я даю вам исходники, и вы делаете с ними все, что хотите ;)
 
Хороший тутор. Мне нравится :)
 
Перевод с Bukkit Forums? :rolleyes:
Я там для себя такой же почти что откопал :D
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх