[1.14] Кастомные предметы

RemFex

Отключён
Пользователь
Добавил я как бы "свой" предмет, точнее - ботинки, ускоряющие игрока. Все бы ничего, но ускоряли они его даже когда игрок держит их в руках, а это не совсем то что мне нужно. Отредактировал код, посыпались ошибки. Получилось следующее (за главный класс не бить, это просто тест):


Java:
package plugin;

import org.bukkit.Material;
import org.bukkit.attribute.Attribute;
import org.bukkit.attribute.AttributeModifier;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.ShapedRecipe;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.java.JavaPlugin;

public class Main extends JavaPlugin {
    public void onEnable() {
        ItemStack boots = new ItemStack(Material.LEATHER_BOOTS);
        ItemMeta bootsmeta = boots.getItemMeta();
        bootsmeta.setDisplayName("§eУлучшенные кожанные ботинки");
        AttributeModifier movspeed = new AttributeModifier(1, "generic.Speed", 2, AttributeModifier.Operation.ADD_NUMBER, EquipmentSlot.FEET);
//ошибка The constructor AttributeModifier(int, String, int, AttributeModifier.Operation, EquipmentSlot) is undefined
        bootsmeta.addAttributeModifier(Attribute.GENERIC_MOVEMENT_SPEED, movspeed);
        boots.setItemMeta(bootsmeta);
        ShapedRecipe bootsrec = (new ShapedRecipe(boots)).shape(new String[] { "   ", "* *", "x x" })
                .setIngredient('*', Material.DIAMOND_BLOCK).setIngredient('x', Material.RABBIT_FOOT);
        getServer().addRecipe(bootsrec);
    }
}
1) Почему так? В доке это есть:
Java:
AttributeModifier(UUID uuid, String name, double amount, AttributeModifier.Operation operation, EquipmentSlot slot)
2) Как создать подобный предмет в предназначенном для него классе?
В Forge для этого есть регистратор предмета, но тут "новый" предмет является всего лишь слегка отредактированной версией старого. Вообще никаких мыслей по этому поводу.
 

BuseSo

Разработчик
Пользователь
Почему ты в первом аргументе передаёшь int, когда у тебя просят UUID?
Из-за этого и выходит ошибка.
AttributeModifier movspeed = new AttributeModifier(1, "generic.Speed", 2, AttributeModifier.Operation.ADD_NUMBER, EquipmentSlot.FEET);
Создать UUID можно таким простым кодом:
UUID uuid = UUID.randomUUID();
 

RemFex

Отключён
Пользователь
Соседик сказал что везде почему-то ставят 1, ну и я тоже поставил. Попробую, спасибо.
 

JHIID13

Пользователь
Java:
bootsmeta.addAttributeModifier(Attribute.GENERIC_MOVEMENT_SPEED, movspeed).setValues(1)
Могу по приходу домой скинуть код на полную настройку через нбт.И лучше выведи итем стак в другой метод что бы код в onEnable() читался лучше
Авто объединение сообщений:

Java:
public static ItemStack CustomItemStack() {
    ItemStack itemstack = new ItemStack(Material.STONE);
    ItemMeta m = itemstack.getItemMeta();
    m.setDisplayName("Имя предмета");
    //m.addItemFlags(ItemFlag.HIDE_ATTRIBUTES);//Скрывает присутвие флага
    ArrayList<String> li = new ArrayList<>();
    li.add("Лор");
    m.setLore(li);
    itemstack.setItemMeta(m);
    net.minecraft.server.v1_14_R1.ItemStack nmsStack = CraftItemStack.asNMSCopy(itemstack);//В этой строке выше мы создаем NMS ItemStack с именем nmsStack, который является копией стека элементов, который мы создали ранееа
    NBTTagCompound compound = (nmsStack.hasTag()) ? nmsStack.getTag() : new NBTTagCompound();// NMS может иметь значение NULL, поэтому мы должны проверить его.
    NBTTagList modifiers = new NBTTagList();//Уже работаем с листом теков
    ///////=================Дублируем если нужно несколько аттрибутов
    //---Создаём атрибут
    NBTTagCompound moves = new NBTTagCompound();
    moves.set("AttributeName", new NBTTagString("generic.movementSpeed"));//Лист атрибутов https://minecraft.gamepedia.com/Attribute
    moves.set("Name", new NBTTagString("generic.movementSpeed"));
    moves.set("Amount", new NBTTagDouble(0.15));//Значение в зависимости от типа атрибута стандартная скорость игрока 0.13
    moves.set("Operation", new NBTTagInt(0));
    moves.set("UUIDLeast", new NBTTagInt(90000));//Выставляй выше 90000++ Что бы при екиперовке нескольких итемов не повторялся UUIDLeast
    moves.set("UUIDMost", new NBTTagInt(8000));//==^== 8000++
    moves.set("Slot", new NBTTagString("mainhand"));//слоты mainhand offhand feet legs chest head
    // Добавляем атрибут
    modifiers.add(moves);
    ///////==================
    compound.set("AttributeModifiers", modifiers);
    (nmsStack).setTag(compound);
     return CraftItemStack.asBukkitCopy(nmsStack);

}
 
Последнее редактирование:

RemFex

Отключён
Пользователь
Спасибо, я уже сам разобрался. Забыл пометить что решено.
1 вопрос - зачем NMS?
Для добавления атрибутов в новых версиях есть meta.addAttributeModifier(@NotNull Attribute attribute, @NotNull AttributeModifier modifier в которой modifier так же содержит нужные значения (слот, операции и значение) AttributeModifier(UUID uuid, String name, double amount, AttributeModifier.Operation operation, EquipmentSlot slot)
 

JHIID13

Пользователь
Как знаешь, я юзаю потому что привык ,не из лучших привычка .
 

Комнаты в чате

Верх Низ