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

Serrrgio

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

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

может есть какие-то более оптимальные методы/алгоритмы?
 
или вот так
Java:
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;
}
 
Всяко есть, майн же как то определяет, можно поместить в слоты брони или нет.
 
Вот нашел.
Java:
    boolean isArmor(ItemStack stack) {
        CraftItemStack craftstack =  (CraftItemStack)stack;
        net.minecraft.server.v1_11_R1.ItemStack nmsstack = CraftItemStack.asNMSCopy(craftstack);
        return nmsstack.getItem() instanceof ItemArmor;
    }
 
Последнее редактирование:
Вот нашел.
Java:
    boolean isArmor(ItemStack stack) {
        CraftItemStack craftstack =  (CraftItemStack)stack;
        net.minecraft.server.v1_11_R1.ItemStack nmsstack = CraftItemStack.asNMSCopy(craftstack);
        return nmsstack.getItem() instanceof ItemArmor;
    }
Если норм использовать NMS, то покатит. А без NMS только смотреть материал, как было сделано выше.
 
Если норм использовать NMS, то покатит. А без NMS только смотреть материал, как было сделано выше.
С NMS универсально. Ибо в модах могут как угодно обозвать материал.
 
Последнее редактирование:
всем спасибо за ответы, сервер без модов

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

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

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

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

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

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

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

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

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

https://github.com/Taiterio/ce

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

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

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

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

https://github.com/Taiterio/ce

я уже пофиксил часть багов, но с этим не получается, если ставлю проверку на бронь в руке, эфект вообще не срабатывает.
Когда он должен срабатывать? Во время получения дамага? И укажи где копать, чтоб мне не терять лишнее время.
 
по моему мнению, плагин написан через одно место, но может я чего-то не знаю
я так думаю что изначально событие в CEListener.java
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
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);

в этом случае каст вобще не срабатывает, хрен разберешься.
 
по моему мнению, плагин написан через одно место, но может я чего-то не знаю
я так думаю что изначально событие в CEListener.java
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
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);

в этом случае каст вобще не срабатывает, хрен разберешься.
А для чего getItemInHand? Там же нет одетой брони. Для чего оно проверяется?
 
вот этого не знаю, возможно есть какие-то еще касты которые влияют на получаемый урон, когда какая-то вещь в руке, но то что там не должно быть брони - однозначно, каст Berserker накладывается только на броню, которая по идее должна быть одета а не в руке
я так понимаю метод CEventHandler.handleEvent общий для всех событий, а дальше раскидывается в зависимости от назначения, тригеров и т.д.
 
Кек, ну кто так делает e.getAction().toString().startsWith("LEFT")?
images

Про это я ваще молчу.

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);
 
я же говорил, там капец, я уже с десяток багов/дюпов там поправил, и это еще не правил проверки на руки основня и другая, игроки тоже багают, берут лук во вторую руку а меч в основную, и эфекты с лука переносятся на меч...
 
Вот попробуй такой вариант https://cloud.mail.ru/public/23b1/BLwrEv13H
я же говорил, там капец, я уже с десяток багов/дюпов там поправил, и это еще не правил проверки на руки основня и другая, игроки тоже багают, берут лук во вторую руку а меч в основную, и эфекты с лука переносятся на меч...
Да потому что там устаревший одноручный метод был.
 
спс, доберусь до дома попробую
 
Назад
Верх