1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем Invokers, 31 июл 2022.

Статус темы:
Закрыта.
  1. Автор темы
    Invokers

    Invokers Новичок Пользователь

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

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

    Или можно сделать лучше?
     
  2. Sturm_PT

    Sturm_PT Активный участник Пользователь

    Баллы:
    76
    Так а в чём вопрос-то? Ну создай класс комнаты и храни это всё там
     
  3. Автор темы
    Invokers

    Invokers Новичок Пользователь

    Баллы:
    6
    Как правильно добавлять игроков в эти "комнаты" а также как их там хранить
    и что на счёт не мульти игр

    ну и как правильно хранить эти "комнаты"
     
  4. Sturm_PT

    Sturm_PT Активный участник Пользователь

    Баллы:
    76
    Код:
    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);
      }
    }
    
     
  5. Автор темы
    Invokers

    Invokers Новичок Пользователь

    Баллы:
    6
    Спасибо
     
  6. Автор темы
    Invokers

    Invokers Новичок Пользователь

    Баллы:
    6
    Вопрос, если комнаты 2-3, то как выбрать 1 из них? Хранить в хэш мапе? потом оттуда доставать?
     
  7. Sturm_PT

    Sturm_PT Активный участник Пользователь

    Баллы:
    76
    p.s. ещё сохраняй мапу с игроком и комнатой в каком-нибудь листенере и удаляй игрока из комнаты при выходе
     
  8. Sturm_PT

    Sturm_PT Активный участник Пользователь

    Баллы:
    76
    Ага
     
  9. Автор темы
    Invokers

    Invokers Новичок Пользователь

    Баллы:
    6
    Долго сидел и так не нашёл решения как сохранить и выгрузить мапу
     
  10. Sturm_PT

    Sturm_PT Активный участник Пользователь

    Баллы:
    76
    Описывай проблему подробнее.
    Тебе надо выгрузить мапу в конфиг?
     
  11. Автор темы
    Invokers

    Invokers Новичок Пользователь

    Баллы:
    6
    Извини, да, Мне над выгружать мапу в конфиг, и загружать, но мой опыт работы с мапой равен 0, так что я не особо разбираюсь с ней
     
  12. Sturm_PT

    Sturm_PT Активный участник Пользователь

    Баллы:
    76
    YamlConfiguration y = YamlConfiguration.loadConfiguration(my_file)
    myMap.forEach((k,l) - > y.set(k, l)) ;
    y.save(my_file);
    Если в мапе есть не строки - придумай, как представить объект как строку.
    У save() лови IOException
     
  13. Автор темы
    Invokers

    Invokers Новичок Пользователь

    Баллы:
    6
    Ещё раз доброе время, застрял или так сказать встал в тупил, пытаюсь выгрузить мапу (В 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" то телепортация в лобби
                            }
                        }
                    }
    И тут ещё вопрос возникает если "Игрок" ввёл всё правильно то как его телепортировать допустим на минимальную точку установленную на Арене
     
  14. DestKoder

    DestKoder Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    DestKoder

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

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

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

    Invokers Новичок Пользователь

    Баллы:
    6
    ааа, спасибо за ответы, но сколько сижу ещё не могу понять как делать эти арены и тому подобное.

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

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

    Код:
    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 и туда потом телепортировать (вызвать по геттеру)
     
  16. OJIEKCAHDP

    OJIEKCAHDP Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    OJIEKCAHDP
    Чем меньше знаешь язык на котором пишешь, - тем дурнее код пишешь, - тем больше проблем в итоге.
    Храни себе в конфиге арены и их значения, через код создавай. Если смысла особого с конфига нет - создавай напрямую через код, при запуске.
    Тут скорее вопрос не как создавать арены, а как значения с конфигов получать.
     
  17. Автор темы
    Invokers

    Invokers Новичок Пользователь

    Баллы:
    6
    И так всё дошло до того что при загрузки мапы из конфига я сделал так, отсюда у меня появилась мысль что я вообще не использую мапу а просто общаюсь с конфигом, есть другие варианты выгрузки из конфига?
    Код:
        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();
            }
        }
     
  18. OJIEKCAHDP

    OJIEKCAHDP Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    OJIEKCAHDP
    А что не так? Нормально же всё.
     
  19. Автор темы
    Invokers

    Invokers Новичок Пользователь

    Баллы:
    6
    Думал есть другие варианты
     
  20. Автор темы
    Invokers

    Invokers Новичок Пользователь

    Баллы:
    6
    Оставил пока так и да, пока работает то хорошо, но возник вопрос я проверял другие методы сохранения мапы в кофниг и столкнулся с проблемой что в конфиге сохраняется вот так
    Код:
    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;
    }
        }
     

    Вложения:

Статус темы:
Закрыта.

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