Allow missing models on item overrides
Please ask your servers to stop shipping the client invalid model files. Related: #343
This commit is contained in:
parent
a186c956f7
commit
17fdccddfe
|
|
@ -0,0 +1,26 @@
|
||||||
|
package org.embeddedt.modernfix.common.mixin.perf.dynamic_resources;
|
||||||
|
|
||||||
|
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
|
||||||
|
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
|
||||||
|
import net.minecraft.client.renderer.block.model.ItemOverrides;
|
||||||
|
import net.minecraft.client.resources.model.ModelBaker;
|
||||||
|
import net.minecraft.client.resources.model.UnbakedModel;
|
||||||
|
import net.minecraft.resources.ResourceLocation;
|
||||||
|
import org.embeddedt.modernfix.annotation.ClientOnlyMixin;
|
||||||
|
import org.embeddedt.modernfix.duck.IExtendedModelBaker;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
|
||||||
|
@Mixin(ItemOverrides.class)
|
||||||
|
@ClientOnlyMixin
|
||||||
|
public class ItemOverridesMixin {
|
||||||
|
@WrapOperation(method = "bakeModel", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/resources/model/ModelBaker;getModel(Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/client/resources/model/UnbakedModel;"))
|
||||||
|
private UnbakedModel preventThrowForMissing(ModelBaker instance, ResourceLocation resourceLocation, Operation<UnbakedModel> original) {
|
||||||
|
boolean prevState = ((IExtendedModelBaker)instance).throwOnMissingModel(false);
|
||||||
|
try {
|
||||||
|
return original.call(instance, resourceLocation);
|
||||||
|
} finally {
|
||||||
|
((IExtendedModelBaker)instance).throwOnMissingModel(prevState);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -3,6 +3,7 @@ package org.embeddedt.modernfix.duck;
|
||||||
public interface IExtendedModelBaker {
|
public interface IExtendedModelBaker {
|
||||||
/**
|
/**
|
||||||
* Causes the ModelBaker to throw when it finds a missing model instead of proceeding with the bake.
|
* Causes the ModelBaker to throw when it finds a missing model instead of proceeding with the bake.
|
||||||
|
* @return the previous value of this flag
|
||||||
*/
|
*/
|
||||||
void throwOnMissingModel();
|
boolean throwOnMissingModel(boolean flag);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,31 @@
|
||||||
|
package org.embeddedt.modernfix.fabric.mixin.perf.dynamic_resources;
|
||||||
|
|
||||||
|
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
|
||||||
|
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
|
||||||
|
import net.minecraft.client.renderer.block.model.ItemOverrides;
|
||||||
|
import net.minecraft.client.resources.model.BakedModel;
|
||||||
|
import net.minecraft.client.resources.model.ModelBaker;
|
||||||
|
import net.minecraft.client.resources.model.ModelState;
|
||||||
|
import net.minecraft.resources.ResourceLocation;
|
||||||
|
import org.embeddedt.modernfix.annotation.ClientOnlyMixin;
|
||||||
|
import org.embeddedt.modernfix.duck.IExtendedModelBaker;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
|
||||||
|
@Mixin(ItemOverrides.class)
|
||||||
|
@ClientOnlyMixin
|
||||||
|
public class ItemOverridesFabricMixin {
|
||||||
|
/**
|
||||||
|
* @author embeddedt
|
||||||
|
* @reason servers insist on generating invalid item overrides that have missing models
|
||||||
|
*/
|
||||||
|
@WrapOperation(method = "bakeModel", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/resources/model/ModelBaker;bake(Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/client/resources/model/ModelState;)Lnet/minecraft/client/resources/model/BakedModel;"))
|
||||||
|
private BakedModel bake(ModelBaker instance, ResourceLocation resourceLocation, ModelState modelState, Operation<BakedModel> original) {
|
||||||
|
boolean prevState = ((IExtendedModelBaker)instance).throwOnMissingModel(false);
|
||||||
|
try {
|
||||||
|
return original.call(instance, resourceLocation, modelState);
|
||||||
|
} finally {
|
||||||
|
((IExtendedModelBaker)instance).throwOnMissingModel(prevState);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -59,8 +59,10 @@ public abstract class ModelBakerImplMixin implements IExtendedModelBaker {
|
||||||
private boolean throwIfMissing;
|
private boolean throwIfMissing;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void throwOnMissingModel() {
|
public boolean throwOnMissingModel(boolean flag) {
|
||||||
throwIfMissing = true;
|
boolean old = throwIfMissing;
|
||||||
|
throwIfMissing = flag;
|
||||||
|
return old;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "getModel", at = @At("HEAD"), cancellable = true)
|
@Inject(method = "getModel", at = @At("HEAD"), cancellable = true)
|
||||||
|
|
|
||||||
|
|
@ -310,7 +310,7 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery {
|
||||||
return m;
|
return m;
|
||||||
ModelBakery self = (ModelBakery) (Object) this;
|
ModelBakery self = (ModelBakery) (Object) this;
|
||||||
ModelBaker theBaker = self.new ModelBakerImpl(textureGetter, modelLocation);
|
ModelBaker theBaker = self.new ModelBakerImpl(textureGetter, modelLocation);
|
||||||
((IExtendedModelBaker)theBaker).throwOnMissingModel();
|
((IExtendedModelBaker)theBaker).throwOnMissingModel(true);
|
||||||
synchronized(this) { m = theBaker.bake(modelLocation, state); }
|
synchronized(this) { m = theBaker.bake(modelLocation, state); }
|
||||||
if(m != null)
|
if(m != null)
|
||||||
loadedBakedModels.put(key, m);
|
loadedBakedModels.put(key, m);
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,34 @@
|
||||||
|
package org.embeddedt.modernfix.forge.mixin.perf.dynamic_resources;
|
||||||
|
|
||||||
|
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
|
||||||
|
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
|
||||||
|
import net.minecraft.client.renderer.block.model.ItemOverrides;
|
||||||
|
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
|
||||||
|
import net.minecraft.client.resources.model.BakedModel;
|
||||||
|
import net.minecraft.client.resources.model.ModelBaker;
|
||||||
|
import net.minecraft.client.resources.model.ModelState;
|
||||||
|
import net.minecraft.resources.ResourceLocation;
|
||||||
|
import org.embeddedt.modernfix.annotation.ClientOnlyMixin;
|
||||||
|
import org.embeddedt.modernfix.duck.IExtendedModelBaker;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
@Mixin(ItemOverrides.class)
|
||||||
|
@ClientOnlyMixin
|
||||||
|
public class ItemOverridesForgeMixin {
|
||||||
|
/**
|
||||||
|
* @author embeddedt
|
||||||
|
* @reason servers insist on generating invalid item overrides that have missing models
|
||||||
|
*/
|
||||||
|
@WrapOperation(method = "bakeModel", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/resources/model/ModelBaker;bake(Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/client/resources/model/ModelState;Ljava/util/function/Function;)Lnet/minecraft/client/resources/model/BakedModel;"))
|
||||||
|
private BakedModel bake(ModelBaker instance, ResourceLocation resourceLocation, ModelState modelState, Function<ResourceLocation, TextureAtlasSprite> spriteGetter, Operation<BakedModel> original) {
|
||||||
|
boolean prevState = ((IExtendedModelBaker)instance).throwOnMissingModel(false);
|
||||||
|
try {
|
||||||
|
return original.call(instance, resourceLocation, modelState, spriteGetter);
|
||||||
|
} finally {
|
||||||
|
((IExtendedModelBaker)instance).throwOnMissingModel(prevState);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -41,8 +41,10 @@ public abstract class ModelBakerImplMixin implements IModelBakerImpl, IExtendedM
|
||||||
private boolean throwIfMissing;
|
private boolean throwIfMissing;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void throwOnMissingModel() {
|
public boolean throwOnMissingModel(boolean flag) {
|
||||||
throwIfMissing = true;
|
boolean old = throwIfMissing;
|
||||||
|
throwIfMissing = flag;
|
||||||
|
return old;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "getModel", at = @At("HEAD"), cancellable = true)
|
@Inject(method = "getModel", at = @At("HEAD"), cancellable = true)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user