Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

Помогите надо все стрелы перенести в условный инвентарь

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

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

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

    Баллы:
    61
    Имя в Minecraft:
    JolyHohol
    Привет форумчане, мне нужна ваша помощь. Столкнулся с тем, что мне надо все стрелы перенести в условный инвентарь: Inventory inv = Bukkit.createInventory(null, 9, "§cВыберите стрелу"); Я сделал проверку на предметы в инвентаре for(ItemStack item : p.getInventory()) { if(item != null && item.getType() == Material.ARROW && item.getItemMeta().hasDisplayName() && item.getItemMeta().getDisplayName().equals("§3Морозильная стрела")) { И я должен эти стрелы перенести в созданный мной инвентарь, чтобы выбрать вид стрелы
     
  2. Хостинг MineCraft
    <
  3. makssof

    makssof Старожил Девелопер Пользователь

    Баллы:
    103
    Skype:
    makssofez
    В чём проблема? Кэшируй из первого инв., удаляй из него, добавляй кэшированные в нужный инв., чисти кэш.
     
  4. Автор темы
    JolyHoska

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

    Баллы:
    61
    Имя в Minecraft:
    JolyHohol
    Это через HashMap?
     
  5. makssof

    makssof Старожил Девелопер Пользователь

    Баллы:
    103
    Skype:
    makssofez
    Любое хранилище. Можно и НМ. Смотря на то, какая реализация требуется.
     
  6. Автор темы
    JolyHoska

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

    Баллы:
    61
    Имя в Minecraft:
    JolyHohol
    Дело в том что, мне нужна заполнить созданный инвентарь стрелами с определенным DisplayName, кэшировал, но заполняет только первый слот, хотя у меня 3 вида стрел, заполняет 1 слот предмет, который находится в ближнем слоте обычного инвентаря[DOUBLEPOST=1497712607,1497707950][/DOUBLEPOST]+ бедут большая нагрузка

    У меня и так 9 ArrayList(ов)[DOUBLEPOST=1497716366][/DOUBLEPOST]public void checkitem(Player p) {
    for(ItemStack item : p.getInventory()) {
    if(item != null && item.getType() == Material.ARROW && item.getItemMeta().hasDisplayName() && item.getItemMeta().getDisplayName().equals("§3Морозильная стрела")) {
    p.sendMessage("У Вас: §3Морозильная стрела");
    item1.add(item);
    }
    if(item != null && item.getType() == Material.ARROW && item.getItemMeta().hasDisplayName() && item.getItemMeta().getDisplayName().equals("§5Отбойная стрела")) {
    p.sendMessage("У Вас: §5Отбойная стрела");
    item2.add(item);
    }
    if(item != null && item.getType() == Material.ARROW && item.getItemMeta().hasDisplayName() && item.getItemMeta().getDisplayName().equals("§9Электрическая стрела")) {
    p.sendMessage("У Вас: §9Электрическая стрела");
    item3.add(item);
    }
    if(item != null && item.getType() == Material.ARROW && item.getItemMeta().hasDisplayName() && item.getItemMeta().getDisplayName().equals("§6Огненая стрела")) {
    p.sendMessage("У Вас: §6Огненая стрела");
    item4.add(item);
    }
    if(item != null && item.getType() == Material.ARROW && item.getItemMeta().hasDisplayName() && item.getItemMeta().getDisplayName().equals("§7Замедляющая стрела")) {
    p.sendMessage("У Вас: §7Замедляющая стрела");
    item5.add(item);
    }
    if(item != null && item.getType() == Material.ARROW && item.getItemMeta().hasDisplayName() && item.getItemMeta().getDisplayName().equals("§cВысокоточная стрела")) {
    p.sendMessage("У Вас: §3Морозильная стрела");
    item6.add(item);
    }
    if(item != null && item.getType() == Material.ARROW && item.getItemMeta().hasDisplayName() && item.getItemMeta().getDisplayName().equals("§2Заражающиая стрела")) {
    p.sendMessage("У Вас: §cВысокоточная стрела");
    item7.add(item);
    }
    Inventory inv = Bukkit.createInventory(null, 9, "§cВыберите стрелу");
    if(item1.contains(item)) {
    inv.setItem(0, ItemUtils.create(Material.ARROW, "1"));
    p.sendMessage("§4dasdasd");
    item1.remove(item);
    }
    if(item2.contains(item)) {
    inv.setItem(1, ItemUtils.create(Material.ARROW, "2"));
    item2.remove(item);
    }
    if(item3.contains(item)) {
    inv.setItem(2, ItemUtils.create(Material.ARROW, "3"));
    item3.remove(item);
    }
    if(item4.contains(item)) {
    inv.setItem(3, ItemUtils.create(Material.ARROW, "4"));
    item4.remove(item);
    }
    if(item5.contains(item)) {
    inv.setItem(4, ItemUtils.create(Material.ARROW, "5"));
    item5.remove(item);
    }
    if(item6.contains(item)) {
    inv.setItem(5, ItemUtils.create(Material.ARROW, "6"));
    item6.remove(item);
    }
    if(item7.contains(item)) {
    inv.setItem(6, ItemUtils.create(Material.ARROW, "7"));
    item7.remove(item);
    }
    p.openInventory(inv);
    }
    }
    }
     
  7. Exception_Prototype

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

    Баллы:
    46
    Ты знаешь что такое циклы и ООП?[DOUBLEPOST=1497717525][/DOUBLEPOST]Ну я понял, что нет.
    Создай класс, который будет описывать твою стрелу, из конфига создай нужное количество этих классов в зависимости от кол-ва твоих стрел. Храни их к примеру в HashSet<ТвойКлассСтрел>

    Код:
    //Типо класс
    public class MyArrow{
    
        private final ItemStack item;
      //Вообще тут можно много параметров ещё хранить, эффект к примеру, который будет действовать на игрока при попадании в него этой стрелой.
        public MyArrow(ItemStack item){
            this.item = item;
        }
    
        public ItemStack getArrow(){
            return item;
        }
    
    
    }
    //Загрузка из кофнига стрел (если конечно планируешь добавлять потом новые или чё нить ещё)
    private void loadArrows(){
        HashSet<MyArrow> customArrowList = new HashSet<>(); //где то выше всех методов конечно же
        //Бегаешь по конфигу, взял данные для одной из стрел
        String name = getConfig().getString("path");
        Material material = Material.valueOf(getConfig().getString("path"));
        ItemStack item = new ItemStack(...);
        //Здесь создаёшь свои стрелы. Можем прям тут при создании их сетить в инвентрь тот.
    
    
        myArrow arrow = new MyArrow(item);
        customArrowList.add(arrow);
    
    }
    //Проверка какого то предмета на то, что он является твоей стрлой
    public boolean isMyArrow(ItemStack item){
        for    (myArrow arrow : customArrowList){
            if (arrow.getArrow().equals(item)) return true;
        }
        return false;
    }
    
     
  8. Автор темы
    JolyHoska

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

    Баллы:
    61
    Имя в Minecraft:
    JolyHohol
    Спасибо, реально помог!!!
    Все же на bukkit лучшие люди по помощи
     
  9. Exception_Prototype

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

    Баллы:
    46
    и да, в инвентаре вроде как нет null предметов, где нет предметов - (item.getType() == Material.AIR) true;
    (это не точно, не помню)[DOUBLEPOST=1497717932,1497717735][/DOUBLEPOST]Так можно получить твою стрелу по предмету и взять к примеру тот же эффект из класса стрелы, который должен наложиться на игрока при попадании в него данной стрелой.
    Код:
    public myArrow getMyArrow(ItemStack item){
        for(myArrow arrow : customArrowList) {
            if (arrow.getArrow().equals(item)){
                return arrow;
            }
        }
        return null;
    }
    
     
  10. Автор темы
    JolyHoska

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

    Баллы:
    61
    Имя в Minecraft:
    JolyHohol
    Моя утилита конфига подойдет?
    Код:
    public class Config {
        private Core core = Core.instacne();
        public static Config
                data = new Config("data");
        private File file;
        private FileConfiguration config;
        public Config(String name) {
            if(!core.getDataFolder().exists()) core.getDataFolder().mkdirs();
            file = new File(core.getDataFolder(), name + ".yml");
            if(!file.exists()) {
                try {
                    if(getClass().getResourceAsStream(File.separator + name + ".yml") != null)
                        core.saveResource(name + ".yml", false);
                    else file.createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            config = YamlConfiguration.loadConfiguration(file);
        }
        public void set(String path, Object value) {
            config.set(path, value);
            try { config.save(file); }
            catch (IOException e) { e.printStackTrace(); }
        }
        @SuppressWarnings("unchecked")
        public <T> T get(String path) {
            return (T) config.get(path);
        }
        public ConfigurationSection createCS(String path) {
            ConfigurationSection cs = config.createSection(path);
            try { config.save(file); }
            catch (IOException e) { e.printStackTrace(); }
            return cs;
        }
    }
    
     
  11. Exception_Prototype

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

    Баллы:
    46
    Не, чёт дичь, ща я кину свой пример, дальше ты сам.[DOUBLEPOST=1497721788,1497720359][/DOUBLEPOST]
    Код:
    
    import java.util.HashSet;
    import java.util.logging.Logger;
    import org.bukkit.ChatColor;
    import org.bukkit.Material;
    import org.bukkit.inventory.ItemStack;
    import org.bukkit.inventory.meta.ItemMeta;
    import org.bukkit.plugin.java.JavaPlugin;
    import org.bukkit.potion.PotionEffectType;
    
    //главный класс
    public class MagicArrows extends JavaPlugin {
    
        public static final Logger LOGGER = Logger.getLogger("Minecraft");
        public static final String CONSOLE_PREFIX = "[MagicArrows] ";
        public static final String CHAT_PREFIX = ChatColor.YELLOW + "[MA] " + ChatColor.RESET;
    
        private static MagicArrows instanse;
        private HashSet<MagicArrow> myArrowsList;
    
        @Override
        public void onEnable() {
            instanse = this;
            myArrowsList = new HashSet<>();
            LOGGER.info(CONSOLE_PREFIX + "isEnable!");
        }
    
        public void loadMagicArrows() {
            this.reloadConfig();
     
            if (this.getConfig().contains("MagicArrows")) {
    
                for (String node : this.getConfig().getConfigurationSection("MagicArrows").getKeys(false)) {
    
                    String name = this.getConfig().getString("MagicArrows." + node + ".name");
                    PotionEffectType effect = PotionEffectType.getByName(this.getConfig().getString("MagicArrows." + node + ".effect"));
    
                    ItemStack item = new ItemStack(Material.ARROW);
                    ItemMeta meta = item.getItemMeta();
                    meta.setDisplayName(ChatColor.translateAlternateColorCodes('&', name));
                    item.setItemMeta(meta);
    
                    MagicArrow arrow = new MagicArrow(item, effect);
                    this.myArrowsList.add(arrow);
    
                }
    
            } else {
                this.getConfig().createSection("MagicArrows");
                this.saveConfig();
            }
    
        }
    
        public HashSet<MagicArrow> getMagicArrows() {
            return this.myArrowsList;
        }
    
        public MagicArrow getMagicArrow(ItemStack item) {
            for (MagicArrow arrow : this.myArrowsList) {
                if (arrow.getMagicArrow().equals(item)) {
                    return arrow;
                }
            }
            return null;
        }
    
        //Это тоже самое что я кидал выше, просто аля java 8
        public boolean isMagicArrow(ItemStack item) {
            return this.myArrowsList.stream().anyMatch((arrow) -> (arrow.getMagicArrow().equals(item)));
        }
    
        public MagicArrows inst() {
            return instanse;
        }
    
        @Override
        public void onDisable() {
            LOGGER.info(CONSOLE_PREFIX + "isDisable!");
        }
    
    }
    
    //Класс стрелы
    public class MagicArrow {
    
        private final ItemStack item;
        private final PotionEffectType effect;//Сюда в принципе можно поместить готовый эффект, но я для примера только тип сделал.
    
        public MagicArrow(ItemStack item, PotionEffectType effect) {
            this.item = item;
            this.effect = effect;
        }
    
        public ItemStack getMagicArrow() {
            return this.item;
        }
    
        public PotionEffectType getPotionEffectType() {
            return this.effect;
        }
    }
    
    Код:
    #пример конфига
    MagicArrows:
        1:
            name: &3&ltest1
            effect: test1
        2:
            name: &4&ltest2
            effect: test2
        3:
            name: &2&ltest3
            effect: test3
    
    Пример конфига может не точный, ибо не проверял. Я для пример сделал.

    Как пользоваться методом inst();
    Код:
    public class SimpleClass {
    
        public void simpleMethod(){
           MagicArrows.inst().вот_здесь_можно_вызвать_метод_из_главного_класса();
           //это вместо этого
          private Core core = Core.instacne();
        }
    
    }
    
     
    Последнее редактирование: 17 июн 2017
  12. Автор темы
    JolyHoska

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

    Баллы:
    61
    Имя в Minecraft:
    JolyHohol
    Оо, СПАСИБО, БОЛЬШОЕ[DOUBLEPOST=1497807498,1497728239][/DOUBLEPOST]А в главный класс нужно добавлять каждую стрелу? в HashSet?
     
  13. Exception_Prototype

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

    Баллы:
    46
    НУ у тебя же должен храниться экземпляр каждой стрелы (в едином экземпляре конечно же).
     
  14. Автор темы
    JolyHoska

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

    Баллы:
    61
    Имя в Minecraft:
    JolyHohol
    Ясно[DOUBLEPOST=1497809649,1497809418][/DOUBLEPOST]Должен главный класс быть такой:
    Код:
    public class Core extends JavaPlugin {
        public static final Logger LOGGER = Logger.getLogger("Minecraft");
        public static final String CONSOLE_PREFIX = "§eСтрелы:";
        public static final String CHAT_PREFIX = "§eСтрелы: §f";
        private static Core instanse;
        private HashSet<ArrowIce> myArrowsList;
        @Override
        public void onEnable() {
            instanse = this;
            saveConfig();
            myArrowsList = new HashSet<>();
            LOGGER.info(CONSOLE_PREFIX + "isEnable!");
        }
        public void loadMagicArrows() {
            this.reloadConfig();
            if (this.getConfig().contains("Arrows")) {
                for (String node : this.getConfig().getConfigurationSection("Arrows").getKeys(false)) {
                    String name = this.getConfig().getString("Arrows." + node + ".name");
                    PotionEffectType effect = PotionEffectType.getByName(this.getConfig().getString("Arrows." + node + ".effect"));
                    ItemStack item = new ItemStack(Material.ARROW);
                    ItemMeta meta = item.getItemMeta();
                    meta.setDisplayName(ChatColor.translateAlternateColorCodes('&', name));
                    item.setItemMeta(meta);
                    ArrowIce arrow = new ArrowIce(item, effect, null);
                    this.myArrowsList.add(arrow);
                }
                } else {
                getConfig().createSection("Arrows");
                getConfig().set("Prefix." +CHAT_PREFIX+ "Player.", getName());
                saveConfig();
            }
        }
        public HashSet<ArrowIce> getMagicArrows() {
            return this.myArrowsList;
        }
        public ArrowIce getArrow(ItemStack item) {
            for (ArrowIce arrow : this.myArrowsList) {
                if (arrow.getArrow().equals(item)) {
                    return arrow;
                }
            }
            return null;
        }
        public boolean isMagicArrow(ItemStack item) {
            return this.myArrowsList.stream().anyMatch((arrow) -> (arrow.getArrow().equals(item)));
        }
        public Core inst() {
            return instanse;
        }
        @Override
        public void onDisable() {
            LOGGER.info(CONSOLE_PREFIX + "isDisable!");
        }
        public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
            if(cmd.getName().equalsIgnoreCase("arrow")) {
                if(args.length == 0) {
                //потом изменю меню плагина
                  //  sender.sendMessage("§m                  §e{ HorizonChat }§f§m                  ");
                  //  sender.sendMessage("§e/chat clear - §fОчистить чат");
                  //  sender.sendMessage("§e/chat mute - §fГлобальный мут");
                  //  sender.sendMessage("§e/chat reload - §fПерезагрузить плагин");
                  //  sender.sendMessage("§m                                                  ");
                }
    
                if(args.length == 1) {
                    if(args[0].equalsIgnoreCase("ice")) {
                        Player p = (Player)sender;
                        PlayerInventory pi = p.getInventory();
                        ItemStack item = new ItemStack(Material.ARROW);
                        ItemMeta meta = item.getItemMeta();
                        meta.setDisplayName("§3Морозильная стрела");
                        item.setItemMeta(meta);
                        pi.addItem(item);
                        }
                    if(args[0].equalsIgnoreCase("reload")) {
                        saveConfig();
                        this.saveDefaultConfig();
                        reloadConfig();
                        reloadConfig();
                        sender.sendMessage("§fКонфигурация перезагружена");
                    }
                        }
                    }
            return false;
            }
        }
    
    [DOUBLEPOST=1497809691][/DOUBLEPOST]А классы стрел такие(ну с изменениями):
    Код:
    public class ArrowIce{
        HashSet<ArrowIce> customArrowList = new HashSet<>();
        private final ItemStack item;
        private final PotionEffectType effect;
        private Core core;
        public ArrowIce(ItemStack item, PotionEffectType effect, Core core) {
            this.item = item;
            this.effect = effect;
        }
        public ItemStack getArrow() {
            return this.item;
        }
        public PotionEffectType getPotionEffectType() {
            return this.effect;
        }
    
    
    private void loadArrows() {
        String name = core.getConfig().getString("path");
        Material material = Material.valueOf(core.getConfig().getString("path"));
        ItemStack item = new ItemStack(material);
      
        ArrowIce arrow = new ArrowIce(item, effect, core);
        customArrowList.add(arrow);
    }
    public boolean isArrowIce(ItemStack item, Player p) {
        for(ArrowIce arrow : customArrowList){
            if (arrow.getArrow().equals(item)) return true;
            p.sendMessage("У Вас: §3Морозильная стрела");
        }
        return false;
    }
    public ArrowIce getArrowIce(ItemStack item){
        for(ArrowIce arrow : customArrowList) {
            if (arrow.getArrow().equals(item)){
          //      effect.createEffect(duration, amplifier)
                return arrow;
            }
        }
        return null;
    }
    }
    
    [DOUBLEPOST=1497861825][/DOUBLEPOST]как-то так?
     
  15. Exception_Prototype

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

    Баллы:
    46
    Нет, не такой...
    1. Зачем тебе в классе стрелы instanse?
    2. Зачем тебе там загрузка стрел если они у тебя должна быть в гланом классе загружаться только 1 раз и в HashSet.
    3. Зачем тебе HashSet в классе стрелы если он должен и есть быть только в главном классе чтобы хранить считанные с конфига стрелы в 1 экземпляре.
    Пойми простую простую вещь, ты не понимаешь, что ты делаешь.
    Пойми принцип объектов(ООП) и как они работают. Тебе надо это осознать, чтобы ты понимал, что ты делаешь.
     
  16. Автор темы
    JolyHoska

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

    Баллы:
    61
    Имя в Minecraft:
    JolyHohol
    Я конечно понимаю, что я тебя задолбал нубскими вопросама! Ну класс Core правильный? А в классе стрелы вырезал все ненужное
    Код:
    import org.bukkit.inventory.ItemStack;
    import org.bukkit.potion.PotionEffectType;
    
    class ArrowIce{
        private final ItemStack item;
        private final PotionEffectType effect;
        public ArrowIce(ItemStack item, PotionEffectType effect) {
            this.item = item;
            this.effect = effect;
        }
        public ItemStack getArrow() {
            return this.item;
        }
        public PotionEffectType getPotionEffectType() {
            return this.effect;
        }
    }
     
    Последнее редактирование: 19 июн 2017
  17. Exception_Prototype

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

    Баллы:
    46
    Теоретически да, ничего лишнего там нет.
    Класс выше тоже норм поправил.
    На будущие: форматирование для Java кода делается так:
    Код:
    [code=java][|code] Ток вместо "|" -> "/" 
    [DOUBLEPOST=1497886681,1497885880][/DOUBLEPOST]Консоль цвет вроде не покажет. Я обычно подобный префикс использую для вывода лог информации в консоль.
    Код:
    public staticfinalString CONSOLE_PREFIX ="§eСтрелы:";
    
     
  18. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Покажет через гетлогер.
     
  19. Автор темы
    JolyHoska

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

    Баллы:
    61
    Имя в Minecraft:
    JolyHohol
    А @EventHandler запускать в классе стрелы, или можно в Core, я думаю в классе стрелы, так по моему нагрузка будет меньше вот код на евенты:
    Код:
        @EventHandler
        public void bow(EntityShootBowEvent e) {
            final Arrow arrow = (Arrow) e.getProjectile();
            Player p = (Player) e.getEntity();
          //Это со старого  плагина for(ItemStack item : p.getInventory().getContents()) {
            //Это со старого  плагина    if(item != null && item.getType() == Material.ARROW && item.getItemMeta().hasDisplayName() && item.getItemMeta().getDisplayName().equals("§3Морозильная стрела")) {
                    if(e.getBow().getItemMeta().getDisplayName().contains("§5Боевой лук Карха Тьмы")) {
                //Это со старого  плагина        arr1.put(p, arrow);
                        new BukkitRunnable() {
                            @Override
                             public void run() {
                                 if(!arrow.isOnGround() && !arrow.isDead()) {
                                        PacketPlayOutWorldParticles packet = new PacketPlayOutWorldParticles(EnumParticle.CLOUD, true,
                                              (float)arrow.getLocation().getX(),
                                              (float)arrow.getLocation().getY(),
                                              (float)arrow.getLocation().getZ(),
                                              0, 0, 0, 0, 5, null);
                                       ((CraftPlayer) p).getHandle().playerConnection.sendPacket(packet);
                                 }
                            }
                         }.runTaskTimer(this, 3, 0);
                    }
                }
     
    Последнее редактирование: 22 июн 2017
  20. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    К чему запускать по шедулеру на стрелу? Одного мало? Пиши стрелы в мапу и обрабатывай одним шедулером.
     
  21. Автор темы
    JolyHoska

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

    Баллы:
    61
    Имя в Minecraft:
    JolyHohol
    Я так делал, но тогда начинаются лаги, не знаю почему(
     
    Последнее редактирование: 23 июн 2017

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