Make modelRegistry.keySet() more accurate on Forge when dynamic resources is on

This commit is contained in:
embeddedt 2023-07-06 20:43:35 -04:00
parent db4f6738ee
commit 1b6880ed9f
No known key found for this signature in database
GPG Key ID: A69433EC199B5613
3 changed files with 76 additions and 4 deletions

View File

@ -0,0 +1,51 @@
package org.embeddedt.modernfix.forge.dynresources;
import com.google.common.collect.ForwardingMap;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.Item;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraftforge.registries.ForgeRegistries;
import org.embeddedt.modernfix.dynamicresources.ModelLocationCache;
import org.jetbrains.annotations.Nullable;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public class ModelBakeEventHelper {
public static Map<ResourceLocation, BakedModel> wrapRegistry(Map<ResourceLocation, BakedModel> modelRegistry) {
Set<ResourceLocation> topLevelModelLocations = new HashSet<>(modelRegistry.keySet());
for(Block block : ForgeRegistries.BLOCKS) {
for(BlockState state : block.getStateDefinition().getPossibleStates()) {
topLevelModelLocations.add(ModelLocationCache.get(state));
}
}
for(Item item : ForgeRegistries.ITEMS) {
topLevelModelLocations.add(ModelLocationCache.get(item));
}
return new ForwardingMap<ResourceLocation, BakedModel>() {
@Override
protected Map<ResourceLocation, BakedModel> delegate() {
return modelRegistry;
}
@Override
public Set<ResourceLocation> keySet() {
return topLevelModelLocations;
}
@Override
public boolean containsKey(@Nullable Object key) {
return topLevelModelLocations.contains(key) || super.containsKey(key);
}
@Override
public BakedModel put(ResourceLocation key, BakedModel value) {
topLevelModelLocations.add(key);
return super.put(key, value);
}
};
}
}

View File

@ -0,0 +1,22 @@
package org.embeddedt.modernfix.forge.mixin.perf.dynamic_resources;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.resources.ResourceLocation;
import net.minecraftforge.client.ForgeHooksClient;
import org.embeddedt.modernfix.forge.dynresources.ModelBakeEventHelper;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.ModifyVariable;
import java.util.Map;
@Mixin(ForgeHooksClient.class)
public class ForgeHooksClientMixin {
/**
* Generate a more realistic keySet that contains every item and block model location, to help with mod compat.
*/
@ModifyVariable(method = "onModelBake", at = @At("HEAD"), ordinal = 0, argsOnly = true)
private static Map<ResourceLocation, BakedModel> generateModelKeySet(Map<ResourceLocation, BakedModel> modelRegistry) {
return ModelBakeEventHelper.wrapRegistry(modelRegistry);
}
}

View File

@ -12,7 +12,6 @@ import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import team.chisel.ctm.CTM;
import team.chisel.ctm.client.model.AbstractCTMBakedModel;
@ -36,9 +35,9 @@ public abstract class TextureMetadataHandlerMixin implements ModernFixClientInte
ModernFixClient.CLIENT_INTEGRATIONS.add(this);
}
@Redirect(method = "onModelBake", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/resources/model/BakedModel;isCustomRenderer()Z"))
private boolean checkModelValid(BakedModel model) {
return model == null || model.isCustomRenderer();
@Inject(method = "onModelBake", at = @At("HEAD"), cancellable = true, remap = false)
private void noIteration(CallbackInfo ci) {
ci.cancel();
}
@Override