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

Помогите Разработка мини игры, Создание арен и т.д

Метки:
Теги Теги
1.12.2 мини игры
Статус
Закрыто для дальнейших ответов.

Invokers

Новичок
Пользователь
Баллы
6
Всем доброго времени, решил написать мини игру, но столкнулся с проблемой, суть после того как Игрок заходит в лобби, над создать "Комнату" к которой подключаются ещё 2-3 игрока, как я думаю сделать.

Записывать конфиг "Комнаты"
Записывать в него игроков которые заходят, при нужном колл-во игроков запускать "Комнату"

Или можно сделать лучше?
 
Так а в чём вопрос-то? Ну создай класс комнаты и храни это всё там
 
Как правильно добавлять игроков в эти "комнаты" а также как их там хранить
и что на счёт не мульти игр

ну и как правильно хранить эти "комнаты"
 
Код:
public class Room {
  private int size = 12;
  private Set<Player> players = new HashSet<>();
  private Game game;//твой класс с игрой

  public boolean addPlayer(Player p) {
    if (players.size == size || players.contains(p)) return false;
    return players.add(p);
  }

  public void run() {
    game.run(players);
  }
}
 
Вопрос, если комнаты 2-3, то как выбрать 1 из них? Хранить в хэш мапе? потом оттуда доставать?
 
p.s. ещё сохраняй мапу с игроком и комнатой в каком-нибудь листенере и удаляй игрока из комнаты при выходе
 
Долго сидел и так не нашёл решения как сохранить и выгрузить мапу
 
Извини, да, Мне над выгружать мапу в конфиг, и загружать, но мой опыт работы с мапой равен 0, так что я не особо разбираюсь с ней
 
Извини, да, Мне над выгружать мапу в конфиг, и загружать, но мой опыт работы с мапой равен 0, так что я не особо разбираюсь с ней
YamlConfiguration y = YamlConfiguration.loadConfiguration(my_file)
myMap.forEach((k,l) - > y.set(k, l)) ;
y.save(my_file);
Если в мапе есть не строки - придумай, как представить объект как строку.
У save() лови IOException
 
Ещё раз доброе время, застрял или так сказать встал в тупил, пытаюсь выгрузить мапу (В ArrayList) но не особо получается на выходе получаю пустой массив.


Код:
public class SetCordArena implements Listener {

    public static HashMap<String, Location> loc_arena = new HashMap<String, Location>();

    @EventHandler
    public void SetCord(PlayerInteractEvent event) {
        Block block= event.getClickedBlock();
        Player p = event.getPlayer();
        ItemStack item = p.getItemInHand();
        if(item.getType() == ColorControlItem.ItemArena().getType()) {
            boolean RIGHT = event.getAction().equals(Action.RIGHT_CLICK_BLOCK);
            boolean LEFT = event.getAction().equals(Action.LEFT_CLICK_BLOCK);
            if (LEFT == true) {
                event.setCancelled(true);
                block.setType(Material.BEDROCK);
                int x = block.getX();
                int y = block.getY();
                int z = block.getZ();
                loc_arena.put("LEFT",new Location(p.getWorld(), x, y, z));
                p.sendMessage("Кордината первая установлена ");
                saveHashMap();
            }
            if (RIGHT == true) {
                block.setType(Material.BEDROCK);
                int x = block.getX();
                int y = block.getY();
                int z = block.getZ();
                loc_arena.put("RIGHT",new Location(p.getWorld(), x, y, z));
                p.sendMessage("Кордината вторая установлена ");
                saveHashMap();
            }



        }


    }



    public static void saveHashMap(){
        try {
            YamlConfiguration cfg = new YamlConfiguration();
            for (String key : loc_arena.keySet()){
                cfg.set(key, loc_arena.get(key));
            }
            File f = new File ("plugins/ColorControl","hashmap.yml");
            if (f.exists()) f.delete();
            cfg.save(f);
        } catch (Exception e){
            e.printStackTrace();
        }
    }

