Skip to content

Commit 5165cf2

Browse files
committed
Merge remote-tracking branch 'origin/1.19.4' into 1.20
2 parents 3df4109 + 2cb5acb commit 5165cf2

File tree

3 files changed

+43
-5
lines changed

3 files changed

+43
-5
lines changed

common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicBakedModelProvider.java

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,12 @@
99
import net.minecraft.client.resources.model.BakedModel;
1010
import net.minecraft.client.resources.model.BlockModelRotation;
1111
import net.minecraft.client.resources.model.ModelBakery;
12+
import net.minecraft.client.resources.model.ModelResourceLocation;
1213
import net.minecraft.core.Direction;
14+
import net.minecraft.core.registries.BuiltInRegistries;
1315
import net.minecraft.resources.ResourceLocation;
1416
import net.minecraft.util.RandomSource;
17+
import net.minecraft.world.level.block.Block;
1518
import net.minecraft.world.level.block.state.BlockState;
1619
import org.apache.commons.lang3.tuple.Triple;
1720
import org.embeddedt.modernfix.duck.IExtendedModelBakery;
@@ -106,6 +109,25 @@ public boolean containsKey(Object o) {
106109
public boolean containsValue(Object o) {
107110
return permanentOverrides.containsValue(o) || bakedCache.containsValue(o);
108111
}
112+
113+
private static boolean isVanillaTopLevelModel(ResourceLocation location) {
114+
if(location instanceof ModelResourceLocation) {
115+
try {
116+
ModelResourceLocation mrl = (ModelResourceLocation)location;
117+
ResourceLocation registryKey = new ResourceLocation(mrl.getNamespace(), mrl.getPath());
118+
// check for standard inventory model
119+
if(mrl.getVariant().equals("inventory") && BuiltInRegistries.ITEM.containsKey(registryKey))
120+
return true;
121+
Optional<Block> blockOpt = BuiltInRegistries.BLOCK.getOptional(registryKey);
122+
if(blockOpt.isPresent()) {
123+
return ModelBakeryHelpers.getBlockStatesForMRL(blockOpt.get().getStateDefinition(), mrl).size() > 0;
124+
}
125+
} catch(RuntimeException ignored) {
126+
// can occur if the MRL is not valid for that blockstate, ignore
127+
}
128+
}
129+
return false;
130+
}
109131

110132
@Override
111133
public BakedModel get(Object o) {
@@ -120,11 +142,11 @@ public BakedModel get(Object o) {
120142
model = missingModel;
121143
}
122144
if(model == missingModel) {
123-
// to correctly emulate the original map, we return null for missing models
124-
permanentOverrides.put((ResourceLocation) o, null);
125-
return null;
126-
} else
127-
return model;
145+
// to correctly emulate the original map, we return null for missing models, unless they are top-level
146+
model = isVanillaTopLevelModel((ResourceLocation)o) ? model : null;
147+
permanentOverrides.put((ResourceLocation) o, model);
148+
}
149+
return model;
128150
}
129151
}
130152

fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/ModelBakeryMixin.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,14 @@ private ImmutableList<BlockState> fetchBlocks(StateDefinition<Block, BlockState>
174174
return ImmutableList.of();
175175
}
176176

177+
/**
178+
* Make a copy of the top-level model list to avoid CME if more models get loaded here.
179+
*/
180+
@Redirect(method = "<init>", at = @At(value = "INVOKE", target = "Ljava/util/Map;values()Ljava/util/Collection;", ordinal = 0))
181+
private Collection<?> copyTopLevelModelList(Map<?, ?> map) {
182+
return new ArrayList<>(map.values());
183+
}
184+
177185
private BiFunction<ResourceLocation, Material, TextureAtlasSprite> textureGetter;
178186

179187
@Inject(method = "bakeModels", at = @At("HEAD"))

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,14 @@ private ImmutableList<BlockState> fetchBlocks(StateDefinition<Block, BlockState>
146146
return ImmutableList.of();
147147
}
148148

149+
/**
150+
* Make a copy of the top-level model list to avoid CME if more models get loaded here.
151+
*/
152+
@Redirect(method = "<init>", at = @At(value = "INVOKE", target = "Ljava/util/Map;values()Ljava/util/Collection;", ordinal = 0))
153+
private Collection<?> copyTopLevelModelList(Map<?, ?> map) {
154+
return new ArrayList<>(map.values());
155+
}
156+
149157
private BiFunction<ResourceLocation, Material, TextureAtlasSprite> textureGetter;
150158

151159
@Inject(method = "bakeModels", at = @At("HEAD"))

0 commit comments

Comments
 (0)