2017-04-13 6 views
0

私は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 
    } 
} 

私は本当にこれをやって立ち往生したり、別のがあるアム私は行方不明ですか?

答えて

0

Spongeは理由のためにenumを使用しません:あなたは他のモッズを追加することができるので、定数を動的に追加することはできません(不可能です)、バニラゲームのブロックは唯一のブロック有効です。他の改造をサポートすることは、スポンジAPIの主な目標の1つです。

あなたの目標は、ゲーム内のすべての有効な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を使用することができ、あるいはすべきですidはStringです。列挙型にする必要はありません(自動的に行うことはできません)。

あなたの例でも反射を間違って使用していることに注目しておきたいと思いますが、間違ったアプローチとして、今すぐ使用する必要があることを説明することはあまり重要ではないと思います。

+0

偉大な答え、ありがとうございます! BlockTypeクラスとBlockTypesクラスの関係はわかりませんでした。 CatalogTypeインターフェイスがどのように機能していたかは分かりませんでしたが、今はそうです!それでもスポンジにはまだまだ新しく、もう少し詳しく学ぶことができます。私は、このカタログ化の方法が列挙型を使うよりはるかに柔軟である方法を見ています。そして、はい反射コードは非常に貧しい私は一緒にそれを動作させるために何かを取得しようと投げた。 –

関連する問題