Make the base fuzzy cached per block type

This commit is contained in:
Matthew Miller 2018-12-27 15:33:19 +10:00
parent 8da984d9f9
commit b544782f3b
2 changed files with 16 additions and 3 deletions

View File

@ -48,6 +48,7 @@ public class BlockType {
private final String id;
private final Function<BlockState, BlockState> values;
private final AtomicReference<BlockState> defaultState = new AtomicReference<>();
private final AtomicReference<FuzzyBlockState> emptyFuzzy = new AtomicReference<>();
private final AtomicReference<Map<String, ? extends Property<?>>> properties = new AtomicReference<>();
private final AtomicReference<BlockMaterial> blockMaterial = new AtomicReference<>();
private final AtomicReference<Map<Map<Property<?>, Object>, BlockState>> blockStatesMap = new AtomicReference<>();
@ -156,6 +157,10 @@ public class BlockType {
});
}
public FuzzyBlockState getFuzzyMatcher() {
return updateField(emptyFuzzy, () -> new FuzzyBlockState(this));
}
/**
* Gets a list of all possible states for this BlockType.
*

View File

@ -37,11 +37,16 @@ public class FuzzyBlockState extends BlockState {
super(blockType);
}
@SuppressWarnings("unchecked")
@Override
public BlockState toImmutableState() {
/**
* Gets a full BlockState from this fuzzy one, filling in
* properties with default values where necessary.
*
* @return The full BlockState
*/
public BlockState getFullState() {
BlockState state = getBlockType().getDefaultState();
for (Map.Entry<Property<?>, Object> entry : getStates().entrySet()) {
//noinspection unchecked
state = state.with((Property<Object>) entry.getKey(), entry.getValue());
}
return getBlockType().getDefaultState();
@ -110,6 +115,9 @@ public class FuzzyBlockState extends BlockState {
*/
public FuzzyBlockState build() {
checkNotNull(internalState);
if (values.isEmpty()) {
return internalState.getBlockType().getFuzzyMatcher();
}
FuzzyBlockState blockState = new FuzzyBlockState(internalState.getBlockType());
for (Map.Entry<Property<?>, Object> entry : values.entrySet()) {
blockState.setState(entry.getKey(), entry.getValue());