我将我的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
}
}
我真的坚持这样做,还是我还缺少另一种方式?
答案 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;这是错误的方法。