Skip to content

Commit 1b6880e

Browse files
committed
Make modelRegistry.keySet() more accurate on Forge when dynamic resources is on
1 parent db4f673 commit 1b6880e

File tree

3 files changed

+76
-4
lines changed

3 files changed

+76
-4
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package org.embeddedt.modernfix.forge.dynresources;
2+
3+
import com.google.common.collect.ForwardingMap;
4+
import net.minecraft.client.resources.model.BakedModel;
5+
import net.minecraft.resources.ResourceLocation;
6+
import net.minecraft.world.item.Item;
7+
import net.minecraft.world.level.block.Block;
8+
import net.minecraft.world.level.block.state.BlockState;
9+
import net.minecraftforge.registries.ForgeRegistries;
10+
import org.embeddedt.modernfix.dynamicresources.ModelLocationCache;
11+
import org.jetbrains.annotations.Nullable;
12+
13+
import java.util.HashSet;
14+
import java.util.Map;
15+
import java.util.Set;
16+
17+
public class ModelBakeEventHelper {
18+
public static Map<ResourceLocation, BakedModel> wrapRegistry(Map<ResourceLocation, BakedModel> modelRegistry) {
19+
Set<ResourceLocation> topLevelModelLocations = new HashSet<>(modelRegistry.keySet());
20+
for(Block block : ForgeRegistries.BLOCKS) {
21+
for(BlockState state : block.getStateDefinition().getPossibleStates()) {
22+
topLevelModelLocations.add(ModelLocationCache.get(state));
23+
}
24+
}
25+
for(Item item : ForgeRegistries.ITEMS) {
26+
topLevelModelLocations.add(ModelLocationCache.get(item));
27+
}
28+
return new ForwardingMap<ResourceLocation, BakedModel>() {
29+
@Override
30+
protected Map<ResourceLocation, BakedModel> delegate() {
31+
return modelRegistry;
32+
}
33+
34+
@Override
35+
public Set<ResourceLocation> keySet() {
36+
return topLevelModelLocations;
37+
}
38+
39+
@Override
40+
public boolean containsKey(@Nullable Object key) {
41+
return topLevelModelLocations.contains(key) || super.containsKey(key);
42+
}
43+
44+
@Override
45+
public BakedModel put(ResourceLocation key, BakedModel value) {
46+
topLevelModelLocations.add(key);
47+
return super.put(key, value);
48+
}
49+
};
50+
}
51+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package org.embeddedt.modernfix.forge.mixin.perf.dynamic_resources;
2+
3+
import net.minecraft.client.resources.model.BakedModel;
4+
import net.minecraft.resources.ResourceLocation;
5+
import net.minecraftforge.client.ForgeHooksClient;
6+
import org.embeddedt.modernfix.forge.dynresources.ModelBakeEventHelper;
7+
import org.spongepowered.asm.mixin.Mixin;
8+
import org.spongepowered.asm.mixin.injection.At;
9+
import org.spongepowered.asm.mixin.injection.ModifyVariable;
10+
11+
import java.util.Map;
12+
13+
@Mixin(ForgeHooksClient.class)
14+
public class ForgeHooksClientMixin {
15+
/**
16+
* Generate a more realistic keySet that contains every item and block model location, to help with mod compat.
17+
*/
18+
@ModifyVariable(method = "onModelBake", at = @At("HEAD"), ordinal = 0, argsOnly = true)
19+
private static Map<ResourceLocation, BakedModel> generateModelKeySet(Map<ResourceLocation, BakedModel> modelRegistry) {
20+
return ModelBakeEventHelper.wrapRegistry(modelRegistry);
21+
}
22+
}

forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ctm/TextureMetadataHandlerMixin.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
import org.spongepowered.asm.mixin.Shadow;
1313
import org.spongepowered.asm.mixin.injection.At;
1414
import org.spongepowered.asm.mixin.injection.Inject;
15-
import org.spongepowered.asm.mixin.injection.Redirect;
1615
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
1716
import team.chisel.ctm.CTM;
1817
import team.chisel.ctm.client.model.AbstractCTMBakedModel;
@@ -36,9 +35,9 @@ private void subscribeDynamic(CallbackInfo ci) {
3635
ModernFixClient.CLIENT_INTEGRATIONS.add(this);
3736
}
3837

39-
@Redirect(method = "onModelBake", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/resources/model/BakedModel;isCustomRenderer()Z"))
40-
private boolean checkModelValid(BakedModel model) {
41-
return model == null || model.isCustomRenderer();
38+
@Inject(method = "onModelBake", at = @At("HEAD"), cancellable = true, remap = false)
39+
private void noIteration(CallbackInfo ci) {
40+
ci.cancel();
4241
}
4342

4443
@Override

0 commit comments

Comments
 (0)