- Баллы
- 153
МИНИ ИГРА
На самом деле, писать мини игру не так уж и сложно. Нужны просто вспомогательные классы. В первой части о написании мини игр, я напишу код класса Arena, ArenaManager, и ArenaUtil (класс, добавленный мной, для хранения арен). Класс Arena будет служить для нас чуть ли не основой плагина. Начнем с него.
Что такое арена, думаю знают многие (в смысле MineCraft).
У арены должно быть имя, минимальное кол-во игроков, для ее старта, максимальное кол-во игроков, List<String> с именами игроков, которые есть на арене, List<String> с ожидающими, булевское значение "в игре", время арены, и три локации - лобби, спавн, и локация конца игры.
Начнем, наш класс арены:
И теперь следующий класс, ArenaManager
С помощью него можно будет добавлять игроку в арену, удалять его оттуда, делать что либо с ареной, и т.д.
Так как с каждой перезагрузкой сервера каждый List любого типа в плагине очищается, и арена перестает существовать, то нам понадобится хранить арену в конфигурационном файле. Этю плюшку я для вас тоже приготовил :3
И так, наш код, с идеальными комментариями будет ниже, т.к. Admin запретил больше 15 КК символов в сообщении :3
На самом деле, писать мини игру не так уж и сложно. Нужны просто вспомогательные классы. В первой части о написании мини игр, я напишу код класса 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
Последнее редактирование модератором:
Ну что ж, могу написать туториал, как сделать простую мини игру,


