копирование синглтона ванильного предмета

Версия Minecraft
1.18.1
API
Forge
647
74
187
У меня есть код динамической регистрации предметов, полностью копирующих ванильные аналоги, но имеющих другое регистрационное имя, материал и вытекающие из него же параметры типа прочности и урона. Сейчас делаю это максимально по тупому, рефлексией создавая новый инстанс конструктора. Хоть и работает, но эта реализация мне вообще не нравится.
Java:
public static Item tryToCreate(Item input) {
    if (input instanceof ArmorItem iof)
      return new ArmorItem(AmethystToolsMod.buildArmorMaterial(iof.getMaterial()), iof.getSlot(), AmethystToolsMod.buildProperties(input)) {
        @Override
        @OnlyIn(Dist.CLIENT)
        public String getArmorTexture(ItemStack stack, Entity entity, EquipmentSlot slot, String type) {
          return AmethystToolsMod.MODID + ":textures/models/" + this.getMaterial().getName() + "_layer_" + (slot != EquipmentSlot.LEGS ? 1 : 2) + ".png";
        }
      };
    else if (input instanceof TieredItem iof) {
      Object attackDamage = (iof instanceof DiggerItem iof1 ? iof1.getAttackDamage() : ((SwordItem) iof).getDamage()) - iof.getTier().getAttackDamageBonus();
      Constructor constructor = input.getClass().getDeclaredConstructors()[0];
      if (constructor.getParameterTypes()[1] == int.class)
        attackDamage = ((Float) attackDamage).intValue();
      try {
        return (Item) constructor.newInstance(AmethystToolsMod.buildTier(iof.getTier()), attackDamage,
            (float) input.getDefaultInstance().getAttributeModifiers(EquipmentSlot.MAINHAND).get(Attributes.ATTACK_SPEED).toArray(AttributeModifier[]::new)[0].getAmount(),
            AmethystToolsMod.buildProperties(input));
      } catch (Exception exception) {
        exception.printStackTrace();
      }
    }
    return null;
  }
}
Пытался создавать новый инстанс через пустой конструктор с помощью sun.reflection.ReflectionFactory и копировать все переменные из одного объедка в другой, но эта идея тоже не особо удалась, из-за того, что, видимо, майнкрафт всё равно ссылается на один и тот же регистрационный объект и не даёт менять имя и регистрировать предмет. У кого-нибудь есть идеи, как можно по нормальному это реализовать?
 
Последнее редактирование:
Судя по названию, это простой мод для создания инструментов из другого материала. Так зачем добавлять так предметы если их всего лишь пять штук? Ещё модельки нужно будет им подкрчивать вручную.
 
У меня мод заключается в улучшении нескольких типов инструментов с помощью аметиста на столе кузнеца, там уже объектов побольше получится, +мне это может пригодится для такой же манипуляции с предметами из пр. модов
 
можно обычным инструментам добавлять NBT-тэг и менять модель предметов с этим тэгом.
Так и нужно. Тем более, цель сделать прокачку имеющегося оружия. Логично его и изменять, а не создавать новые предметы.
 
Вот у меня была эта идея, но проблема в том, что мод уже 4 месяц в паблике, и резко выкатить такую обнову с нбт я не могу, поэтому мне приходится придерживаться такого принципа и дальше, чтоб люди у себя пропавшие вещи не обнаружили. Разве что, есть способ заменить все экземпляры удалённых моих предметов на ванильные с уже измененным тегом? Тогда я мог бы копать в это направление. (с мобилы нечаянно решение поставил, вроде убрал)
 
Норм звучит, попробую, но меня в таком случае все равно смущает код, который я использую сейчас. Есть советы как оптимизировать его? Меня интересует тот кусок кода, где я проверяю 2 параметр конструктора на интегер, из-за того что у майна в нескольких наследниках DiggerItem конструктор принимает интегер и в вызове супер-конструктора кастует его в флот, чего в других классах нет. Хотелось бы напоследок узнать тогда, как можно и нужно ли избежать эту некрасивую часть кода
 
Назад
Сверху