Есть ли способ перевести перечисление в другое перечисление?

#java #enums #minecraft #minecraft-forge

Вопрос:

Я пытаюсь создать мод для 1.7.10 (я знаю, устаревший, но я не думаю, что это имеет большое значение в данном контексте), объединив несколько модов с CustomNPC, в основном добавив несколько видов оружия, которые выглядели бы и работали как оружие CustomNPC, но были изготовлены из материалов разных модов. Щиты, которые предоставляет мод, по какой-то причине требуют определенного перечисления в их конструкторе:

 public class ItemShield extends ItemNpcInterface {

  public EnumNpcToolMaterial material;
  
  public ItemShield(int par1, EnumNpcToolMaterial material) {
    super(par1);
    this.material = material;
    setMaxDamage(material.getMaxUses());
    setCreativeTab((CreativeTabs)CustomItems.tabWeapon);
  }
 

В перечислении хранятся типы материалов и все их значения. Я не хочу редактировать код этого мода самостоятельно, но я хочу добавить в него еще несколько материалов. Есть ли способ добавить что-то в это перечисление или, может быть, добавить идентичное перечисление с разными материалами в этот тип?

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

Редактировать

Я думаю, что добавлю в мод EnumNpcToolМатериал, чтобы было более понятно, чего именно хочет конструктор щита

 public enum EnumNpcToolMaterial {
  WOOD(0, 59, 2.0F, 0, 15),
  STONE(1, 131, 4.0F, 1, 5),
  BRONZE(2, 170, 5.0F, 2, 15),
  IRON(2, 250, 6.0F, 2, 14),
  DIA(3, 1561, 8.0F, 3, 10),
  GOLD(0, 32, 12.0F, 1, 22),
  EMERALD(3, 1000, 8.0F, 4, 10),
  DEMONIC(3, 100, 8.0F, 6, 10),
  FROST(2, 59, 6.0F, 3, 5),
  MITHRIL(3, 3000, 8.0F, 3, 10);
  
  private final int harvestLevel;
  
  private final int maxUses;
  
  private final float efficiencyOnProperMaterial;
  
  private final int damageVsEntity;
  
  private final int enchantability;
  
  EnumNpcToolMaterial(int par3, int par4, float par5, int par6, int par7) {
    this.harvestLevel = par3;
    this.maxUses = par4;
    this.efficiencyOnProperMaterial = par5;
    this.damageVsEntity = par6;
    this.enchantability = par7;
  }
  
  public int getMaxUses() {
    return this.maxUses;
  }
  
  public float getEfficiencyOnProperMaterial() {
    return this.efficiencyOnProperMaterial;
  }
  
  public int getDamageVsEntity() {
    return this.damageVsEntity;
  }
  
  public int getHarvestLevel() {
    return this.harvestLevel;
  }
  
  public int getEnchantability() {
    return this.enchantability;
  }
}
 

Комментарии:

1. Вы хотите перейти от какого к какому классу/перечислению материалов ?

2. @Elikill58 Я хочу использовать свое собственное идентичное перечисление или, по крайней мере, свои собственные пользовательские значения вместо того, которое закодировано в конструкторе щита при создании моих пользовательских щитов

3. YourOtherEnum.valueOf(otherEnum.name()) или что-то еще

4. Все еще не могу заставить его работать, в eclipse нет ошибки, но игра не запускается и говорит, что «Нет константы перечисления». Я не совсем уверен, все ли я сделал правильно, потому что я довольно новичок в java

5. @AHuIci: вы действительно не можете добавить в существующее перечисление, не изменив код и не перекомпилировав его. Перечисления-это правильные типы в Java, а не просто прославленные целочисленные значения (как в некоторых других языках). Это означает, что вы также не можете просто «перебрасывать одно перечисление в другое», как это. Если вам не нужен существующий код для работы с вашими новыми значениями, вы, возможно, можете сделать некоторые обходные пути, но, похоже, вам этого недостаточно.

Ответ №1:

Ты ищешь EnumHelper.addEnum . Хотя официально не поддерживается способ динамического расширения Enum s в Java, в модифицированном Minecraft этого достаточно, чтобы Forge создал класс для автоматического выполнения всех необходимых для этого размышлений и хакерских действий. Вы бы использовали его вот так (непроверено):

 EnumNpcToolMaterial ADAMANT = EnumHelper.addEnum(EnumNpcToolMaterial.class, "ADAMANT", new Class<?>[]{int.class, int.class, float.class, int.class, int.class}, new Object[]{3, 5000, 15.0F, 10, 30});
 

Комментарии:

1. Это увлекательно и отвратительно одновременно 😉 Вероятно, это также одна из причин, по которой мне не понравилось бы заниматься моддингом.