【问题标题】:Is there a way to cast enum into other enum?有没有办法将枚举转换为其他枚举?
【发布时间】:2021-10-28 09:45:15
【问题描述】:

我正在尝试为 1.7.10 制作一个 mod(我知道,已经过时,但我认为在这种情况下它并不重要)将一些 mod 与 CustomNPC 合并,基本上添加了一些看起来和像 CustomNPC 武器一样工作,但由不同的 mods 材料制成。由于某种原因,mod 提供的盾牌在其构造函数中需要一定的枚举:

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);
  }

枚举存储材料类型及其所有值。我不想自己编辑那个模组的代码,但我想给它添加更多的材料。有没有办法向该枚举添加一些东西,或者可能将具有不同材料的相同枚举转换为这种类型?

我已经找到了一种解决方法,方法是创建一个自定义屏蔽类,它只从我的自定义枚举中获取值,但我很好奇是否有一种方法可以在不添加新类的情况下做到这一点。

编辑

我想我会添加 mod 的 EnumNpcToolMaterial 以便更清楚地了解盾牌构造函数到底想要什么

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;
  }
}

【问题讨论】:

  • 你想从哪个材料类/枚举转换到哪个材料类/枚举?
  • @Elikill58 在创建自定义盾牌时,我想使用我的自定义相同枚举,或者至少我自己的自定义值来代替盾牌构造函数中编码的值
  • YourOtherEnum.valueOf(otherEnum.name()) 什么的
  • 仍然无法让它工作,eclipse没有错误,但是游戏无法启动并说“没有枚举常量”。我不确定我是否做对了所有事情,因为我对 java 还很陌生
  • @AHuIci:如果不修改代码并重新编译它,就无法真正添加到现有枚举中。枚举是 Java 中的正确类型,而不仅仅是美化的整数值(就像它们在某些其他语言中一样)。这意味着您也不能像这样“将一个枚举转换为另一个”。如果你不需要需要现有代码来处理你的新值,你也许可以做一些变通办法,但这对你来说似乎还不够。

标签: java enums minecraft minecraft-forge


【解决方案1】:

您正在寻找EnumHelper.addEnum。虽然在 Java 中没有官方支持的动态扩展 Enums 的方法,但在修改后的 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});

【讨论】:

  • 这既令人着迷又令人作呕 ;-) 这可能也是我不喜欢从事改装的原因之一。
猜你喜欢
  • 1970-01-01
  • 2020-08-21
  • 2021-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多