    public static void loadHashMap(){
        try {
            YamlConfiguration cfg = new YamlConfiguration();
            File f = new File ("plugins/ColorControl","hashmap.yml");
            loc_arena.clear();
            if (f.exists()) {
                cfg.load(f);
                Set<String> keys = cfg.getKeys(false);
                if (keys.size()>0)
                    for (String key : keys)
                        loc_arena.put(key, (Location) cfg.get(key));
            }
        } catch (Exception e){
            e.printStackTrace();
        }
    }

Да тут мапу можно было и не сохранять но я для проверка сохранения и выгрузки проверял на позициях точки 1 и 2

Код:
if (args[0].equalsIgnoreCase("CreateArena"))
                {
                    if (args[1] != null) {
                        if (SetCordArena.loc_arena.isEmpty()) {
                            player.sendMessage("Установите кординаты /cc ItemArena");
                        } else {
                            Location min = (Location) SetCordArena.loc_arena.get("LEFT");
                            Location max = (Location) SetCordArena.loc_arena.get("RIGHT");
                            Bukkit.broadcastMessage(args[1]);
                            Arena.put(args[1], new CreateArena(args[1], min, max, 1, 2, 180, player.getWorld().getName()) );
                            saveHM();
                        }
                    }
                }

Команда создание арены которая "вроде" как работает нормально

Код:
                if (args[0].equalsIgnoreCase("JoinArena"))
                {
                    if (args.length < 2) {
                        loadHM();
                        Set<String> keys = Arena.keySet();
                        ArrayList<String> key = new ArrayList<>(Arena.keySet());
                        player.sendMessage("Выбери арену "+keys);
 //Тут проверяется на пустоту args[1] если пусто то "должен быть список арен"
                    } else {
                        if(!Arena.containsKey(args[1])) {
                        //Если он ввёл "/cc JoinArena Test" то телепортация в лобби
                        }
                    }
                }

И тут ещё вопрос возникает если "Игрок" ввёл всё правильно то как его телепортировать допустим на минимальную точку установленную на Арене
 
Ещё раз доброе время, застрял или так сказать встал в тупил, пытаюсь выгрузить мапу (В ArrayList) но не особо получается на выходе получаю пустой массив.


Код:
public class SetCordArena implements Listener {

    public static HashMap<String, Location> loc_arena = new HashMap<String, Location>();

    @EventHandler
    public void SetCord(PlayerInteractEvent event) {
        Block block= event.getClickedBlock();
        Player p = event.getPlayer();
        ItemStack item = p.getItemInHand();
        if(item.getType() == ColorControlItem.ItemArena().getType()) {
            boolean RIGHT = event.getAction().equals(Action.RIGHT_CLICK_BLOCK);
            boolean LEFT = event.getAction().equals(Action.LEFT_CLICK_BLOCK);
            if (LEFT == true) {
                event.setCancelled(true);
                block.setType(Material.BEDROCK);
                int x = block.getX();
                int y = block.getY();
                int z = block.getZ();
                loc_arena.put("LEFT",new Location(p.getWorld(), x, y, z));
                p.sendMessage("Кордината первая установлена ");
                saveHashMap();
            }
            if (RIGHT == true) {
                block.setType(Material.BEDROCK);
                int x = block.getX();
                int y = block.getY();
                int z = block.getZ();
                loc_arena.put("RIGHT",new Location(p.getWorld(), x, y, z));
                p.sendMessage("Кордината вторая установлена ");
                saveHashMap();
            }



        }


    }



    public static void saveHashMap(){
        try {
            YamlConfiguration cfg = new YamlConfiguration();
            for (String key : loc_arena.keySet()){
                cfg.set(key, loc_arena.get(key));
            }
            File f = new File ("plugins/ColorControl","hashmap.yml");
            if (f.exists()) f.delete();
            cfg.save(f);
        } catch (Exception e){
            e.printStackTrace();
        }
    }

