Compiles on 1.21.2-pre2, does not yet run

This commit is contained in:
embeddedt 2024-10-10 12:06:24 -04:00
parent 5463ccc3e6
commit a841d20f8a
No known key found for this signature in database
GPG Key ID: A69433EC199B5613
17 changed files with 61 additions and 110 deletions

View File

@ -1,6 +1,7 @@
package org.embeddedt.modernfix;
import net.minecraft.SharedConstants;
import net.minecraft.TracingExecutor;
import net.minecraft.Util;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ChunkMap;
@ -14,7 +15,6 @@ import org.embeddedt.modernfix.resources.ReloadExecutor;
import org.embeddedt.modernfix.util.ClassInfoManager;
import java.lang.management.ManagementFactory;
import java.util.concurrent.ExecutorService;
// The value here should match an entry in the META-INF/mods.toml file
public class ModernFix {
@ -31,7 +31,7 @@ public class ModernFix {
// Used to skip computing the blockstate caches twice
public static boolean runningFirstInjection = false;
private static ExecutorService resourceReloadService = null;
private static TracingExecutor resourceReloadService = null;
static {
if(ModernFixMixinPlugin.instance.isOptionEnabled("perf.dedicated_reload_executor.ReloadExecutor")) {
@ -41,7 +41,7 @@ public class ModernFix {
}
}
public static ExecutorService resourceReloadExecutor() {
public static TracingExecutor resourceReloadExecutor() {
return resourceReloadService;
}

View File

@ -38,18 +38,13 @@ public class SafeBlockGetter implements BlockGetter {
}
@Override
public int getMaxBuildHeight() {
return this.wrapped.getMaxBuildHeight();
public int getMaxY() {
return this.wrapped.getMaxY();
}
@Override
public int getMaxLightLevel() {
return this.wrapped.getMaxLightLevel();
}
@Override
public int getMinBuildHeight() {
return this.wrapped.getMinBuildHeight();
public int getMinY() {
return this.wrapped.getMinY();
}
@Override

View File

@ -1,24 +0,0 @@
package org.embeddedt.modernfix.common.mixin.bugfix.ender_dragon_leak;
import net.minecraft.client.renderer.entity.EnderDragonRenderer;
import org.embeddedt.modernfix.annotation.ClientOnlyMixin;
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.CallbackInfo;
@Mixin(EnderDragonRenderer.class)
@ClientOnlyMixin
public abstract class EnderDragonRendererMixin {
@Shadow @Final private EnderDragonRenderer.DragonModel model;
/**
* Prevent leaking the client world through the entity reference.
*/
@Inject(method = "render(Lnet/minecraft/world/entity/boss/enderdragon/EnderDragon;FFLcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V", at = @At("RETURN"))
private void clearDragonEntityReference(CallbackInfo ci) {
this.model.entity = null;
}
}

View File

@ -37,7 +37,7 @@ public abstract class ServerChunkCacheMixin {
if(debugDeadServerAccess) {
new Exception().printStackTrace();
}
Holder<Biome> plains = this.level.registryAccess().registryOrThrow(Registries.BIOME).getHolderOrThrow(Biomes.PLAINS);
Holder<Biome> plains = this.level.registryAccess().lookupOrThrow(Registries.BIOME).getOrThrow(Biomes.PLAINS);
cir.setReturnValue(new EmptyLevelChunk(this.level, new ChunkPos(chunkX, chunkZ), plains));
} else if(Thread.currentThread() != this.mainThread) {
CompletableFuture<ChunkResult<ChunkAccess>> future = CompletableFuture.supplyAsync(() -> this.getChunkFutureMainThread(chunkX, chunkZ, requiredStatus, false), this.mainThreadProcessor).join();

View File

@ -26,8 +26,8 @@ import java.util.function.Supplier;
@Mixin(ServerLevel.class)
public abstract class ServerLevelMixin extends Level implements IServerLevel {
protected ServerLevelMixin(WritableLevelData arg, ResourceKey<Level> arg2, RegistryAccess arg3, Holder<DimensionType> arg4, Supplier<ProfilerFiller> supplier, boolean bl, boolean bl2, long l, int i) {
super(arg, arg2, arg3, arg4, supplier, bl, bl2, l, i);
protected ServerLevelMixin(WritableLevelData writableLevelData, ResourceKey<Level> resourceKey, RegistryAccess registryAccess, Holder<DimensionType> holder, boolean bl, boolean bl2, long l, int i) {
super(writableLevelData, resourceKey, registryAccess, holder, bl, bl2, l, i);
}
@Shadow public abstract DimensionDataStorage getDataStorage();

View File

@ -1,5 +1,6 @@
package org.embeddedt.modernfix.common.mixin.perf.dedicated_reload_executor;
import net.minecraft.TracingExecutor;
import net.minecraft.client.Minecraft;
import org.embeddedt.modernfix.ModernFix;
import org.embeddedt.modernfix.annotation.ClientOnlyMixin;
@ -7,13 +8,11 @@ import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
import java.util.concurrent.ExecutorService;
@Mixin(Minecraft.class)
@ClientOnlyMixin
public class MinecraftMixin {
@Redirect(method = { "<init>", "reloadResourcePacks(ZLnet/minecraft/client/Minecraft$GameLoadCookie;)Ljava/util/concurrent/CompletableFuture;" }, at = @At(value = "INVOKE", target = "Lnet/minecraft/Util;backgroundExecutor()Ljava/util/concurrent/ExecutorService;", ordinal = 0))
private ExecutorService getResourceReloadExecutor() {
@Redirect(method = { "<init>", "reloadResourcePacks(ZLnet/minecraft/client/Minecraft$GameLoadCookie;)Ljava/util/concurrent/CompletableFuture;" }, at = @At(value = "INVOKE", target = "Lnet/minecraft/Util;backgroundExecutor()Lnet/minecraft/TracingExecutor;", ordinal = 0))
private TracingExecutor getResourceReloadExecutor() {
return ModernFix.resourceReloadExecutor();
}
}

View File

@ -19,19 +19,19 @@ import java.util.Map;
@Mixin(EntityRenderDispatcher.class)
@ClientOnlyMixin
public class EntityRenderDispatcherMixin {
@Shadow private Map<EntityType<?>, EntityRenderer<?>> renderers;
@Shadow private Map<EntityType<?>, EntityRenderer<?, ?>> renderers;
private EntityRendererMap mfix$dynamicRenderers;
@Inject(method = "getRenderer", at = @At("RETURN"), cancellable = true)
private <T extends Entity> void checkNullness(T entity, CallbackInfoReturnable<EntityRenderer<? super T>> cir) {
private <T extends Entity> void checkNullness(T entity, CallbackInfoReturnable<EntityRenderer<? super T, ?>> cir) {
// apparently some mods yeet the renderers map and cause issues
if(cir.getReturnValue() == null)
cir.setReturnValue((EntityRenderer<? super T>)mfix$dynamicRenderers.get(entity.getType()));
cir.setReturnValue((EntityRenderer<? super T, ?>)mfix$dynamicRenderers.get(entity.getType()));
}
@Redirect(method = "onResourceManagerReload", at = @At(value = "FIELD", opcode = Opcodes.PUTFIELD, target = "Lnet/minecraft/client/renderer/entity/EntityRenderDispatcher;renderers:Ljava/util/Map;"))
private void setRendererField(EntityRenderDispatcher instance, Map<EntityType<?>, EntityRenderer<?>> incomingMap) {
private void setRendererField(EntityRenderDispatcher instance, Map<EntityType<?>, EntityRenderer<?, ?>> incomingMap) {
this.renderers = incomingMap;
this.mfix$dynamicRenderers = (EntityRendererMap)incomingMap;
}

View File

@ -22,7 +22,7 @@ public class EntityRenderersMixin {
@Shadow @Final private static Map<EntityType<?>, EntityRendererProvider<?>> PROVIDERS;
@Inject(method = "createEntityRenderers", at = @At("HEAD"), cancellable = true)
private static void createDynamicRendererLoader(EntityRendererProvider.Context context, CallbackInfoReturnable<Map<EntityType<?>, EntityRenderer<?>>> cir) {
private static void createDynamicRendererLoader(EntityRendererProvider.Context context, CallbackInfoReturnable<Map<EntityType<?>, EntityRenderer<?, ?>>> cir) {
cir.setReturnValue(new EntityRendererMap(PROVIDERS, context));
ModernFix.LOGGER.info("Dynamic entity renderer hook setup");
}

View File

@ -122,7 +122,7 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery {
if(prototype == missingModel) {
model = bakedMissingModel;
} else {
prototype.resolveParents(this::getModel);
prototype.resolveDependencies(this::getModel);
if(DEBUG_MODEL_LOADS) {
ModernFix.LOGGER.info("Baking model {}", location);
}

View File

@ -2,15 +2,14 @@ package org.embeddedt.modernfix.common.mixin.perf.dynamic_resources;
import com.google.common.collect.ImmutableList;
import com.llamalad7.mixinextras.sugar.Local;
import it.unimi.dsi.fastutil.objects.Object2IntMap;
import net.minecraft.client.renderer.block.model.BlockModel;
import net.minecraft.client.resources.model.AtlasSet;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.client.resources.model.BlockStateModelLoader;
import net.minecraft.client.resources.model.ModelBakery;
import net.minecraft.client.resources.model.ModelManager;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.packs.resources.ResourceManager;
import net.minecraft.util.GsonHelper;
import net.minecraft.util.profiling.ProfilerFiller;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState;
@ -34,12 +33,9 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
import java.util.stream.Collectors;
@Mixin(ModelManager.class)
@ClientOnlyMixin
@ -62,11 +58,14 @@ public class ModelManagerMixin implements IExtendedModelManager {
return CompletableFuture.completedFuture(new LambdaMap<>(location -> cache.getUnchecked(location)));
}
// TODO - make blockstate unbaked model loading lazy
/*
@Redirect(method = "reload", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/resources/model/ModelManager;loadBlockStates(Lnet/minecraft/server/packs/resources/ResourceManager;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;"))
private CompletableFuture<Map<ResourceLocation, List<BlockStateModelLoader.LoadedJson>>> deferBlockStateLoad(ResourceManager manager, Executor executor) {
var cache = CacheUtil.<ResourceLocation, List<BlockStateModelLoader.LoadedJson>>simpleCacheForLambda(location -> loadSingleBlockState(manager, location), 100L);
return CompletableFuture.completedFuture(new LambdaMap<>(location -> cache.getUnchecked(location)));
}
*/
@Redirect(method = "loadModels", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/state/StateDefinition;getPossibleStates()Lcom/google/common/collect/ImmutableList;"))
private ImmutableList<BlockState> skipCollection(StateDefinition<Block, BlockState> definition) {
@ -84,6 +83,7 @@ public class ModelManagerMixin implements IExtendedModelManager {
}).orElse(null);
}
/*
private List<BlockStateModelLoader.LoadedJson> loadSingleBlockState(ResourceManager manager, ResourceLocation location) {
return manager.getResourceStack(location).stream().map(resource -> {
try (BufferedReader reader = resource.openAsReader()) {
@ -94,9 +94,10 @@ public class ModelManagerMixin implements IExtendedModelManager {
}
}).filter(Objects::nonNull).collect(Collectors.toList());
}
*/
@Inject(method = "loadModels", at = @At("RETURN"))
private void storeTicker(ProfilerFiller profilerFiller, Map<ResourceLocation, AtlasSet.StitchResult> map, ModelBakery modelBakery, CallbackInfoReturnable<?> cir) {
private void storeTicker(ProfilerFiller profilerFiller, Map<ResourceLocation, AtlasSet.StitchResult> map, ModelBakery modelBakery, Object2IntMap<BlockState> object2IntMap, CallbackInfoReturnable<?> cir) {
tickHandler = ((IExtendedModelBakery)modelBakery)::mfix$tick;
}

View File

@ -1,19 +0,0 @@
package org.embeddedt.modernfix.common.mixin.perf.model_optimizations;
import com.google.common.collect.ImmutableSet;
import net.minecraft.world.level.block.state.properties.BooleanProperty;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
@Mixin(BooleanProperty.class)
public class BooleanPropertyMixin {
/**
* There is no point comparing the immutable sets in any two instances of this class, as they will always be
* the same.
*/
@Redirect(method = "equals", at = @At(value = "INVOKE", target = "Lcom/google/common/collect/ImmutableSet;equals(Ljava/lang/Object;)Z", remap = false), remap = false)
private boolean skipEqualityCheck(ImmutableSet instance, Object object) {
return true;
}
}

View File

@ -17,9 +17,9 @@ import java.util.Map;
import java.util.Set;
import java.util.concurrent.ExecutionException;
public class EntityRendererMap implements Map<EntityType<?>, EntityRenderer<?>> {
public class EntityRendererMap implements Map<EntityType<?>, EntityRenderer<?, ?>> {
private final Map<EntityType<?>, EntityRendererProvider<?>> rendererProviders;
private final LoadingCache<EntityType<?>, EntityRenderer<?>> rendererMap;
private final LoadingCache<EntityType<?>, EntityRenderer<?, ?>> rendererMap;
private final EntityRendererProvider.Context context;
public EntityRendererMap(Map<EntityType<?>, EntityRendererProvider<?>> rendererProviders, EntityRendererProvider.Context context) {
@ -28,12 +28,12 @@ public class EntityRendererMap implements Map<EntityType<?>, EntityRenderer<?>>
this.rendererMap = CacheBuilder.newBuilder().build(new RenderConstructor());
}
class RenderConstructor extends CacheLoader<EntityType<?>, EntityRenderer<?>> {
class RenderConstructor extends CacheLoader<EntityType<?>, EntityRenderer<?, ?>> {
@Override
public EntityRenderer<?> load(EntityType<?> key) throws Exception {
public EntityRenderer<?, ?> load(EntityType<?> key) throws Exception {
EntityRendererProvider<?> provider = rendererProviders.get(key);
synchronized(EntityRenderers.class) {
EntityRenderer<?> renderer;
EntityRenderer<?, ?> renderer;
try {
if(provider == null)
throw new RuntimeException("Provider not registered");
@ -69,9 +69,9 @@ public class EntityRendererMap implements Map<EntityType<?>, EntityRenderer<?>>
}
@Override
public EntityRenderer<?> get(Object o) {
public EntityRenderer<?, ?> get(Object o) {
try {
EntityRenderer<?> renderer = rendererMap.get((EntityType<?>)o);
EntityRenderer<?, ?> renderer = rendererMap.get((EntityType<?>)o);
if(renderer == null)
throw new AssertionError("Returned entity renderer should never be null");
return renderer;
@ -84,21 +84,21 @@ public class EntityRendererMap implements Map<EntityType<?>, EntityRenderer<?>>
@Nullable
@Override
public EntityRenderer<?> put(EntityType<?> entityType, EntityRenderer<?> entityRenderer) {
EntityRenderer<?> old = rendererMap.getIfPresent(entityType);
public EntityRenderer<?, ?> put(EntityType<?> entityType, EntityRenderer<?, ?> entityRenderer) {
EntityRenderer<?, ?> old = rendererMap.getIfPresent(entityType);
rendererMap.put(entityType, entityRenderer);
return old;
}
@Override
public EntityRenderer<?> remove(Object o) {
EntityRenderer<?> r = rendererMap.getIfPresent(o);
public EntityRenderer<?, ?> remove(Object o) {
EntityRenderer<?, ?> r = rendererMap.getIfPresent(o);
rendererMap.invalidate(o);
return r;
}
@Override
public void putAll(@NotNull Map<? extends EntityType<?>, ? extends EntityRenderer<?>> map) {
public void putAll(@NotNull Map<? extends EntityType<?>, ? extends EntityRenderer<?, ?>> map) {
rendererMap.putAll(map);
}
@ -115,13 +115,13 @@ public class EntityRendererMap implements Map<EntityType<?>, EntityRenderer<?>>
@NotNull
@Override
public Collection<EntityRenderer<?>> values() {
public Collection<EntityRenderer<?, ?>> values() {
return rendererMap.asMap().values();
}
@NotNull
@Override
public Set<Map.Entry<EntityType<?>, EntityRenderer<?>>> entrySet() {
public Set<Map.Entry<EntityType<?>, EntityRenderer<?, ?>>> entrySet() {
return rendererMap.asMap().entrySet();
}
}

View File

@ -5,26 +5,25 @@ import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.culling.Frustum;
import net.minecraft.client.renderer.entity.EntityRenderer;
import net.minecraft.client.renderer.entity.EntityRendererProvider;
import net.minecraft.client.renderer.texture.TextureAtlas;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.client.renderer.entity.state.EntityRenderState;
import net.minecraft.world.entity.Entity;
public class ErroredEntityRenderer<T extends Entity> extends EntityRenderer<T> {
public class ErroredEntityRenderer<T extends Entity> extends EntityRenderer<T, EntityRenderState> {
public ErroredEntityRenderer(EntityRendererProvider.Context arg) {
super(arg);
}
@Override
public ResourceLocation getTextureLocation(T entity) {
return TextureAtlas.LOCATION_BLOCKS;
}
@Override
public boolean shouldRender(T livingEntity, Frustum camera, double camX, double camY, double camZ) {
return false;
}
@Override
public void render(T entity, float entityYaw, float partialTick, PoseStack poseStack, MultiBufferSource buffer, int packedLight) {
public EntityRenderState createRenderState() {
return null;
}
@Override
public void render(EntityRenderState entityRenderState, PoseStack poseStack, MultiBufferSource multiBufferSource, int i) {
}
}

View File

@ -1,8 +1,8 @@
package org.embeddedt.modernfix.render;
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import net.minecraft.client.renderer.block.model.BakedOverrides;
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;
@ -88,7 +88,7 @@ public class SimpleItemModelView implements BakedModel {
}
@Override
public ItemOverrides getOverrides() {
return wrappedItem.getOverrides();
public BakedOverrides overrides() {
return wrappedItem.overrides();
}
}

View File

@ -2,6 +2,7 @@ package org.embeddedt.modernfix.resources;
import net.minecraft.ReportType;
import net.minecraft.ReportedException;
import net.minecraft.TracingExecutor;
import net.minecraft.server.Bootstrap;
import org.embeddedt.modernfix.ModernFix;
@ -12,10 +13,10 @@ import java.util.concurrent.ForkJoinWorkerThread;
import java.util.concurrent.atomic.AtomicInteger;
public class ReloadExecutor {
public static ExecutorService createCustomResourceReloadExecutor() {
public static TracingExecutor createCustomResourceReloadExecutor() {
ClassLoader loader = ReloadExecutor.class.getClassLoader();
AtomicInteger workerCount = new AtomicInteger(0);
return new ForkJoinPool(ForkJoinPool.getCommonPoolParallelism(), (forkJoinPool) -> {
return new TracingExecutor(new ForkJoinPool(ForkJoinPool.getCommonPoolParallelism(), (forkJoinPool) -> {
ForkJoinWorkerThread forkJoinWorkerThread = new ForkJoinWorkerThread(forkJoinPool) {
protected void onTermination(Throwable throwOnTermination) {
if (throwOnTermination != null) {
@ -31,7 +32,7 @@ public class ReloadExecutor {
forkJoinWorkerThread.setContextClassLoader(loader);
forkJoinWorkerThread.setName("Worker-ResourceReload-" + workerCount.getAndIncrement());
return forkJoinWorkerThread;
}, ReloadExecutor::handleException, true);
}, ReloadExecutor::handleException, true));
}
private static void handleException(Thread thread, Throwable throwable) {

View File

@ -2,7 +2,6 @@ package org.embeddedt.modernfix.util;
import net.minecraft.server.packs.resources.PreparableReloadListener;
import net.minecraft.server.packs.resources.ResourceManager;
import net.minecraft.util.profiling.ProfilerFiller;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
@ -14,8 +13,8 @@ public class NamedPreparableResourceListener implements PreparableReloadListener
}
@Override
public CompletableFuture<Void> reload(PreparationBarrier stage, ResourceManager resourceManager, ProfilerFiller preparationsProfiler, ProfilerFiller reloadProfiler, Executor backgroundExecutor, Executor gameExecutor) {
return this.delegate.reload(stage, resourceManager, preparationsProfiler, reloadProfiler, backgroundExecutor, gameExecutor);
public CompletableFuture<Void> reload(PreparationBarrier stage, ResourceManager resourceManager, Executor backgroundExecutor, Executor gameExecutor) {
return this.delegate.reload(stage, resourceManager, backgroundExecutor, gameExecutor);
}
@Override

View File

@ -5,8 +5,8 @@ junit_version=5.10.0-M1
mixinextras_version=0.3.2
mod_id=modernfix
minecraft_version=1.21.1
enabled_platforms=fabric,neoforge
minecraft_version=1.21.2-pre1
enabled_platforms=fabric
forge_version=21.1.15
parchment_version=2024.07.07
parchment_mc_version=1.21
@ -18,8 +18,8 @@ kubejs_version=1902.6.0-build.142
rhino_version=1902.2.2-build.268
supported_minecraft_versions=1.21.1
fabric_loader_version=0.15.11
fabric_api_version=0.102.1+1.21.1
fabric_loader_version=0.16.6
fabric_api_version=0.105.3+1.21.2
continuity_version=3.0.0-beta.4+1.20.2