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

[НЕ РЕШЕНО] Локация не сохраняется командой.

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

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

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

    Баллы:
    66
    Имя в Minecraft:
    _X_ZLODEY_X_
    Всем привет, столкнулся с такой проблемой не понимаю в чём причина, никаких ошибок в консоль не выводятся но при этом локация не сохраняется.
    Командой /ffa setspawn - устанавливаю точку на которую будут телепортироваться игроки при входе на арену.
    Код:
                if(args[0].equals("setspawn")) {
                   
                    if(!p.hasPermission("classicffa.setspawn")) {
                        p.sendMessage(" ");
                        p.sendMessage(ChatUtils.format(prefix + "&cYou dont have permission!"));
                        p.sendMessage(" ");
                        return true;
                    }else {
                       
                        Location spawnLocation = p.getLocation();
                        setSpawn(spawnLocation);
                       
                        p.sendMessage(" ");
                        p.sendMessage(ChatUtils.format(prefix + "&eSPAWN &7- &aset location complete!"));
                        p.sendMessage(" ");
                       
                    }
                   
                    return true;
                }

    Метод setSpawn(); в другом классе:
    Код:
        private Location spawn;
    
        public void setSpawn(Location location) {
            this.spawn = location;
        }
    Но почему то не сохраняется локация в 'spawn'
     
  2. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Как ты понял, что "не сохраняется"? Уверен, что при установке и получении локации используется один и тот же объект?
     
  3. Level132331

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

    Баллы:
    66
    Куда должно сохраняться? В кэш, конфиг, бд?
     
  4. Автор темы
    Zlodey_duo

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

    Баллы:
    66
    Имя в Minecraft:
    _X_ZLODEY_X_
    При выполнении другой команды: /ffa join

    Код:
        public void onJoin(UUID id) {
            fileManager = new FileManager();
            kit = new Kit();
            String prefix = ChatUtils.format("&fClassic&bFFA &8> ");
         
            Player p = Bukkit.getServer().getPlayer(id);
            FileConfiguration data = fileManager.getData();
         
            if(this.spawn == null) {
                p.sendMessage(" ");
                p.sendMessage(ChatUtils.format(prefix + "&cТочка спавна не установлена!"));
                p.sendMessage(" ");
                return;
            }
         
            if(this.playersList.contains(id)) {
                p.sendMessage(" ");
                p.sendMessage(ChatUtils.format(prefix + "&cВы уже на арене!"));
                p.sendMessage(" ");
                return;
            }
         
            if(!data.contains(id.toString())) {
                user.createNewProfile(id);
            }
         
            saveInventory(id);
            saveBackLocation(id);
            saveGamemode(id);
         
            clearInventory(id);
            kit.warrior(id);
         
            teleport(id, this.spawn);
         
            p.sendMessage(" ");
            p.sendMessage(ChatUtils.format(prefix + "&aВы успешно вошли на арену!"));
            p.sendMessage(" ");
            return;
        }

    Именно эта строка закрывает доступ далее:
    Код:
            if(this.spawn == null) {
                p.sendMessage(" ");
                p.sendMessage(ChatUtils.format(prefix + "&cТочка спавна не установлена!"));
                p.sendMessage(" ");
                return;
            }


    По поводу уверености, ДА уверен т.к. сохраняемая локация одна под названием 'spawn'
     
  5. Автор темы
    Zlodey_duo

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

    Баллы:
    66
    Имя в Minecraft:
    _X_ZLODEY_X_
    Пока просто находится в коде, далее буду сохранять в конфиг, не уверен что из за этого проблема что сразу не сохраняю в конфиг, он в любом случае должен сохранятся в массив если я правильный термин подобрал.
    Проше говоря в:
    Код:
    private Location spawn;
     
  6. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Ты упомянул, что установка точки спауна и сам метод setSpawn() находятся в разных классах. Но при этом будто бы вызываешь метод текущего класса.

    Всё ещё неясно, как у тебя всё организовано, поэтому приведи полный код всех классов:
    1) В котором происходит установка точки спауна
    2) В котором находится метод setSpawn()
    3) В котором происходит чтение поля с точкой спауна

    А лучше всего выгрузить проект полностью в гит.

    Тут речь про java-объекты. А судя по тому, что ты пишешь, у тебя они всё-таки разные похоже
     
  7. Автор темы
    Zlodey_duo

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

    Баллы:
    66
    Имя в Minecraft:
    _X_ZLODEY_X_
    Код:
    package me.classicffa.ru;
    
    import java.util.UUID;
    
    import org.bukkit.Location;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandExecutor;
    import org.bukkit.command.CommandSender;
    import org.bukkit.configuration.file.FileConfiguration;
    import org.bukkit.entity.Player;
    
    import me.classicffa.ru.base.ArenaManager;
    import me.classicffa.ru.utils.ChatUtils;
    
    public class CommandFFA implements CommandExecutor {
     
        private ArenaManager arenaManager;
        private FileManager fileManager;
     
        @Override
        public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
            arenaManager = new ArenaManager();
            fileManager = new FileManager();
         
            FileConfiguration config = fileManager.getConfig();
            String prefix = ChatUtils.format(config.getString("Prefix"));
         
            if(!(sender instanceof Player)) {
             
                if(args.length == 0) {
                 
                    sender.sendMessage(" ");
                    sender.sendMessage(ChatUtils.format(prefix + "&cusage: /ffa help"));
                    sender.sendMessage(" ");
                    return true;
                }
             
                if(args.length == 1) {
                 
                    if(args[0].equals("help")) {
                     
                        sender.sendMessage(" ");
                        sender.sendMessage(ChatUtils.format(" &7> > > &fClassic&bFFA &7< < < "));
                        sender.sendMessage(" ");
                        sender.sendMessage(ChatUtils.format("&f&lCOMMANDS:"));
                        sender.sendMessage(ChatUtils.format("&cComing soon..."));
                        sender.sendMessage(" ");
                     
                        return true;
                    }
                 
                    sender.sendMessage(" ");
                    sender.sendMessage(ChatUtils.format(prefix + "&cusage: /ffa help"));
                    sender.sendMessage(" ");
                    return true;
                }
             
                if(args.length >= 2) {
                 
                    sender.sendMessage(" ");
                    sender.sendMessage(ChatUtils.format(prefix + "&cusage: /ffa help"));
                    sender.sendMessage(" ");
                 
                }
             
                return true;
            }
         
            Player p = (Player) sender;
         
            if(args.length == 0) {
             
                p.sendMessage(" ");
                p.sendMessage(ChatUtils.format(prefix + "&cusage: /ffa help"));
                p.sendMessage(" ");
                return true;
            }
         
            if(args.length == 1) {
             
                if(args[0].equals("help")) {
                 
                    if(!p.hasPermission("classicffa.help")) {
                        p.sendMessage(" ");
                        p.sendMessage(ChatUtils.format(prefix + "&cYou dont have permission!"));
                        p.sendMessage(" ");
                        return true;
                    }else {
                     
                        p.sendMessage(" ");
                        p.sendMessage(ChatUtils.format(" &7> > > &fClassic&bFFA &7< < < "));
                        p.sendMessage(" ");
                        p.sendMessage(ChatUtils.format("&f&lCOMMANDS:"));
                        p.sendMessage(ChatUtils.format("&cComing soon..."));
                        p.sendMessage(" ");
                     
                    }
                 
                    return true;
                }
             
                if(args[0].equals("setspawn")) {
                 
                    if(!p.hasPermission("classicffa.setspawn")) {
                        p.sendMessage(" ");
                        p.sendMessage(ChatUtils.format(prefix + "&cYou dont have permission!"));
                        p.sendMessage(" ");
                        return true;
                    }else {
                     
                        Location spawnLocation = p.getLocation();
                        setSpawn(spawnLocation);
                     
                        p.sendMessage(" ");
                        p.sendMessage(ChatUtils.format(prefix + "&eSPAWN &7- &aset location complete!"));
                        p.sendMessage(" ");
                     
                    }
                 
                    return true;
                }
             
                UUID id = p.getUniqueId();
             
                if(args[0].equals("join")) {
                 
                    if(!p.hasPermission("classicffa.join")) {
                        p.sendMessage(" ");
                        p.sendMessage(ChatUtils.format(prefix + "&cYou dont have permission!"));
                        p.sendMessage(" ");
                        return true;
                    }else {
                     
                        joinArena(id);
                     
                    }
                 
                    return true;
                }
             
                if(args[0].equals("leave") || args[0].equals("quit")) {
                 
                    if(!p.hasPermission("classicffa.leave")) {
                        p.sendMessage(" ");
                        p.sendMessage(ChatUtils.format(prefix + "&cYou dont have permission!"));
                        p.sendMessage(" ");
                        return true;
                    }else {
                     
                        leaveArena(id);
                     
                    }
                 
                    return true;
                }
             
                p.sendMessage(" ");
                p.sendMessage(ChatUtils.format(prefix + "&cusage: /ffa help"));
                p.sendMessage(" ");
                return true;
            }
         
            if(args.length >= 2) {
             
                p.sendMessage(" ");
                p.sendMessage(ChatUtils.format(prefix + "&cusage: /ffa help"));
                p.sendMessage(" ");
             
            }
         
            return true;
        }
     
     
        //
     
     
        private void setSpawn(Location location) {
            arenaManager.setSpawn(location);
        }
     
        private void joinArena(UUID id) {
            arenaManager.onJoin(id);
        }
     
        private void leaveArena(UUID id) {
            arenaManager.onLeave(id);
        }
    
    }
    


    Код:
    package me.classicffa.ru.base;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.UUID;
    import org.bukkit.Bukkit;
    import org.bukkit.GameMode;
    import org.bukkit.Location;
    import org.bukkit.configuration.file.FileConfiguration;
    import org.bukkit.entity.Player;
    import org.*********ventory.ItemStack;
    import me.classicffa.ru.FileManager;
    import me.classicffa.ru.utils.ChatUtils;
    import me.classicffa.ru.utils.User;
    
    public class ArenaManager {
     
        private Location spawn;
        private ArrayList<UUID> playersList = new ArrayList<>();
     
        //
     
        private HashMap<UUID, ItemStack[]> inventorySaved = new HashMap<>();
        private HashMap<UUID, GameMode> gamemodeSaved = new HashMap<>();
        private HashMap<UUID, Location> backLocationSaved = new HashMap<>();
        private HashMap<UUID, Boolean> flySaved = new HashMap<>();
     
        //
     
        private FileManager fileManager;
        private User user;
        private Kit kit;
     
        //
     
        public void onJoin(UUID id) {
            fileManager = new FileManager();
            kit = new Kit();
            String prefix = ChatUtils.format("&fClassic&bFFA &8> ");
         
            Player p = Bukkit.getServer().getPlayer(id);
            FileConfiguration data = fileManager.getData();
         
            if(this.spawn == null) {
                p.sendMessage(" ");
                p.sendMessage(ChatUtils.format(prefix + "&cТочка спавна не установлена!"));
                p.sendMessage(" ");
                return;
            }
         
            if(this.playersList.contains(id)) {
                p.sendMessage(" ");
                p.sendMessage(ChatUtils.format(prefix + "&cВы уже на арене!"));
                p.sendMessage(" ");
                return;
            }
         
            if(!data.contains(id.toString())) {
                user.createNewProfile(id);
            }
         
            saveInventory(id);
            saveBackLocation(id);
            saveGamemode(id);
            saveFly(id);
            setFly(id, false);
         
            clearInventory(id);
            kit.warrior(id);
         
            teleport(id, this.spawn);
         
            p.sendMessage(" ");
            p.sendMessage(ChatUtils.format(prefix + "&aВы успешно вошли на арену!"));
            p.sendMessage(" ");
            return;
        }
     
        public void onLeave(UUID id) {
            String prefix = ChatUtils.format("&fClassic&bFFA &8> ");
         
            Player p = Bukkit.getServer().getPlayer(id);
         
            if(!this.playersList.contains(id)) {
                p.sendMessage(" ");
                p.sendMessage(ChatUtils.format(prefix + "&cВы не на арене!"));
                p.sendMessage(" ");
                return;
            }
         
            clearInventory(id);
            giveInventory(id);
            setGamemode(id, getSavedGamemode(id));
            setFly(id, getFly(id));
         
            teleport(id, getBackLocation(id));
            clearHashMap(id);
         
            p.sendMessage(" ");
            p.sendMessage(ChatUtils.format(prefix + "&cВы успешно вышли из арены!"));
            p.sendMessage(" ");
            return;
        }
     
        private void clearHashMap(UUID id) {
            this.backLocationSaved.remove(id);
            this.flySaved.remove(id);
            this.gamemodeSaved.remove(id);
            this.inventorySaved.remove(id);
        }
     
     
        //
     
     
        public void setSpawn(Location location) {
            this.spawn = location;
        }
     
        public Location getSpawn() {
            return this.spawn;
        }
     
        public void addPlayersList(UUID id) {
            this.playersList.add(id);
        }
     
        public void removePlayersList(UUID id) {
            this.playersList.remove(id);
        }
     
        public ArrayList<UUID> getPlayersList() {
            return this.playersList;
        }
     
     
        //
     
     
        private boolean getFly(UUID id) {
            return this.flySaved.get(id);
        }
     
        private void saveFly(UUID id) {
            flySaved.put(id, Bukkit.getServer().getPlayer(id).getAllowFlight());
        }
     
        private void setFly(UUID id, boolean bool) {
            Bukkit.getServer().getPlayer(id).setAllowFlight(bool);
        }
     
        private void setGamemode(UUID id, GameMode gamemode) {
            Bukkit.getServer().getPlayer(id).setGameMode(gamemode);
        }
     
        private void saveGamemode(UUID id) {
            this.gamemodeSaved.put(id, Bukkit.getPlayer(id).getGameMode());
        }
     
        private GameMode getSavedGamemode(UUID id) {
            return this.gamemodeSaved.get(id);
        }
     
        private void saveInventory(UUID id) {
            this.inventorySaved.put(id, Bukkit.getServer().getPlayer(id).getInventory().getContents());
        }
     
        private void giveInventory(UUID id) {
            Bukkit.getServer().getPlayer(id).getInventory().setContents(this.inventorySaved.get(id));
        }
     
        public void saveBackLocation(UUID id) {
            this.backLocationSaved.put(id, Bukkit.getServer().getPlayer(id).getLocation());
        }
     
        public Location getBackLocation(UUID id) {
            return this.backLocationSaved.get(id);
        }
     
        private void clearInventory(UUID id) {
            Bukkit.getServer().getPlayer(id).getInventory().clear();
        }
     
        private void teleport(UUID id, Location location) {
            Bukkit.getServer().getPlayer(id).teleport(location);
        }
    
    }
    

    (!!!) с GitHub-ом ещё не знакомился :|
     
  8. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Каждый раз при вводе команды ты создаёшь новый ArenaManager, поэтому каждый раз ты работаешь с разными объектами арены. В этом и проблема
     
  9. Автор темы
    Zlodey_duo

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

    Баллы:
    66
    Имя в Minecraft:
    _X_ZLODEY_X_
    А даже так, я просто таким способом пытался получать методы с других классов.
    Потому что других методов особо не знаю кроме как сделать методы статичными, но слышал так делать плохо.
    Не подскажешь случаем чем заменить?
     
  10. HauserGrim

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

    Баллы:
    96
    Вроде как-то так обычно делают:
    В мейн классе при запуске создаётся экземпляр класса и геттер на него, а в классе, в котором нужно получить доступ делаешь конструктор со своим плагином, который мейн класс и потом через него получаешь класс и его методы.

    В мейн классе:
    private ТвойМанагер твойМанагер;
    private КлассВКоторомуНуженДоступ классВКоторомНуженДоступ;
    onEnable { твойМанагер = new ТвойМанагер(); классВКоторомНуженДоступ = new КлассВКоторомуНуженДоступ(this) }
    getТвойМанагер { return твойМанагер; }

    В классах, в которых должны получить доступ к другим таким классам:
    private ТвойПлагин твойПлагин;
    public ЭтотКласс(ТвойПлагин твойПлагин) { this.твойПлагин = твойПлагин; }
    Теперь можно твойПлагин.getТвойМанагер()
     
  11. Автор темы
    Zlodey_duo

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

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

    Вроде как бы понятно но не очень :D
    Можно пример кодом если не сложно?
    А то я что то пытаюсь но особо не получается, думаю что то делаю неправильно(
     
  12. HauserGrim

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

    Баллы:
    96
    Мне кажется, код из моего примера даже может работать хд

    Я чуть больше, чем никак, как в прошлый раз, посмотрел код, а не одну фразу ответа Dymeth и...
    Проще всего мне сейчас будет сказать удалить эту строчку и
    тут добавить = new AreaManager();
     
  13. Автор темы
    Zlodey_duo

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

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

    то есть...
    Код:
    private ArenaManager arenaManager = new ArenaManager();
    Разве это будет работать?
     
  14. Автор темы
    Zlodey_duo

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

    Баллы:
    66
    Имя в Minecraft:
    _X_ZLODEY_X_
    Вот из твоего примера я не понял не многое так как нет такового примера кодом, ты там пишешь 'ТвойМанагер, классВКоторомНуженДоступ, ЭтотКласс' не особо понятно, извини я не наглею, просто я просил код примером например с названием плагина TEST.

    Вопрос следующий, будет ли работать так?

    Main class.
    Код:
    private ArenaManager arenaManager;
    
    private static TEST istance;
    public static TEST getIstance() { return istance; }
    
    public void onEnable() {
    istance = this;
    
    arenaManager = new ArenaManager();
    
    }
    
    public ArenaManager getArenaManager() {
    return arenaManager;
    }
    

    Класс которому нужно передать доступ к другому классу и его методам.
    Код:
    private TEST plugin = TEST.getIstance();
    
    public void onMethod() {
    ArenaManager arenaManager = plugin.getArenaManager();
    
    
    }
    Не тестил, не знаю вообще правильно ли написал и работает ли вообще.
    Интересуюсь здесь.
     
  15. HauserGrim

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

    Баллы:
    96
    Должно.

    Со статик инстансом тоже нормальный вариант, тогда не нужно передавать плагин в конструкторе, как я предлагал.
    Должно работать.
     
  16. Автор темы
    Zlodey_duo

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

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

    Не работает выводит ошибку, смысла скидывать не вижу буду решать проблему своими силами, всем спасибо кто ответил и пытался помочь

    ТЕМА ЗАКРЫТА!
     
Статус темы:
Закрыта.

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