    public static void loadHashMap(){
        try {
            YamlConfiguration cfg = new YamlConfiguration();
            File f = new File ("plugins/ColorControl","hashmap.yml");
            loc_arena.clear();
            if (f.exists()) {
                cfg.load(f);
                Set<String> keys = cfg.getKeys(false);
                if (keys.size()>0)
                    for (String key : keys)
                        loc_arena.put(key, (Location) cfg.get(key));
            }
        } catch (Exception e){
            e.printStackTrace();
        }
    }

Да тут мапу можно было и не сохранять но я для проверка сохранения и выгрузки проверял на позициях точки 1 и 2

Код:
if (args[0].equalsIgnoreCase("CreateArena"))
                {
                    if (args[1] != null) {
                        if (SetCordArena.loc_arena.isEmpty()) {
                            player.sendMessage("Установите кординаты /cc ItemArena");
                        } else {
                            Location min = (Location) SetCordArena.loc_arena.get("LEFT");
                            Location max = (Location) SetCordArena.loc_arena.get("RIGHT");
                            Bukkit.broadcastMessage(args[1]);
                            Arena.put(args[1], new CreateArena(args[1], min, max, 1, 2, 180, player.getWorld().getName()) );
                            saveHM();
                        }
                    }
                }

Команда создание арены которая "вроде" как работает нормально

Код:
                if (args[0].equalsIgnoreCase("JoinArena"))
                {
                    if (args.length < 2) {
                        loadHM();
                        Set<String> keys = Arena.keySet();
                        ArrayList<String> key = new ArrayList<>(Arena.keySet());
                        player.sendMessage("Выбери арену "+keys);
 //Тут проверяется на пустоту args[1] если пусто то "должен быть список арен"
                    } else {
                        if(!Arena.containsKey(args[1])) {
                        //Если он ввёл "/cc JoinArena Test" то телепортация в лобби
                        }
                    }
                }

И тут ещё вопрос возникает если "Игрок" ввёл всё правильно то как его телепортировать допустим на минимальную точку установленную на Арене


По поводу вопроса о телепортации - просто храни эту точку в файле арены.

По поводу пустого массива, не совсем понимаю в каком месте кода ты его получаешь? Сохранение и выгрузка мапы у тебя записана в целом корректно.

Так же как замечание, не совсем правильно джойнить игрока по конфиг файлу к арене, правильней было бы её изначально загрузить и создать, а потом уже присоединять игроков.
 
ааа, спасибо за ответы, но сколько сижу ещё не могу понять как делать эти арены и тому подобное.

Как выглядит в голове:

Создавать арену по выделенным координатам.
то есть

Код:
new CreateArena(Test, minLocation, maxLocation, minPlayer, maxPlayer, timegame, World)


Получается что создаём класс который будет это всё обрабатывать.

Код:
public class CreateArena implements Listener
{

    private Location min;
    private Location max;
    private String name;
    private int minPlayer;
    private int maxPlayer;
    private int time;
    private String world;

    public CreateArena(String name, Location min, Location max, int minPlayer, int maxPlayer, int time, String world)
    {
       this.setMin(min);
       this.setMax(max);
       this.setName(name);
       this.setMinPlayer(minPlayer);
       this.setMaxPlayer(maxPlayer);
       this.setTime(time);
       this.setWorld(world);
    }

    public Location getMin() {
        return min;
    }

    public void setMin(Location min) {
        this.min = min;
    }

    public Location getMax() {
        return max;
    }

