Make modelRegistry.keySet() more accurate on Forge when dynamic resources is on
This commit is contained in:
parent
db4f6738ee
commit
1b6880ed9f
|
|
@ -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);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -12,7 +12,6 @@ import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
import team.chisel.ctm.CTM;
|
import team.chisel.ctm.CTM;
|
||||||
import team.chisel.ctm.client.model.AbstractCTMBakedModel;
|
import team.chisel.ctm.client.model.AbstractCTMBakedModel;
|
||||||
|
|
@ -36,9 +35,9 @@ public abstract class TextureMetadataHandlerMixin implements ModernFixClientInte
|
||||||
ModernFixClient.CLIENT_INTEGRATIONS.add(this);
|
ModernFixClient.CLIENT_INTEGRATIONS.add(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Redirect(method = "onModelBake", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/resources/model/BakedModel;isCustomRenderer()Z"))
|
@Inject(method = "onModelBake", at = @At("HEAD"), cancellable = true, remap = false)
|
||||||
private boolean checkModelValid(BakedModel model) {
|
private void noIteration(CallbackInfo ci) {
|
||||||
return model == null || model.isCustomRenderer();
|
ci.cancel();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user