- 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 и копировать все переменные из одного объедка в другой, но эта идея тоже не особо удалась, из-за того, что, видимо, майнкрафт всё равно ссылается на один и тот же регистрационный объект и не даёт менять имя и регистрировать предмет. У кого-нибудь есть идеи, как можно по нормальному это реализовать?
Последнее редактирование: