Установка состояния каждого экземпляра оружия.

Версия Minecraft
1.12.2
API
Forge
112
5
16
Доброго времени уток всем читающим.
У меча есть мапа с его хар-ками, при каждом ударе я переписываю в ней значение при определенных условиях, допустим если убиваешь свинью, то меч бьет быстрее, больнее и т.п. Делаю это прямо в классе меча в методе getItemAttributeModifiers().
Всё отлично работает, но есть беда. Статы прибавляются всем таким мечам, а не этом экземпляру, что логично :/
Может кто знает, как избежать этого дела и изменять только для ОДНОГО экземпляра?
Спасибо.
 
Решение
Сорри. Нужный метод в классе Item называется getAttributeModifiers. Он принимает в аргументах EntityEquipmentSlot и ItemStack, а возвращает мапу атрибутов.
То, что тебе нужно - переопределить этот метод у себя в предмете и возвращать нужные атрибуты в зависимости от аргументов. Посмотри ItemTool#getItemAttributeModifiers - там аналогично, но не чувствительно к итемстаку и его нбт
7,099
324
1,510
Экземпляры Item - синглтоны. Конкретная стопка предметов - это ItemStack. У ItemStack есть нбт-тэг - способ хранения дополнительные данные, уникальные для конкретной стопки. Таким образом, тебе нужно хранить харки меча не в поле класса меча, а в нбт итемстака
Чекни ItemStack#getTagCompound, ItemStack#hasTagCompound, ItemStack#setTagCompound, NBTTagCompound
 
112
5
16
Чёт я не очень понял. NBT таг будет хранить мои значения, но каким образом мне присваивать его мечу?
Если addItemAttributeModifiers() будет постоянно добавлять, а удалить модификатор у меня что-то не очень получается.
Тупо костыльно добавлять отрицательное ускорение, чтобы компенсировать ?)
 
7,099
324
1,510
Обычно у предметов нету нбт.
Есть два распространенных варианта:
Java:
if(!stack.hasTagCompound())
    stack.setTagCompound(new NBTTagCompound());

stack.getTagCompound().setString("key","value");
Java:
stack.getOrCreateSubtag("data").setString("key","value");
 

tox1cozZ

aka Agravaine
8,456
598
2,892
Если addItemAttributeModifiers() будет постоянно добавлять, а удалить модификатор у меня что-то не очень получается.
Этот метод сам вызывается. Когда берешь в руки предмет - добавляет атрибуты; когда убираешь с рук - сам удаляет.
 
112
5
16
Зачем их удалять? Они сами удаляются когда надо...
Как это? Я пример приведу, так проще наверное будет.
Если я начинаю бить зомби, то первый удар назначает NBT tag на зомби.
Второй удар проверяет, бью ли я того же зомби, если да, то +0.1 скорость атаки.
Если нет, то - столько скорости атаки, сколько я успел настакать на нём.
Но вместо добавления отрицательного бонуса( т.е. - настаканная скорость атаки), я хотел бы удалять эти модификаторы вообще, чтоб они просто не занимали описание предмета.
 
112
5
16
Просто сделай addItemAttributeModifiers зависящим от нбт предмета
Может я слишком глуп, чтобы понять это, но

Java:
 mainHand.addAttributeModifier(
                                SharedMonsterAttributes.ATTACK_SPEED.getName(), new AttributeModifier(
                                        UUID.fromString("FA233E1C-4180-4865-B01B-BCCE9785ACA3"),
                                        "Weapon modifier",
                                        mainHand.getTagCompound().getInteger("AttackSpeed"),
                                        0
                                ),
                                EntityEquipmentSlot.MAINHAND
                        );
Один раз выставляет скорость атаки, а потом никогда не изменяется.
 
7,099
324
1,510
Сорри. Нужный метод в классе Item называется getAttributeModifiers. Он принимает в аргументах EntityEquipmentSlot и ItemStack, а возвращает мапу атрибутов.
То, что тебе нужно - переопределить этот метод у себя в предмете и возвращать нужные атрибуты в зависимости от аргументов. Посмотри ItemTool#getItemAttributeModifiers - там аналогично, но не чувствительно к итемстаку и его нбт
 
112
5
16
То, что тебе нужно - переопределить этот метод у себя в предмете и возвращать нужные атрибуты в зависимости от аргументов. Посмотри ItemTool#getItemAttributeModifiers - там аналогично, но не чувствительно к итемстаку и его нбт
Так, я наверное не очень конкретно задал вопрос.
Я в EntityHurtEvent, чекаю, ударил ли игрок держа мой предмет в руке.
Если да, то я даю предмету NBT тэг с указанием конкретного моба.
Идёт проверка, если NBT тэг с таким значением уже есть, то нужно увеличить скорость атаки предмета.
Но опять же, addAttributeModifiers просто не работают)

UPD
+ Этот метод возвращает мультимапу и я не уверен, что я меняю её, а не её копию.
 

tox1cozZ

aka Agravaine
8,456
598
2,892
Дак верни просто нужное значения относительно нбт предмета и всё. Метод, вроде, вызывается когда предмет меняется. То есть при изменении нбт стака из ивента ты триггеришь метод getItemAttributeModifiers
 
112
5
16
Дак верни просто нужное значения относительно нбт предмета и всё. Метод, вроде, вызывается когда предмет меняется. То есть при изменении нбт стака из ивента ты триггеришь метод getItemAttributeModifiers
Ты имеешь ввиду в самом КЛАССЕ предмета это делать?
UPD

Или я туплю жестко?
 
Сверху