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

Использование классов и конструкторов

Тема в разделе "Разработка плагинов для новичков", создана пользователем ToBlEzZ, 28 окт 2020.

  1. Автор темы
    ToBlEzZ

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

    Баллы:
    76
    Всем привет!
    Суть плагина: выдача наборов (комплектов) предметов с помощью команды
    Классы:
    Код:
    public class Main extends JavaPlugin {
        public void onEnable(){
            getCommand("bastion").setExecutor(new Commands(this));
    
        }
        public void onDisable(){
    
        }
    }
    Код:
    public class giveConstructor {
    
        Player player;
        Inventory inventory = player.getInventory();
        ItemStack weapon,  helmet,  bodyChest,  leggins,  boots,  sp1,  sp2,  ultimative; String kitName;
    
        public giveConstructor(ItemStack we, ItemStack he, ItemStack bodt, ItemStack leg, ItemStack boot, ItemStack s1, ItemStack s2, ItemStack ult, String Name){
            weapon =we;
            helmet = he;
            bodyChest=bodt;
            leggins = leg;
            boots = boot;
            sp1 = s1;
            sp2 =s2;
            ultimative = ult;
            kitName = Name;
        }
        public void giveKit(){
            inventory.setItem(4, weapon);
            inventory.setItem(103, helmet);
            inventory.setItem(102, bodyChest);
            inventory.setItem(101, leggins);
            inventory.setItem(100, boots);
            inventory.setItem(3, sp1);
            inventory.setItem(5, sp2);
            inventory.setItem(8, ultimative);
            player.sendMessage(ChatColor.GREEN + "Выдан комплект " + kitName);
        }
    }
    Код:
    public class Commands implements CommandExecutor {
     
        BastionKit bKit = new BastionKit();
     
        private Main plugin;
        public Commands(Main plugin) {
            this.plugin = plugin;
        }
     
        @Override
        public boolean onCommand(CommandSender sender, Command cmd, String lbl, String[] args) {
        if(cmd.getName().equalsIgnoreCase("bastion")){
            bKit.giveBastionKit();
            sender.sendMessage("Команда исполнена");
        return true;
        }
            return false;
        }
    }
    Код:
    public class BastionKit {
        String kitName = "Bastion";
    
        ItemStack bWeapon = new ItemStack(Material.DIAMOND_SWORD);
        ItemStack bHelmet = new ItemStack(Material.DIAMOND_HELMET);
        ItemStack bBodyChest = new ItemStack(Material.DIAMOND_CHESTPLATE);
        ItemStack bLeggins = new ItemStack(Material.DIAMOND_LEGGINGS);
        ItemStack bBoots = new ItemStack(Material.DIAMOND_BOOTS);
        ItemStack bSP1 = new ItemStack(Material.DIAMOND);
        ItemStack bSP2 = new ItemStack(Material.GOLD_INGOT);
        ItemStack bUltimate = new ItemStack(Material.DIAMOND_SHOVEL);
    
    
        giveConstructor giver = new giveConstructor(bWeapon, bHelmet, bBodyChest, bLeggins, bBoots, bSP1, bSP2, bUltimate, kitName);
        public void giveBastionKit(){
            giver.giveKit();
        }
    }

    В giveConstructor находится конструктор и метод заполнения и выдачи комплектов.
    BastionKit: чем заполнится конструктор и метод (который используется в Commands) выдачи этого комплекта
    Строки с импортами намеренно не писал на сайте (в коде они есть).
    Пробовал сделать подобное (Конструктор-метод-main) в обычной Джаве, там работало. Может нужно сделать какую-то особую связь между классами? Но сам я вряд ли разберусь
     
  2. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    В теории все нормально, но у игрока всего 45 слотов, а не 103.
    [​IMG]
     
  3. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    А еще Player а ты не передал в конструктор, ну или его инвентарь.
     
  4. Автор темы
    ToBlEzZ

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

    Баллы:
    76
    Первая картинка по моему запросу в гугле была вот эта. Мне стоило посмотреть ещё несколько, а не брать первую попавшуюся
     

    Вложения:

    • -cewZKeLEQo.jpg
      -cewZKeLEQo.jpg
      Размер файла:
      34,2 КБ
      Просмотров:
      13
  5. Автор темы
    ToBlEzZ

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

    Баллы:
    76
    Можно по подробнее?
     
  6. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Player = null у тебя, куда уж подробнее то. Ты его нигде не передал.
     
  7. Автор темы
    ToBlEzZ

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

    Баллы:
    76
    Сейчас добавил Player в конструктор. Но понял, что у меня принципиально собственные команды не работают, даже отдельный класс для проверки этого сделал. Как результат - ничего
     
  8. _MRDen3000YT_

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

    Баллы:
    76
    Зачем эта проверка?
     
  9. _MRDen3000YT_

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

    Баллы:
    76
    Класс команд лучше сделать так:
    Код:
    public class Commands implements CommandExecutor {
    
        giveConstructor giveconstructor = new giveConstructor();
    
        private Main plugin;
    
        public Commands(Main plugin) {
            this.plugin = plugin;
        }
    
        @Override
        public boolean onCommand(CommandSender sender, Command cmd, String lbl, String[] args) {
            if (commandSender instanceof Player) {
                giveconstructor.giveKit(sender.getPlayer());
                sender.sendMessage("Команда исполнена");
            } else {
                sender.sendMessage("Эту команду может использовать только игрок!");
            }
            return true;
        }
    }
    
    Мы сделали проверку на то, является ли sender игроком,
    вызвали метод из класс giveConstructor(при этому передали игрока). (На будущее - классы называются с большой буквы, методы с маленькой, пакеты тоже с маленькой)
    Далее в классе с инвентарём у тебя player = null.
    Код:
    public class giveConstructor {
    
        String kitName = "Bastion";
    
        ItemStack Weapon = new ItemStack(Material.DIAMOND_SWORD);
        ItemStack Helmet = new ItemStack(Material.DIAMOND_HELMET);
        ItemStack BodyChest = new ItemStack(Material.DIAMOND_CHESTPLATE);
        ItemStack Leggins = new ItemStack(Material.DIAMOND_LEGGINGS);
        ItemStack Boots = new ItemStack(Material.DIAMOND_BOOTS);
        ItemStack SP1 = new ItemStack(Material.DIAMOND);
        ItemStack SP2 = new ItemStack(Material.GOLD_INGOT);
        ItemStack Ultimate = new ItemStack(Material.DIAMOND_SHOVEL);
    
        public void giveKit(Player p) {
            Inventory inventory = player.getInventory();
            inventory.setItem(4, Weapon);
            inventory.setItem(103, Helmet);
            inventory.setItem(102, BodyChest);
            inventory.setItem(101, Leggins);
            inventory.setItem(100, Boots);
            inventory.setItem(3, SP1);
            inventory.setItem(5, SP2);
            inventory.setItem(8, Utimate);
            p.sendMessage(ChatColor.GREEN + "Выдан комплект " + kitName);
            p.updateInventory();
        }
    }
    
    
    Тут мы перенесли все из класса BastionKit сюда. Вроде все расписал, должно робить.
     
    Последнее редактирование: 29 окт 2020
  10. Автор темы
    ToBlEzZ

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

    Баллы:
    76
    Команды не работали, уже от отчаяния всё с туториалов копировал.
     
  11. Автор темы
    ToBlEzZ

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

    Баллы:
    76
    Да, спасибо. Заработало. Только я хочу создать несколько комплектов, где у каждого предмета будут свои особенные свойства. Если буду писать в одном классе, то выйдет громоздко. А можно ли как-нибудь развить мою идею с использованием конструктора? Как пример:
    Constructor: public Constructor(...) {...} public void giveKit(Player p){...}
    Kit1: items; Constructor cons = new Constructor(items); public void giveKit1(Player p){cons.giveKit(p)}
    Commands: Kit1 kt1 = new Kit1(); onCommand(sender) {kt1.giveKit1((Player) sender)}
     
  12. Автор темы
    ToBlEzZ

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

    Баллы:
    76
    У sender нет метода (поправьте, если неправильно назвал) getPlayer(), его можно только преобразовать (Player) sender
     
  13. _MRDen3000YT_

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

    Баллы:
    76
    Player player = (Player) sender;

    Далее создаешь новый класс(например, ArrowKit)
    Код:
    public class ArrowKit {
    
        String kitName = "Кит лучника";
    
        ItemStack Weapon = new ItemStack(Material.BOW);
    
        // создаешь свои item стаки
        // выдаешь игроку
        public void giveKit(Player p) {
            Inventory inventory = player.getInventory();
            inventory.setItem(4, Weapon);
            p.sendMessage(ChatColor.GREEN + "Выдан комплект " + kitName);
            p.updateInventory();
        }
    }
    Далее в классе команд:
    Код:
    blic class Commands implements CommandExecutor {
    
        giveConstructor giveconstructor = new giveConstructor();
    
        private Main plugin;
    
        public Commands(Main plugin) {
            this.plugin = plugin;
        }
    
        ArrowKit arrowkit = new ArrowKit();
    
        @Override
        public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
            if (sender instanceof Player) {
                Player send = (Player) sender;
                if(args.length <= 2 && args.equals("arrow")) {
                    arrowkit.giveKit; //вызываем метод если второй аргумент (/bastion arrow <- второй аргумент) содержит arrow
                  
                } else if(args.length <= 2 && args.equals("bastion") {
                    giveconstructor.giveKit(send);
                } else {
                    send.sendMessage("Такого кита не существует!");
                }
              
            } else {
                sender.sendMessage("Эту команду может использовать только игрок!");
            }
            return true;
        }
    
    }
    
    }
     
    Последнее редактирование: 29 окт 2020
  14. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Ну разделяешь на 2 класса, делов то.
     
  15. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    if (sender instanceof Player) {
    Player player = (Player) sender;
    }
     

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