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

JolyHoska

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
JolyNoska
Привет форумчане, мне нужна ваша помощь. Столкнулся с тем, что мне надо все стрелы перенести в условный инвентарь: 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Морозильная стрела")) { И я должен эти стрелы перенести в созданный мной инвентарь, чтобы выбрать вид стрелы
 
В чём проблема? Кэшируй из первого инв., удаляй из него, добавляй кэшированные в нужный инв., чисти кэш.
 
Это через HashMap?
 
Любое хранилище. Можно и НМ. Смотря на то, какая реализация требуется.
 
Дело в том что, мне нужна заполнить созданный инвентарь стрелами с определенным DisplayName, кэшировал, но заполняет только первый слот, хотя у меня 3 вида стрел, заполняет 1 слот предмет, который находится в ближнем слоте обычного инвентаря
+ бедут большая нагрузка

У меня и так 9 ArrayList(ов)
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);
}
}
}
 
Дело в том что, мне нужна заполнить созданный инвентарь стрелами с определенным DisplayName, кэшировал, но заполняет только первый слот, хотя у меня 3 вида стрел, заполняет 1 слот предмет, который находится в ближнем слоте обычного инвентаря
+ бедут большая нагрузка

У меня и так 9 ArrayList(ов)
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);
}
}
}
Ты знаешь что такое циклы и ООП?
Ну я понял, что нет.
Создай класс, который будет описывать твою стрелу, из конфига создай нужное количество этих классов в зависимости от кол-ва твоих стрел. Храни их к примеру в HashSet<ТвойКлассСтрел>

Java:
//Типо класс
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;
}
 
Спасибо, реально помог!!!
Все же на bukkit лучшие люди по помощи
 
и да, в инвентаре вроде как нет null предметов, где нет предметов - (item.getType() == Material.AIR) true;
(это не точно, не помню)
Так можно получить твою стрелу по предмету и взять к примеру тот же эффект из класса стрелы, который должен наложиться на игрока при попадании в него данной стрелой.
Java:
public myArrow getMyArrow(ItemStack item){
    for(myArrow arrow : customArrowList) {
        if (arrow.getArrow().equals(item)){
            return arrow;
        }
    }
    return null;
}
 
Моя утилита конфига подойдет?
Код:
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;
    }
}
 
Моя утилита конфига подойдет?
Код:
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;
    }
}
Не, чёт дичь, ща я кину свой пример, дальше ты сам.
Java:
import java.util.HashSet;
import java.util.logging.Logger;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.*********ventory.ItemStack;
import org.*********ventory.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;
    }
}

YAML:
#пример конфига
MagicArrows:
    1:
        name: &3&ltest1
        effect: test1
    2:
        name: &4&ltest2
        effect: test2
    3:
        name: &2&ltest3
        effect: test3
Пример конфига может не точный, ибо не проверял. Я для пример сделал.

Как пользоваться методом inst();
Java:
public class SimpleClass {

    public void simpleMethod(){
       MagicArrows.inst().вот_здесь_можно_вызвать_метод_из_главного_класса();
       //это вместо этого
      private Core core = Core.instacne();
    }

}
 
Последнее редактирование:
Оо, СПАСИБО, БОЛЬШОЕ
А в главный класс нужно добавлять каждую стрелу? в HashSet?
 
НУ у тебя же должен храниться экземпляр каждой стрелы (в едином экземпляре конечно же).
 
Ясно
Должен главный класс быть такой:
JavaScript:
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;
        }
    }

А классы стрел такие(ну с изменениями):
JavaScript:
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;
}
}

как-то так?
 
Нет, не такой...
1. Зачем тебе в классе стрелы instanse?
2. Зачем тебе там загрузка стрел если они у тебя должна быть в гланом классе загружаться только 1 раз и в HashSet.
3. Зачем тебе HashSet в классе стрелы если он должен и есть быть только в главном классе чтобы хранить считанные с конфига стрелы в 1 экземпляре.
Пойми простую простую вещь, ты не понимаешь, что ты делаешь.
Пойми принцип объектов(ООП) и как они работают. Тебе надо это осознать, чтобы ты понимал, что ты делаешь.
 
Я конечно понимаю, что я тебя задолбал нубскими вопросама! Ну класс Core правильный? А в классе стрелы вырезал все ненужное
JavaScript:
import org.*********ventory.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;
    }
}
 
Последнее редактирование:
Теоретически да, ничего лишнего там нет.
Класс выше тоже норм поправил.
На будущие: форматирование для Java кода делается так:
Java:
[code=java][|code] Ток вместо "|" -> "/"

Консоль цвет вроде не покажет. Я обычно подобный префикс использую для вывода лог информации в консоль.
Java:
public staticfinalString CONSOLE_PREFIX ="§eСтрелы:";
 
А @EventHandler запускать в классе стрелы, или можно в Core, я думаю в классе стрелы, так по моему нагрузка будет меньше вот код на евенты:
Java:
    @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);
                }
            }
 
Последнее редактирование:
К чему запускать по шедулеру на стрелу? Одного мало? Пиши стрелы в мапу и обрабатывай одним шедулером.
 
Я так делал, но тогда начинаются лаги, не знаю почему(
 
Последнее редактирование:
Назад
Верх