2017-04-13 1 views
0

내 Minecraft 블록 보호 플러그인을 Bukkit에서 Sponge로 이식하므로 SpongeForge에서 개조 기능을 추가 할 수 있습니다. Bukkit은 머티리얼 enum을 사용하여 게임에서 유효한 모든 블록 유형을 식별합니다. 내 모든 보호는이 같은 config.yml 파일에 지정된 : 열거와 어떻게 기존 정적 상수를 열거 형에 래핑 할 수 있습니까?

CHEST: 
    Price: 0.75 
    InteractMember: R 
    ... 

이는 config 파일에서 키 이름, CHEST을하고, (Bukkit.getMaterial와 실제 열거 값을 얻기 위해 매우 쉬웠다 문자열 이름). 불행히도 Sponge는 코드에서 어디서나 enum을 사용하지 않기 때문에 블록 유형 목록은 static 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 
    } 
} 

난 정말이 일을 붙어 또는 AM이 다른있다 : 나는 자신이 코드에서 사용하고, 나는 정적 상수에 대한 내 자신의 열거 래퍼를하지 않고 그렇게 할 수있는 방법을 찾을 수없는 상수가 필요합니다 나는 실종 됐어?

답변

0

스폰지는 이유 때문에 enum을 사용하지 않습니다. 다른 MOD를 추가 할 수 있기 때문에 상수를 동적으로 추가해야합니다 (가능하지 않음). 바닐라 게임의 블록이 유일한 블록이라고 가정합니다. 유효한. 다른 mods에 대한 지원은 스폰지 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을 사용할 수, 또는 대안한다 id는 String입니다. 열거 형을 생성 할 필요가 없으며 자동으로 열거 할 수 없습니다.

예를 들어 리플렉션을 잘못 사용하고 있다는 점에 유의할만한 가치가 있지만, 잘못된 접근 방식이므로 지금 당장 사용해야하는 방법을 설명하는 것이 너무 중요하지 않다고 생각합니다.

+0

위대한 답변, 감사합니다! BlockType과 BlockTypes 클래스 사이의 관계를 알지 못했습니다. 나는 또한 CatalogType 인터페이스가 어떻게 작동했는지 알지 못했다. 아직도 스폰지를 처음 접했을 때 배울 점이 많습니다. 나는이 카탈로그를 만드는 방법이 enum을 사용하는 것보다 훨씬 융통성이 있다는 것을 알고있다. 그리고 예 반사 코드는 매우 가난했습니다. 나는 그것을 함께 던져서 일할 무언가를 얻으 려합니다. –

관련 문제