    public void setMax(Location max) {
        this.max = max;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getMinPlayer() {
        return minPlayer;
    }

    public void setMinPlayer(int minPlayer) {
        this.minPlayer = minPlayer;
    }

    public int getMaxPlayer() {
        return maxPlayer;
    }

    public void setMaxPlayer(int maxPlayer) {
        this.maxPlayer = maxPlayer;
    }

    public int getTime() {
        return time;
    }

    public void setTime(int time) {
        this.time = time;
    }

    public String getWorld() {
        return world;
    }

    public void setWorld(String world) {
        this.world = world;
    }
}

И от сюда начинаются осложнения, можно же сделать сохранение через сейф мапы, но можно и просто в файл прописывать а потом сохранить файл, столкнулся с проблемой если создать 2-3 арену, обновить сервер то файл с аренами отчищается.

А так же на счёт преобразования мапы в лист, я поискал и не особо думаю что так можно эт делать

Код:
    Set<String> keySet = Arena.keySet();
                        ArrayList<String> listOfKeys = new ArrayList<String>(keySet);
                       System.out.println(listOfKeys);


Про телепортация игрока думаю добавить переменную
Location LobbyArena и туда потом телепортировать (вызвать по геттеру)
 
Чем меньше знаешь язык на котором пишешь, - тем дурнее код пишешь, - тем больше проблем в итоге.
Храни себе в конфиге арены и их значения, через код создавай. Если смысла особого с конфига нет - создавай напрямую через код, при запуске.
Тут скорее вопрос не как создавать арены, а как значения с конфигов получать.
 
И так всё дошло до того что при загрузки мапы из конфига я сделал так, отсюда у меня появилась мысль что я вообще не использую мапу а просто общаюсь с конфигом, есть другие варианты выгрузки из конфига?
Код:
    public void loadHM(){
        try {
            if (fArena.exists()) {
                Arenas.load(fArena);
                    for (String key : Arenas.getKeys(false)) {
                        World world = Bukkit.getWorld(Arenas.getString(key+".world"));
                        Location max = new Location(world, Arenas.getDouble(key+".max.x"), Arenas.getDouble(key+".max.y"), Arenas.getDouble(key+".max.z"));
                        Location min = new Location(world, Arenas.getDouble(key+".min.x"), Arenas.getDouble(key+".min.y"), Arenas.getDouble(key+".min.z"));
                        int minPlayer = Arenas.getInt(key+".minPlayer");
                        int maxPlayer = Arenas.getInt(key+"maxPlayer");
                        int time = Arenas.getInt(key+".time");
                        String status = Arenas.getString(key+".status");
                        Arena.put(key, new CreateArena(key, min, max, minPlayer, maxPlayer, time, world, status));;
                    }



            }
        } catch (Exception e){
            e.printStackTrace();
        }
    }
 
И так всё дошло до того что при загрузки мапы из конфига я сделал так, отсюда у меня появилась мысль что я вообще не использую мапу а просто общаюсь с конфигом, есть другие варианты выгрузки из конфига?
Код:
    public void loadHM(){
        try {
            if (fArena.exists()) {
                Arenas.load(fArena);
                    for (String key : Arenas.getKeys(false)) {
                        World world = Bukkit.getWorld(Arenas.getString(key+".world"));
                        Location max = new Location(world, Arenas.getDouble(key+".max.x"), Arenas.getDouble(key+".max.y"), Arenas.getDouble(key+".max.z"));
                        Location min = new Location(world, Arenas.getDouble(key+".min.x"), Arenas.getDouble(key+".min.y"), Arenas.getDouble(key+".min.z"));
                        int minPlayer = Arenas.getInt(key+".minPlayer");
                        int maxPlayer = Arenas.getInt(key+"maxPlayer");
                        int time = Arenas.getInt(key+".time");
                        String status = Arenas.getString(key+".status");
                        Arena.put(key, new CreateArena(key, min, max, minPlayer, maxPlayer, time, world, status));;
                    }



            }
        } catch (Exception e){
            e.printStackTrace();
        }
    }
А что не так? Нормально же всё.
 
Оставил пока так и да, пока работает то хорошо, но возник вопрос я проверял другие методы сохранения мапы в кофниг и столкнулся с проблемой что в конфиге сохраняется вот так
Код:
Test: !!spokers.colorcontol.events.CreateArena
  max:
    ==: org.bukkit.Location
    world: world
    x: 0.0
    y: 0.0
    z: 0.0
    pitch: 0.0
    yaw: 0.0
  maxPlayer: 0
  min:
    ==: org.bukkit.Location
    world: world
    x: 0.0
    y: 0.0
    z: 0.0
    pitch: 0.0
    yaw: 0.0
  minPlayer: 1
  name: Test
  status: ACTIVE
  time: 180
  world: world

Думаю как эт исправить, но если пользоваться тем что у меня "работает" то можно двигаться дальше

Решил сделать меню с аренами всё хорошо почти, но столкнулся с проблемой, при открытие меню показывается 1 предмет, хотя в конфиге их 2-3

Код:
  public static void ArenaListgui(Player p) {
        Set<String> keys = Utils.Arena.keySet();
        //ArrayList<String> key = new ArrayList<>(Utils.Arena.keySet());
        for (int x = 5; x< keys.size()+7; x++) {
            //ячейка; ячейка меньше чем колл-во ключей+7 (хотя всего 3) можно проще но эт 1 из вариантов проверки
            for (String names : keys) {
                inv.setItem(x, Arenas(Utils.Arena.get(names).getName()+"_1", Utils.Arena.get(names).getStatus()));
            }
        }
        p.openInventory(inv);

public static ItemStack Arenas(String name, String status) {

    int color;
    if (status.equalsIgnoreCase("ACTIVE")){
         color = 5;
   } else {
        color = 14;
    }
    ItemStack Arenas = new ItemStack(Material.WOOL, 1, (short)color);
    ItemMeta Arenas_meta = Arenas.getItemMeta();
    Arenas_meta.setDisplayName(name);
    Arenas.setItemMeta(Arenas_meta);
    return Arenas;
}
    }
 

Вложения:

  • изображение_2022-08-12_042135.png
    изображение_2022-08-12_042135.png
    Размер файла
    32,1 КБ
    Просмотров
    6
  • изображение_2022-08-12_042158.png
    изображение_2022-08-12_042158.png
    Размер файла
    15,1 КБ
    Просмотров
    6
Статус
Закрыто для дальнейших ответов.

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

Назад
Верх