Удаление Зачарований

Версия Minecraft
1.20.1
API
Forge
Я решил создать свою сборку модов
Она основана на технологических модах, по типу Create и Tinker's Construct, поэтому мне бы хотелось удалить зачарования из игры, чтобы соблюсти баланс, ибо сдешние мобы перестают представлять опасность при зачаровании сета брони на защиту, а потребность в огромных механизмах (тех же бурах) отпадает, когда появляется зачарованная кирка.

Я подумал решить эту проблему через KubeJS, потому что не хотел прибегать к такому объёмному программированию, но в связи с практически отсуствием информации или адекватной документации это не сработало и не помогли даже нейросети.


Мне бы хотелось знать, каким методом можно реализовать то что я задумал? Также мне бы хотелось не под корень выкашивать зачарования, а, допустим, при подборе зачарованного предмета или книги убирать с них чары автоматически и давать немного опыта. Подскажите, пожалуйста, стоит ли прибегать к дополнительному созданию мода для этого, или это можно просто сделать и в KubeJS?
 
Подскажите, пожалуйста, стоит ли прибегать к дополнительному созданию мода для этого, или это можно просто сделать и в KubeJS
Думаю, в KubeJS это невозможно.
Мне бы хотелось знать, каким методом можно реализовать то что я задумал?
Эвентами/Миксинами
при подборе зачарованного предмета или книги убирать с них чары автоматически и давать немного опыта
При подборе в PlayerEvent.ItemPickupEvent проверять предмет(ItemStack#isEnchanted), снимать чары и добавлять опыт.
При перемещение зачарованного предмета в инвентарь делать миксин(Возможно есть эвент для этого) который снимает чары и выдаёт опыт.

Кусок кода:
ItemStack stack = ...
if (stack.isEnchanted()) {
      stack.getTag().remove("Enchantments"); //Не уверен что это снесёт чары
      player.giveExperienceLevels(колвоуровней); // Опыт
}

Миксины.
 
Если делать через KubeJS, можешь попробовать так
Java:
onEvent('player.pickup_item', event => {
    const item = event.item;
    const player = event.player;

    // Проверка на чар
    if (item.hasEnchantments()) {
        const enchantments = item.getEnchantments();
        enchantments.forEach(enchantment => {
            item.removeEnchantment(enchantment);
        });
        player.giveExperience(кол-во опыта);
    }
});

Дальше уже можешь сам решать какое кол-во опыта выдавать.
2 примера у тебя есть, ты можешь попросту делать проверку на разные зачары и их уровни, чтоб не одинаково было.

Лучше используй пример @Mr.Toad, больше гибкости будет через мод.

Если рассматривать проверку на разные зачары, то можно так:
Java:
for (Map.Entry<Enchantment, Integer> entry : itemStack.getEnchantments().entrySet()) {
    Enchantment enchantment = entry.getKey();
    if (enchantment == Enchantments.SHARPNESS || enchantment == Enchantments.PROTECTION) {
        itemStack.removeEnchantment(enchantment);
    }
}
 
Думаю, в KubeJS это невозможно.

Эвентами/Миксинами

При подборе в PlayerEvent.ItemPickupEvent проверять предмет(ItemStack#isEnchanted), снимать чары и добавлять опыт.
При перемещение зачарованного предмета в инвентарь делать миксин(Возможно есть эвент для этого) который снимает чары и выдаёт опыт.

Кусок кода:
ItemStack stack = ...
if (stack.isEnchanted()) {
      stack.getTag().remove("Enchantments"); //Не уверен что это снесёт чары
      player.giveExperienceLevels(колвоуровней); // Опыт
}

Миксины.
Хорошо, сейчас попробую!
 
А насчёт конструкции OnEvent в KubeJS - мне это-же и советовал GPT, на деле выдает ошибку с тем, что метод устарел и больше не используется в новых версиях
Так как методов getEnchantments и removeEnchantment более не существует, всё теперь в nbt.


JavaScript:
//Чисто наобум, может сработает... 
onEvent('player.pickup_item', event => {
    const item = event.item;
    const player = event.player;

    // Проверка на чар
    if (item.isEnchanted()) {
      item.getTag().remove("Enchantments"); 
      player.giveExperienceLevels(кол-во уровней); 
    }
});
 
А насчёт конструкции OnEvent в KubeJS - мне это-же и советовал GPT, на деле выдает ошибку с тем, что метод устарел и больше не используется в новых версиях
Так как методов getEnchantments и removeEnchantment более не существует, всё теперь в nbt.


JavaScript:

//Чисто наобум, может сработает...
onEvent('player.pickup_item', event => {
const item = event.item;
const player = event.player;

// Проверка на чар
if (item.isEnchanted()) {
item.getTag().remove("Enchantments");
player.giveExperienceLevels(кол-во уровней);
}
});

Мои моды.
Нет, дело в том что сам OnEvent больше не поддерживается, есть только PlayerEvent и ServerEvent
 
Назад
Сверху