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

  • Автор темы Автор темы 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) в обычной Джаве, там работало. Может нужно сделать какую-то особую связь между классами? Но сам я вряд ли разберусь
 
В теории все нормально, но у игрока всего 45 слотов, а не 103.
Inventory-slots.png
 
А еще Player а ты не передал в конструктор, ну или его инвентарь.
 
В теории все нормально, но у игрока всего 45 слотов, а не 103.
Inventory-slots.png
Первая картинка по моему запросу в гугле была вот эта. Мне стоило посмотреть ещё несколько, а не брать первую попавшуюся
 

Вложения

  • -cewZKeLEQo.jpg
    -cewZKeLEQo.jpg
    34,2 КБ · Просмотры: 13
Player = null у тебя, куда уж подробнее то. Ты его нигде не передал.
Сейчас добавил Player в конструктор. Но понял, что у меня принципиально собственные команды не работают, даже отдельный класс для проверки этого сделал. Как результат - ничего
 
Класс команд лучше сделать так:
Код:
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 сюда. Вроде все расписал, должно робить.
 
Последнее редактирование:
Класс команд лучше сделать так:
Код:
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 сюда. Вроде все расписал, должно робить.
Да, спасибо. Заработало. Только я хочу создать несколько комплектов, где у каждого предмета будут свои особенные свойства. Если буду писать в одном классе, то выйдет громоздко. А можно ли как-нибудь развить мою идею с использованием конструктора? Как пример:
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)}
 
У sender нет метода (поправьте, если неправильно назвал) getPlayer(), его можно только преобразовать (Player) sender
Player player = (Player) sender;

Да, спасибо. Заработало. Только я хочу создать несколько комплектов, где у каждого предмета будут свои особенные свойства. Если буду писать в одном классе, то выйдет громоздко. А можно ли как-нибудь развить мою идею с использованием конструктора? Как пример:
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)}
Далее создаешь новый класс(например, 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;
    }

}

}
 
Последнее редактирование:
Назад
Верх