私はMinkeraftブロック保護プラグインをBukkitからSpongeに移植していますので、SpongeForgeで改造を加えることができます。 Bukkitはマテリアル列挙型を使用して、ゲーム内のすべての有効なブロックタイプを識別します。 (、設定ファイルでキー名を取ることは非常に簡単でした列挙型で既存の静的定数を列挙にラップするにはどうすればよいですか?
CHEST:
Price: 0.75
InteractMember: R
...
CHEST、およびBukkit.getMaterialと実際の列挙型の値を取得する:すべての私の保護は、このようなconfig.ymlファイルで指定されています文字列名)。残念ながら、Spongeはコード内のどこでもenumを使用することを拒否しているため、ブロックタイプのリストは静的な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
}
}
私は本当にこれをやって立ち往生したり、別のがあるアム私は行方不明ですか?
偉大な答え、ありがとうございます! BlockTypeクラスとBlockTypesクラスの関係はわかりませんでした。 CatalogTypeインターフェイスがどのように機能していたかは分かりませんでしたが、今はそうです!それでもスポンジにはまだまだ新しく、もう少し詳しく学ぶことができます。私は、このカタログ化の方法が列挙型を使うよりはるかに柔軟である方法を見ています。そして、はい反射コードは非常に貧しい私は一緒にそれを動作させるために何かを取得しようと投げた。 –