Помогите Запрет экипировки брони

  • Автор темы Автор темы NeitExx
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

NeitExx

Активный участник
Пользователь
Баллы
61
Имя в Minecraft
NeitExx
Всем привет. Идея была такова: Если предмет имеет какой то определённый символ в описании, то не давать игроку одеть эту броню.
Но нормально реализовать это не получилось.

Если отменить ивент InventoryClickEvent, то предмет исчезнет. Пробовал после этого добавить этот предмет на курсор. На курсоре ничего не появлялось, а при закрытии инвентаря предмет выбрасывался. Если возвращать предмет через несколько миллисекунд, то предмет появляется на курсоре, но если положить предмет обратно в инвентарь и закрыть инвентарь, то предмет снова дропается из него.

Вопрос:
Как можно нормально реализовать "запрет экипировки"?
 
Ну во первых не один InventoryClickEvent нужно использовать. Еще есть таковой InventoryDragEvent, если ты зажмешь по слоту и проведешь, а потом отпустишь, первое событие не сработает. Потом клик ПКМ в руках вроде тоже надо добавлять и когда с раздатчика стреляет.
Если отменить ивент InventoryClickEvent, то предмет исчезнет.
Тут интересно. Вроде не должен исчезать. Какое ядро? Есть пример кода?
 
Ну во первых не один InventoryClickEvent нужно использовать. Еще есть таковой InventoryDragEvent, если ты зажмешь по слоту и проведешь, а потом отпустишь, первое событие не сработает. Потом клик ПКМ в руках вроде тоже надо добавлять и когда с раздатчика стреляет.

Тут интересно. Вроде не должен исчезать. Какое ядро? Есть пример кода?


Что то типо такого:

Player player = (Player) e.getWhoClicked();

if(e.getClickedInventory().equals(player.getInventory())){

if(e.getSlotType() == InventoryType.SlotType.ARMOR){
ItemStack itemStack = e.getCursor();

if (itemStack.getItemMeta() == null || itemStack.getItemMeta().getLore() == null || itemStack.getItemMeta().getDisplayName() == null) {
return;
}

int itemlevel = 0;

for (String lore : itemStack.getItemMeta().getLore()) {
if(lore.contains(ChatColor.GRAY + "Уровень предмета: ")){
itemlevel = getInteger(lore);
}

}
if(user.getLevel()<itemlevel){
e.setCancelled(true);
player.setItemOnCursor(itemStack);
return;
}



public static int getInteger(String lore){
int integer = 0;
String forInt;
forInt = ChatColor.stripColor(lore);
forInt = forInt.replaceAll("[^0-9]", "");
integer = Integer.parseInt(forInt);
return integer;
}
 
Если запустить новый поток и в нём через, например, 20 миллисекунд вставить предмет на курсор, то он будет виден. Но предмет всё равно будет выбрасываться при закрытии инвентаря.
 
Что то типо такого:

Player player = (Player) e.getWhoClicked();

if(e.getClickedInventory().equals(player.getInventory())){

if(e.getSlotType() == InventoryType.SlotType.ARMOR){
ItemStack itemStack = e.getCursor();

if (itemStack.getItemMeta() == null || itemStack.getItemMeta().getLore() == null || itemStack.getItemMeta().getDisplayName() == null) {
return;
}

int itemlevel = 0;

for (String lore : itemStack.getItemMeta().getLore()) {
if(lore.contains(ChatColor.GRAY + "Уровень предмета: ")){
itemlevel = getInteger(lore);
}

}
if(user.getLevel()<itemlevel){
e.setCancelled(true);
player.setItemOnCursor(itemStack);
return;
}



public static int getInteger(String lore){
int integer = 0;
String forInt;
forInt = ChatColor.stripColor(lore);
forInt = forInt.replaceAll("[^0-9]", "");
integer = Integer.parseInt(forInt);
return integer;
}
1. Код вставлять нужно адекватно, чтобы он читался, с отступами и т.д., заливать его в оболочку CODE или же на какой то паст закидать (privatebin / hastebin ...)
2. Инвентари лучше сравнивать через кастомный InventoryHolder (можно загуглить как)
3. Не сетай никакие предметы, просто отменяй ивент. Какая версия ядра? Как миниум от 1.8+ должно все быть адекватно.
 
Если запустить новый поток и в нём через, например, 20 миллисекунд вставить предмет на курсор, то он будет виден. Но предмет всё равно будет выбрасываться при закрытии инвентаря.
Понятно, что он будет сбрасываться, так как при закрытии инвентаря курсор всегда дропается.
 
1. Код вставлять нужно адекватно, чтобы он читался, с отступами и т.д., заливать его в оболочку CODE или же на какой то паст закидать (privatebin / hastebin ...)
2. Инвентари лучше сравнивать через кастомный InventoryHolder (можно загуглить как)
3. Не сетай никакие предметы, просто отменяй ивент. Какая версия ядра? Как миниум от 1.8+ должно все быть адекватно.
Версия 1.12.2
 
Извиняюсь, не та ситуация, узнавай тип инвентаря через InventoryType.
Может баг визуальный? Может предмет остается на месте, попробуй потыкать в слоты, где ты его брал и ставил. Ну он не может просто удаляться при отменении InventoryClickEvent это точно.
 
Извиняюсь, не та ситуация, узнавай тип инвентаря через InventoryType.
Может баг визуальный? Может предмет остается на месте, попробуй потыкать в слоты, где ты его брал и ставил. Ну он не может просто удаляться при отменении InventoryClickEvent это точно.

Видимо может
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх