1.19 does not allow changing RenderTypes at runtime
This commit is contained in:
parent
c8523b3844
commit
0af09b7e27
|
|
@ -32,12 +32,18 @@ import team.chisel.ctm.client.model.AbstractCTMBakedModel;
|
||||||
import team.chisel.ctm.client.util.CTMPackReloadListener;
|
import team.chisel.ctm.client.util.CTMPackReloadListener;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
@Mixin(CTMPackReloadListener.class)
|
@Mixin(CTMPackReloadListener.class)
|
||||||
public abstract class CTMPackReloadListenerMixin {
|
public abstract class CTMPackReloadListenerMixin {
|
||||||
|
/* caches the original render checks */
|
||||||
@Shadow @Final private static Map<IRegistryDelegate<Block>, Predicate<RenderType>> blockRenderChecks;
|
@Shadow @Final private static Map<IRegistryDelegate<Block>, Predicate<RenderType>> blockRenderChecks;
|
||||||
|
|
||||||
|
private static Map<IRegistryDelegate<Block>, Predicate<RenderType>> renderCheckOverrides = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
|
private static Predicate<RenderType> DEFAULT_PREDICATE = type -> type == RenderType.solid();
|
||||||
|
|
||||||
@Shadow protected abstract Predicate<RenderType> getLayerCheck(BlockState state, BakedModel model);
|
@Shadow protected abstract Predicate<RenderType> getLayerCheck(BlockState state, BakedModel model);
|
||||||
|
|
||||||
@Shadow protected abstract Predicate<RenderType> getExistingRenderCheck(Block block);
|
@Shadow protected abstract Predicate<RenderType> getExistingRenderCheck(Block block);
|
||||||
|
|
@ -49,8 +55,23 @@ public abstract class CTMPackReloadListenerMixin {
|
||||||
|
|
||||||
@Overwrite(remap = false)
|
@Overwrite(remap = false)
|
||||||
private void refreshLayerHacks() {
|
private void refreshLayerHacks() {
|
||||||
blockRenderChecks.forEach((b, p) -> ItemBlockRenderTypes.setRenderLayer((Block) b.get(), p));
|
renderCheckOverrides.clear();
|
||||||
blockRenderChecks.clear();
|
if(blockRenderChecks.isEmpty()) {
|
||||||
|
for(Block block : ForgeRegistries.BLOCKS.getValues()) {
|
||||||
|
Predicate<RenderType> original = this.getExistingRenderCheck(block);
|
||||||
|
if(original == null)
|
||||||
|
original = DEFAULT_PREDICATE;
|
||||||
|
blockRenderChecks.put(block.delegate, original);
|
||||||
|
ItemBlockRenderTypes.setRenderLayer(block, type -> this.useOverrideIfPresent(block.delegate, type));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean useOverrideIfPresent(IRegistryDelegate<Block> delegate, RenderType type) {
|
||||||
|
Predicate<RenderType> override = renderCheckOverrides.get(delegate);
|
||||||
|
if(override == null)
|
||||||
|
override = blockRenderChecks.get(delegate);
|
||||||
|
return override.test(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onModelBake(DynamicModelBakeEvent event) {
|
private void onModelBake(DynamicModelBakeEvent event) {
|
||||||
|
|
@ -58,7 +79,7 @@ public abstract class CTMPackReloadListenerMixin {
|
||||||
return;
|
return;
|
||||||
/* we construct a new ResourceLocation because an MRL is coming in */
|
/* we construct a new ResourceLocation because an MRL is coming in */
|
||||||
Block block = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(event.getLocation().getNamespace(), event.getLocation().getPath()));
|
Block block = ForgeRegistries.BLOCKS.getValue(new ResourceLocation(event.getLocation().getNamespace(), event.getLocation().getPath()));
|
||||||
if(block == null || block == Blocks.AIR || blockRenderChecks.containsKey(block.delegate))
|
if(block == null || block == Blocks.AIR || renderCheckOverrides.containsKey(block.delegate))
|
||||||
return;
|
return;
|
||||||
/* find all states that match this MRL */
|
/* find all states that match this MRL */
|
||||||
ImmutableList<BlockState> allStates;
|
ImmutableList<BlockState> allStates;
|
||||||
|
|
@ -71,8 +92,7 @@ public abstract class CTMPackReloadListenerMixin {
|
||||||
for(BlockState state : allStates) {
|
for(BlockState state : allStates) {
|
||||||
Predicate<RenderType> newPredicate = this.getLayerCheck(state, event.getModel());
|
Predicate<RenderType> newPredicate = this.getLayerCheck(state, event.getModel());
|
||||||
if(newPredicate != null) {
|
if(newPredicate != null) {
|
||||||
blockRenderChecks.put(block.delegate, this.getExistingRenderCheck(block));
|
renderCheckOverrides.put(block.delegate, newPredicate);
|
||||||
ItemBlockRenderTypes.setRenderLayer(block, newPredicate);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user