如何将现有的静态常量包装到枚举中?

时间:2017-04-13 14:32:24

标签: java minecraft

我将我的Minecraft块保护插件从Bukkit移植到Sponge,所以我可以用SpongeForge添加mods。 Bukkit使用Material枚举来识别游戏中的所有有效块类型。我的所有保护都在config.yml文件中指定,如下所示:

CHEST:
  Price: 0.75
  InteractMember: R
  ...

使用枚举可以很容易地在配置文件CHEST中获取keyname,并使用Bukkit.getMaterial(String name)获取实际的枚举值。不幸的是,Sponge拒绝在代码中的任何地方使用枚举,因此它们的块类型列表是一个只包含静态final int常量的类,我无法迭代或按名称检索。我试过反思..

HashMap<String,Integer> blockTypes = new HashMap<String,Integer>();

for(Field field, BlockTypes.class.getFields())
    blockMap.put(field.getName(), field.getInt(null));

但我只能得到常量的int值。我需要在代码中使用常量本身,如果不为静态常量创建自己的枚举包装器,我找不到任何方法:

public enum Blocks {
    ACACIA_FENCE(BlockTypes.ACACIA_FENCE),
    ACACIA_STEPS(BlockTypes.ACACIA_STEPS),
    ...
    YELLOW_FLOWER(BlockTypes.YELLOW_FLOWER);

    private final BlockTypes type;
    Blocks(BlockTypes type) {
        this.type = type;
    }
    public BlockTypes getType() { return type; }
    public static BlockTypes getByName(String name) {
        // retrieve enum by name
    }
}

我真的坚持这样做,还是我还缺少另一种方式?

1 个答案:

答案 0 :(得分:0)

Sponge没有使用枚举的原因是:因为你可以添加其他mods,必须动态添加常量(这是不可能的),并假设在vanilla游戏中的块是唯一的块不是有效的。支持其他mod是海绵API的主要目标之一。

如果您的目标是获取游戏中所有有效BlockType的列表,则应使用GameRegistry

// Getting a list of all types
Collection<BlockType> types = Sponge.getRegistry().getAllOf(BlockType.class)
for (BlockType type : types) {
    System.out.println(type.getName());
}

// Getting a single type by name
Optional<BlockType> type = Sponge.getRegistry().getType(BlockType.class, "minecraft:chest");
if (!type.isPresent()) {
    // show some error, as the given type doesn't exist
} else {
    return type.get();
}

您应该可以将BlockType用作地图中的关键字,或者使用String ID。你不应该为它做一个枚举(并且不能自动完成)。

值得注意的是,你在你的例子中也反映了错误的反思,但我不认为解释它现在需要如何使用它是非常重要的,因为那个&#39;这是错误的方法。