Merge remote-tracking branch 'origin/1.18' into 1.19.2
This commit is contained in:
commit
3fed2ef08d
|
|
@ -0,0 +1,21 @@
|
||||||
|
package org.embeddedt.modernfix.common.mixin.perf.dynamic_resources;
|
||||||
|
|
||||||
|
import net.minecraft.client.renderer.block.model.ItemOverrides;
|
||||||
|
import net.minecraft.client.resources.model.BakedModel;
|
||||||
|
import org.embeddedt.modernfix.dynamicresources.ItemOverrideBakedModel;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||||
|
|
||||||
|
@Mixin(ItemOverrides.class)
|
||||||
|
public class ItemOverridesMixin {
|
||||||
|
@Inject(method = "resolve", at = @At("RETURN"), cancellable = true)
|
||||||
|
private void getRealModel(CallbackInfoReturnable<BakedModel> cir) {
|
||||||
|
BakedModel original = cir.getReturnValue();
|
||||||
|
if(original instanceof ItemOverrideBakedModel) {
|
||||||
|
ItemOverrideBakedModel override = (ItemOverrideBakedModel)original;
|
||||||
|
cir.setReturnValue(override.getRealModel());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -31,6 +31,8 @@ public class ModernFixEarlyConfig {
|
||||||
private final Map<String, Option> options = new HashMap<>();
|
private final Map<String, Option> options = new HashMap<>();
|
||||||
private final Multimap<String, Option> optionsByCategory = HashMultimap.create();
|
private final Multimap<String, Option> optionsByCategory = HashMultimap.create();
|
||||||
|
|
||||||
|
private static final boolean ALLOW_OVERRIDE_OVERRIDES = Boolean.getBoolean("modernfix.unsupported.allowOverriding");
|
||||||
|
|
||||||
public static final boolean OPTIFINE_PRESENT;
|
public static final boolean OPTIFINE_PRESENT;
|
||||||
|
|
||||||
private File configFile;
|
private File configFile;
|
||||||
|
|
@ -263,6 +265,9 @@ public class ModernFixEarlyConfig {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void readProperties(Properties props) {
|
private void readProperties(Properties props) {
|
||||||
|
if(ALLOW_OVERRIDE_OVERRIDES)
|
||||||
|
LOGGER.fatal("JVM argument given to override mod overrides. Issues opened with this option present will be ignored unless they can be reproduced without.");
|
||||||
|
|
||||||
for (Map.Entry<Object, Object> entry : props.entrySet()) {
|
for (Map.Entry<Object, Object> entry : props.entrySet()) {
|
||||||
String key = (String) entry.getKey();
|
String key = (String) entry.getKey();
|
||||||
String value = (String) entry.getValue();
|
String value = (String) entry.getValue();
|
||||||
|
|
@ -285,7 +290,7 @@ public class ModernFixEarlyConfig {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!option.isModDefined())
|
if(ALLOW_OVERRIDE_OVERRIDES || !option.isModDefined())
|
||||||
option.setEnabled(enabled, true);
|
option.setEnabled(enabled, true);
|
||||||
else
|
else
|
||||||
LOGGER.warn("Option '{}' already disabled by a mod. Ignoring user configuration", key);
|
LOGGER.warn("Option '{}' already disabled by a mod. Ignoring user configuration", key);
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,7 @@ import java.util.function.BiFunction;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public class DynamicBakedModelProvider implements Map<ResourceLocation, BakedModel> {
|
public class DynamicBakedModelProvider implements Map<ResourceLocation, BakedModel> {
|
||||||
|
public static DynamicBakedModelProvider currentInstance = null;
|
||||||
private final ModelBakery bakery;
|
private final ModelBakery bakery;
|
||||||
private final Map<Triple<ResourceLocation, Transformation, Boolean>, BakedModel> bakedCache;
|
private final Map<Triple<ResourceLocation, Transformation, Boolean>, BakedModel> bakedCache;
|
||||||
private final Map<ResourceLocation, BakedModel> permanentOverrides;
|
private final Map<ResourceLocation, BakedModel> permanentOverrides;
|
||||||
|
|
@ -73,6 +74,7 @@ public class DynamicBakedModelProvider implements Map<ResourceLocation, BakedMod
|
||||||
this.bakery = bakery;
|
this.bakery = bakery;
|
||||||
this.bakedCache = cache;
|
this.bakedCache = cache;
|
||||||
this.permanentOverrides = Collections.synchronizedMap(new Object2ObjectOpenHashMap<>());
|
this.permanentOverrides = Collections.synchronizedMap(new Object2ObjectOpenHashMap<>());
|
||||||
|
currentInstance = this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setMissingModel(BakedModel model) {
|
public void setMissingModel(BakedModel model) {
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,77 @@
|
||||||
|
package org.embeddedt.modernfix.dynamicresources;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
|
import net.minecraft.client.renderer.block.model.BakedQuad;
|
||||||
|
import net.minecraft.client.renderer.block.model.ItemOverrides;
|
||||||
|
import net.minecraft.client.renderer.block.model.ItemTransforms;
|
||||||
|
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
|
||||||
|
import net.minecraft.client.resources.model.BakedModel;
|
||||||
|
import net.minecraft.core.Direction;
|
||||||
|
import net.minecraft.resources.ResourceLocation;
|
||||||
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Random;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delegate model that stores the location of an actual baked model, for use in ItemOverrides.
|
||||||
|
*/
|
||||||
|
public class ItemOverrideBakedModel implements BakedModel {
|
||||||
|
private static final Map<ResourceLocation, ItemOverrideBakedModel> OVERRIDE_MODELS = new ConcurrentHashMap<>();
|
||||||
|
public final ResourceLocation realLocation;
|
||||||
|
|
||||||
|
private ItemOverrideBakedModel(ResourceLocation realLocation) {
|
||||||
|
this.realLocation = realLocation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ItemOverrideBakedModel of(ResourceLocation realLocation) {
|
||||||
|
return OVERRIDE_MODELS.computeIfAbsent(realLocation, ItemOverrideBakedModel::new);
|
||||||
|
}
|
||||||
|
|
||||||
|
public BakedModel getRealModel() {
|
||||||
|
return DynamicBakedModelProvider.currentInstance.get(realLocation);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<BakedQuad> getQuads(@Nullable BlockState state, @Nullable Direction direction, Random random) {
|
||||||
|
return ImmutableList.of();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean useAmbientOcclusion() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isGui3d() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean usesBlockLight() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isCustomRenderer() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TextureAtlasSprite getParticleIcon() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemTransforms getTransforms() {
|
||||||
|
return ItemTransforms.NO_TRANSFORMS;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemOverrides getOverrides() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -32,3 +32,5 @@ accessible method net/minecraft/client/gui/screens/Screen addRenderableWidget (L
|
||||||
accessible field net/minecraft/client/KeyMapping ALL Ljava/util/Map;
|
accessible field net/minecraft/client/KeyMapping ALL Ljava/util/Map;
|
||||||
accessible field net/minecraft/client/renderer/block/model/multipart/MultiPart definition Lnet/minecraft/world/level/block/state/StateDefinition;
|
accessible field net/minecraft/client/renderer/block/model/multipart/MultiPart definition Lnet/minecraft/world/level/block/state/StateDefinition;
|
||||||
accessible field net/minecraft/server/packs/resources/MultiPackResourceManager namespacedManagers Ljava/util/Map;
|
accessible field net/minecraft/server/packs/resources/MultiPackResourceManager namespacedManagers Ljava/util/Map;
|
||||||
|
accessible field net/minecraft/client/renderer/block/model/ItemOverrides$BakedOverride model Lnet/minecraft/client/resources/model/BakedModel;
|
||||||
|
mutable field net/minecraft/client/renderer/block/model/ItemOverrides$BakedOverride model Lnet/minecraft/client/resources/model/BakedModel;
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
package org.embeddedt.modernfix.fabric.mixin.perf.dynamic_resources;
|
||||||
|
|
||||||
|
import net.minecraft.client.renderer.block.model.BlockModel;
|
||||||
|
import net.minecraft.client.renderer.block.model.ItemOverride;
|
||||||
|
import net.minecraft.client.renderer.block.model.ItemOverrides;
|
||||||
|
import net.minecraft.client.resources.model.BakedModel;
|
||||||
|
import net.minecraft.client.resources.model.ModelBakery;
|
||||||
|
import net.minecraft.client.resources.model.UnbakedModel;
|
||||||
|
import net.minecraft.resources.ResourceLocation;
|
||||||
|
import org.embeddedt.modernfix.dynamicresources.ItemOverrideBakedModel;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||||
|
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
@Mixin(ItemOverrides.class)
|
||||||
|
public class ItemOverridesFabricMixin {
|
||||||
|
@Inject(method = "bakeModel", at = @At("HEAD"), cancellable = true)
|
||||||
|
private void useDynamicallyBakedModel(ModelBakery baker, BlockModel model, Function<ResourceLocation, UnbakedModel> modelGetter, ItemOverride override, CallbackInfoReturnable<BakedModel> cir) {
|
||||||
|
cir.setReturnValue(ItemOverrideBakedModel.of(override.getModel()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,45 @@
|
||||||
|
package org.embeddedt.modernfix.forge.mixin.perf.dynamic_resources;
|
||||||
|
|
||||||
|
import net.minecraft.client.renderer.block.model.ItemOverride;
|
||||||
|
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.Material;
|
||||||
|
import net.minecraft.client.resources.model.ModelBakery;
|
||||||
|
import net.minecraft.client.resources.model.UnbakedModel;
|
||||||
|
import net.minecraft.resources.ResourceLocation;
|
||||||
|
import org.embeddedt.modernfix.dynamicresources.ItemOverrideBakedModel;
|
||||||
|
import org.spongepowered.asm.mixin.Final;
|
||||||
|
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.callback.CallbackInfoReturnable;
|
||||||
|
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
@Mixin(ItemOverrides.class)
|
||||||
|
public class ItemOverridesForgeMixin {
|
||||||
|
@Shadow @Final private ItemOverrides.BakedOverride[] overrides;
|
||||||
|
private volatile boolean forceLoadedModels = false;
|
||||||
|
|
||||||
|
@Inject(method = "bakeModel", at = @At("HEAD"), cancellable = true, remap = false)
|
||||||
|
private void useDynamicallyBakedModel(ModelBakery baker, UnbakedModel model, Function<ResourceLocation, UnbakedModel> function, Function<Material, TextureAtlasSprite> textureGetter, ItemOverride override, CallbackInfoReturnable<BakedModel> cir) {
|
||||||
|
cir.setReturnValue(ItemOverrideBakedModel.of(override.getModel()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Inject(method = "getOverrides", at = @At("HEAD"), remap = false)
|
||||||
|
private void doForceloadModels(CallbackInfoReturnable<ItemOverrides.BakedOverride> cir) {
|
||||||
|
if(!forceLoadedModels) {
|
||||||
|
synchronized (this) {
|
||||||
|
if(!forceLoadedModels) {
|
||||||
|
for(ItemOverrides.BakedOverride override : overrides) {
|
||||||
|
if(override != null && override.model instanceof ItemOverrideBakedModel)
|
||||||
|
override.model = ((ItemOverrideBakedModel)override.model).getRealModel();
|
||||||
|
}
|
||||||
|
forceLoadedModels = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user