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

Помогите Проверка предмета в руке

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

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

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

    Баллы:
    173
    Skype:
    nonecsa
    Имя в Minecraft:
    None
    Как проверить что в руке не броня из любого материала?

    приходит в голову создать список всей брони из всех возможных материалов и потом проверять есть ли предмет в руке в этом списке

    может есть какие-то более оптимальные методы/алгоритмы?
     
  2. Хостинг MineCraft
    <
  3. Автор темы
    Serrrgio

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

    Баллы:
    173
    Skype:
    nonecsa
    Имя в Minecraft:
    None
    или вот так
    Код:
    public static boolean isArrmor (ItemStack i) {
    String iname = i.getItemMeta().getDisplayName();
    if (iname.endsWith("_HELMET") || iname.endsWith("_CHESTPLATE") || iname.endsWith("_LEGGINGS") || iname.endsWith("BOOTS")) return true;
    return false;
    }
     
  4. Zнамя Юности

    Zнамя Юности Активный участник Пользователь

    Баллы:
    46
    getType().toString()
     
  5. alexandrage

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

    Баллы:
    173
    Skype:
    alexandr0116
    Всяко есть, майн же как то определяет, можно поместить в слоты брони или нет.
     
  6. alexandrage

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

    Баллы:
    173
    Skype:
    alexandr0116
  7. Автор темы
    Serrrgio

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

    Баллы:
    173
    Skype:
    nonecsa
    Имя в Minecraft:
    None
  8. alexandrage

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

    Баллы:
    173
    Skype:
    alexandr0116
    Вот нашел.
    Код:
        boolean isArmor(ItemStack stack) {
            CraftItemStack craftstack =  (CraftItemStack)stack;
            net.minecraft.server.v1_11_R1.ItemStack nmsstack = CraftItemStack.asNMSCopy(craftstack);
            return nmsstack.getItem() instanceof ItemArmor;
        }
     
    Последнее редактирование: 14 мар 2017
  9. OsipXD

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

    Баллы:
    173
    Skype:
    osip.fatkullin
    Имя в Minecraft:
    OsipXD
    Если норм использовать NMS, то покатит. А без NMS только смотреть материал, как было сделано выше.
     
  10. alexandrage

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

    Баллы:
    173
    Skype:
    alexandr0116
    С NMS универсально. Ибо в модах могут как угодно обозвать материал.
     
    Последнее редактирование: 15 мар 2017
  11. Автор темы
    Serrrgio

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

    Баллы:
    173
    Skype:
    nonecsa
    Имя в Minecraft:
    None
    всем спасибо за ответы, сервер без модов

    это я пытаюсь фиксить баги в Custom Enchantments на сервере 1.11.2

    пересобрал плагин под 1.11.2, но повылазило куча багов и пытливый ум игроков незамедлительно был направлен на нахождение и юзанье багов :)

    тот баг что пытаюсь зафиксить, есть зачарка, к примеру на броне Berserker, которая срабатывает если игроку наносится урон и у него остается здоровье меньше 4, при этом игроку на время дается эффект зелья силы уровня 4+ lvl Berserker (макс 5), по задумке автора это должно происходить когда броня с этой чаркой одета на игрока, но она срабатывает когда эта броня в руке (при получении дамага)
    что делают игроки, берут предмет в руку, прыгают с высоты и получают силу 4+5 = 9 (если Berserker 5 лвл) ложат шмот в сундук и 1 ударом руки выносят игроков в фул алмазке :)
     
  12. alexandrage

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

    Баллы:
    173
    Skype:
    alexandr0116
    Так у игрока же есть армор контейер. Вот в нем и чекай шмотки. Ну и во время снятия брони сразу удаляй еффект тот.
     
  13. Автор темы
    Serrrgio

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

    Баллы:
    173
    Skype:
    nonecsa
    Имя в Minecraft:
    None
    я бы рад сделать так, но переписывать пол плагина у меня нет ни желания ни знаний, могу только по мелочи править, добавить какие-то проверки...

    если есть возможность и желание, не мог бы ты посмотреть код плагина и подсказать, может как-то можно по другому фиксануть?

    автор уже год не обновлял плагин, и надежды что что-то пофиксится в ближайшее время нет.

    понимаю. что копаться в чужом коде приятностей мало, но все же хочу тебя попросить.

    https://github.com/Taiterio/ce

    я уже пофиксил часть багов, но с этим не получается, если ставлю проверку на бронь в руке, эфект вообще не срабатывает.
     
  14. alexandrage

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

    Баллы:
    173
    Skype:
    alexandr0116
    Когда он должен срабатывать? Во время получения дамага? И укажи где копать, чтоб мне не терять лишнее время.
     
  15. Автор темы
    Serrrgio

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

    Баллы:
    173
    Skype:
    nonecsa
    Имя в Minecraft:
    None
    по моему мнению, плагин написан через одно место, но может я чего-то не знаю
    я так думаю что изначально событие в CEListener.java
    Код:
    @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
    public void EntityDamageByEntityEvent(EntityDamageByEntityEvent e) {
    Entity damager = e.getDamager();
    Entity damaged = e.getEntity();
    // Block self damaging (Enderpearls cause weird behavior)
    if (damager.getUniqueId().equals(damaged.getUniqueId()))
    return;
    if (damaged instanceof Player)
    CEventHandler.handleEvent((Player) damaged, e, damageTaken);
    if (damager instanceof Player)
    CEventHandler.handleEvent((Player) damager, e, damageGiven);
    else if (damager instanceof Arrow)
    if (damager.hasMetadata("ce.bow.item") || damager.hasMetadata("ce.bow.enchantment"))
    CEventHandler.handleBows((Player) ((Projectile) damager).getShooter(), e);
      }
    вот тут CEventHandler.handleEvent((Player) damaged, e, damageTaken);
    и вобще этот CEventHandler.handleEvent вызывается из кучи мест, хрен там вобще разберешься
    CEventHandler.java
    Код:
    public static void handleEvent(Player toCheck, Event e, HashSet<CBasic> list) {
    long time = System.currentTimeMillis();
    for (ItemStack i : toCheck.getInventory().getArmorContents())
    if (i != null && i.getType() != Material.AIR)
    handleEventMain(toCheck, i, e, list);
    handleEventMain(toCheck, toCheck.getItemInHand(), e, list);
    if (Boolean.parseBoolean(Main.config.getString("Global.Logging.Enabled")) && Boolean.parseBoolean(Main.config.getString("Global.Logging.LogEvents"))) {
    long timeF = (System.currentTimeMillis() - time);
    if (timeF > Integer.parseInt(Main.config.getString("Global.Logging.MinimumMsForLog")))
    Bukkit.getConsoleSender().sendMessage(ChatColor.GOLD + "[CE] Event " + e.getEventName() + " took " + timeF + "ms to process CE-Events.");
    }
    }
    
    сначала в цикле проверяется одетая броня, и для каждого элемента вызывается handleEventMain котором вызывается ce.effect
    а потом вызывается handleEventMain(toCheck, toCheck.getItemInHand(), e, list);
    т.е. если броня с кастом в руке, то тоже срабатывает
    я добавлял проверку
    if (!isArmor(toCheck.getItemInHand())) handleEventMain(toCheck, toCheck.getItemInHand(), e, list);

    в этом случае каст вобще не срабатывает, хрен разберешься.
     
  16. alexandrage

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

    Баллы:
    173
    Skype:
    alexandr0116
    А для чего getItemInHand? Там же нет одетой брони. Для чего оно проверяется?
     
  17. Автор темы
    Serrrgio

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

    Баллы:
    173
    Skype:
    nonecsa
    Имя в Minecraft:
    None
    вот этого не знаю, возможно есть какие-то еще касты которые влияют на получаемый урон, когда какая-то вещь в руке, но то что там не должно быть брони - однозначно, каст Berserker накладывается только на броню, которая по идее должна быть одета а не в руке[DOUBLEPOST=1489580929,1489580773][/DOUBLEPOST]я так понимаю метод CEventHandler.handleEvent общий для всех событий, а дальше раскидывается в зависимости от назначения, тригеров и т.д.
     
  18. alexandrage

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

    Баллы:
    173
    Skype:
    alexandr0116
    Кек, ну кто так делает e.getAction().toString().startsWith("LEFT")?
    [​IMG][DOUBLEPOST=1489581574,1489581521][/DOUBLEPOST]Про это я ваще молчу.

    1) CEventHandler.handleEvent(p, e, interact, true);

    if (e.getAction().toString().startsWith("LEFT"))
    дубль) CEventHandler.handleEvent(p, e, interactL, true);
    else if (e.getAction().toString().startsWith("RIGHT")) {
    дубль) CEventHandler.handleEvent(p, e, interactR, true);
     
  19. Автор темы
    Serrrgio

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

    Баллы:
    173
    Skype:
    nonecsa
    Имя в Minecraft:
    None
    я же говорил, там капец, я уже с десяток багов/дюпов там поправил, и это еще не правил проверки на руки основня и другая, игроки тоже багают, берут лук во вторую руку а меч в основную, и эфекты с лука переносятся на меч...
     
  20. alexandrage

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

    Баллы:
    173
    Skype:
    alexandr0116
    Вот попробуй такой вариант https://cloud.mail.ru/public/23b1/BLwrEv13H[DOUBLEPOST=1489582697,1489582540][/DOUBLEPOST]
    Да потому что там устаревший одноручный метод был.
     
  21. Автор темы
    Serrrgio

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

    Баллы:
    173
    Skype:
    nonecsa
    Имя в Minecraft:
    None
    спс, доберусь до дома попробую
     

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