diff --git a/common/src/main/java/org/embeddedt/modernfix/FileWalker.java b/common/src/main/java/org/embeddedt/modernfix/FileWalker.java deleted file mode 100644 index 1d0e1b01..00000000 --- a/common/src/main/java/org/embeddedt/modernfix/FileWalker.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.embeddedt.modernfix; - -import com.google.common.cache.CacheLoader; -import org.apache.commons.lang3.tuple.Pair; - -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -public class FileWalker extends CacheLoader, List> { - public static final FileWalker INSTANCE = new FileWalker(); - - @Override - public List load(Pair key) throws Exception { - try(Stream stream = Files.walk(key.getLeft(), key.getRight())) { - return stream.collect(Collectors.toList()); - } - } -} diff --git a/common/src/main/java/org/embeddedt/modernfix/ModernFixClient.java b/common/src/main/java/org/embeddedt/modernfix/ModernFixClient.java index c713816c..23321390 100644 --- a/common/src/main/java/org/embeddedt/modernfix/ModernFixClient.java +++ b/common/src/main/java/org/embeddedt/modernfix/ModernFixClient.java @@ -1,10 +1,8 @@ package org.embeddedt.modernfix; import net.minecraft.client.Minecraft; -import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.server.MinecraftServer; import net.minecraft.util.MemoryReserve; -import net.minecraft.world.entity.Entity; import org.embeddedt.modernfix.api.constants.IntegrationConstants; import org.embeddedt.modernfix.api.entrypoint.ModernFixClientIntegration; import org.embeddedt.modernfix.core.ModernFixMixinPlugin; @@ -98,25 +96,6 @@ public class ModernFixClient { } } - /** - * Check if the IDs match and remap them if not. - * @return true if ID remap was needed - */ - private static boolean compareAndSwitchIds(Class eClass, String fieldName, EntityDataAccessor accessor, int newId) { - if(accessor.id != newId) { - ModernFix.LOGGER.warn("Corrected ID mismatch on {} field {}. Client had {} but server wants {}.", - eClass, - fieldName, - accessor.id, - newId); - accessor.id = newId; - return true; - } else { - ModernFix.LOGGER.debug("{} {} ID fine: {}", eClass, fieldName, newId); - return false; - } - } - public void onServerStarted(MinecraftServer server) { if(!ModernFixMixinPlugin.instance.isOptionEnabled("feature.integrated_server_watchdog.IntegratedWatchdog")) return; diff --git a/common/src/main/java/org/embeddedt/modernfix/blockstate/BlockStateCacheHandler.java b/common/src/main/java/org/embeddedt/modernfix/blockstate/BlockStateCacheHandler.java index c2be9256..b1eb833a 100644 --- a/common/src/main/java/org/embeddedt/modernfix/blockstate/BlockStateCacheHandler.java +++ b/common/src/main/java/org/embeddedt/modernfix/blockstate/BlockStateCacheHandler.java @@ -6,7 +6,7 @@ import net.minecraft.world.level.block.state.BlockState; import org.embeddedt.modernfix.duck.IBlockState; public class BlockStateCacheHandler { - public static void rebuildParallel(boolean force) { + public static void invalidateCache() { synchronized (BlockBehaviour.BlockStateBase.class) { for (BlockState blockState : Block.BLOCK_STATE_REGISTRY) { ((IBlockState)blockState).clearCache(); diff --git a/common/src/main/java/org/embeddedt/modernfix/blockstate/FerriteCorePostProcess.java b/common/src/main/java/org/embeddedt/modernfix/blockstate/FerriteCorePostProcess.java deleted file mode 100644 index 70daf00e..00000000 --- a/common/src/main/java/org/embeddedt/modernfix/blockstate/FerriteCorePostProcess.java +++ /dev/null @@ -1,62 +0,0 @@ -package org.embeddedt.modernfix.blockstate; - -import it.unimi.dsi.fastutil.objects.Object2IntArrayMap; -import it.unimi.dsi.fastutil.objects.Object2IntMap; -import it.unimi.dsi.fastutil.objects.Object2IntMaps; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.world.level.block.state.StateHolder; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.reflect.Field; - -public class FerriteCorePostProcess { - private static final boolean willPostProcess; - - private static final MethodHandle theTable, toKeyIndex; - - static { - boolean success = true; - MethodHandle table = null, keyIndex = null; - try { - Class fastMap = Class.forName("malte0811.ferritecore.fastmap.FastMap"); - Field field = fastMap.getDeclaredField("toKeyIndex"); - field.setAccessible(true); - keyIndex = MethodHandles.publicLookup().unreflectSetter(field); - field = StateHolder.class.getDeclaredField("ferritecore_globalTable"); - field.setAccessible(true); - table = MethodHandles.publicLookup().unreflectGetter(field); - } catch(ReflectiveOperationException | RuntimeException e) { - e.printStackTrace(); - success = false; - } - willPostProcess = success; - theTable = table; - toKeyIndex = keyIndex; - } - - private static final Object2IntMap EMPTY_MAP; - - static { - Object2IntArrayMap map = new Object2IntArrayMap<>(); - map.defaultReturnValue(-1); - EMPTY_MAP = Object2IntMaps.unmodifiable(map); - } - - public static > void postProcess(StateDefinition state) { - if(!willPostProcess) - return; - try { - if(state.getProperties().size() == 0) { - for(S holder : state.getPossibleStates()) { - // deduplicate Object2IntMap objects from FerriteCore - // will probably be fixed upstream at some point, but likely not for older versions - Object table = theTable.invoke(holder); - toKeyIndex.invoke(table, EMPTY_MAP); - } - } - } catch(Throwable e) { - e.printStackTrace(); - } - } -} diff --git a/common/src/main/java/org/embeddedt/modernfix/chunk/SafeBlockGetter.java b/common/src/main/java/org/embeddedt/modernfix/chunk/SafeBlockGetter.java deleted file mode 100644 index 24d039b2..00000000 --- a/common/src/main/java/org/embeddedt/modernfix/chunk/SafeBlockGetter.java +++ /dev/null @@ -1,78 +0,0 @@ -package org.embeddedt.modernfix.chunk; - -import net.minecraft.core.BlockPos; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkAccess; -import net.minecraft.world.level.chunk.status.ChunkStatus; -import net.minecraft.world.level.material.FluidState; -import net.minecraft.world.level.material.Fluids; -import org.jetbrains.annotations.Nullable; - -public class SafeBlockGetter implements BlockGetter { - private final ServerLevel wrapped; - private final Thread mainThread; - - public SafeBlockGetter(ServerLevel wrapped) { - this.wrapped = wrapped; - this.mainThread = Thread.currentThread(); - } - - public boolean shouldUse() { - return Thread.currentThread() != this.mainThread; - } - - @Nullable - private BlockGetter getChunkSafe(BlockPos pos) { - // can safely call getChunkForLighting off-thread - BlockGetter access = this.wrapped.getChunkSource().getChunkForLighting(pos.getX() >> 4, pos.getZ() >> 4); - if(!(access instanceof ChunkAccess)) - return null; - ChunkAccess chunk = (ChunkAccess)access; - if(!chunk.getPersistedStatus().isOrAfter(ChunkStatus.FULL)) - return null; - return chunk; - } - - @Override - public int getMaxBuildHeight() { - return this.wrapped.getMaxBuildHeight(); - } - - @Override - public int getMaxLightLevel() { - return this.wrapped.getMaxLightLevel(); - } - - @Override - public int getMinBuildHeight() { - return this.wrapped.getMinBuildHeight(); - } - - @Override - public int getHeight() { - return this.wrapped.getHeight(); - } - - @Nullable - @Override - public BlockEntity getBlockEntity(BlockPos pos) { - BlockGetter g = getChunkSafe(pos); - return g == null ? null : g.getBlockEntity(pos); - } - - @Override - public BlockState getBlockState(BlockPos pos) { - BlockGetter g = getChunkSafe(pos); - return g == null ? Blocks.AIR.defaultBlockState() : g.getBlockState(pos); - } - - @Override - public FluidState getFluidState(BlockPos pos) { - BlockGetter g = getChunkSafe(pos); - return g == null ? Fluids.EMPTY.defaultFluidState() : g.getFluidState(pos); - } -} diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/chunk_deadlock/BlockStateBaseMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/chunk_deadlock/BlockStateBaseMixin.java deleted file mode 100644 index 464130c8..00000000 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/chunk_deadlock/BlockStateBaseMixin.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.embeddedt.modernfix.common.mixin.bugfix.chunk_deadlock; - -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.block.state.BlockBehaviour; -import org.embeddedt.modernfix.chunk.SafeBlockGetter; -import org.embeddedt.modernfix.duck.ISafeBlockGetter; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.ModifyVariable; - -@Mixin(value = BlockBehaviour.BlockStateBase.class, priority = 100) -public class BlockStateBaseMixin { - @ModifyVariable(method = "getOffset", at = @At("HEAD"), argsOnly = true, index = 1) - private BlockGetter useSafeGetter(BlockGetter g) { - if(g instanceof ISafeBlockGetter) { - SafeBlockGetter replacement = ((ISafeBlockGetter) g).mfix$getSafeBlockGetter(); - if(replacement.shouldUse()) - return replacement; - } - return g; - } -} diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/chunk_deadlock/ServerLevelMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/chunk_deadlock/ServerLevelMixin.java deleted file mode 100644 index e7c3b137..00000000 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/chunk_deadlock/ServerLevelMixin.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.embeddedt.modernfix.common.mixin.bugfix.chunk_deadlock; - -import net.minecraft.server.level.ServerLevel; -import org.embeddedt.modernfix.chunk.SafeBlockGetter; -import org.embeddedt.modernfix.duck.ISafeBlockGetter; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; - -@Mixin(ServerLevel.class) -public class ServerLevelMixin implements ISafeBlockGetter { - @Unique - private final SafeBlockGetter mfix$safeBlockGetter = new SafeBlockGetter((ServerLevel)(Object)this); - - @Override - public SafeBlockGetter mfix$getSafeBlockGetter() { - return mfix$safeBlockGetter; - } -} diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/concurrency/MinecraftMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/concurrency/MinecraftMixin.java deleted file mode 100644 index 875fcbd7..00000000 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/concurrency/MinecraftMixin.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.embeddedt.modernfix.common.mixin.bugfix.concurrency; - -import net.minecraft.client.Minecraft; -import net.minecraft.util.thread.BlockableEventLoop; -import org.embeddedt.modernfix.ModernFix; -import org.embeddedt.modernfix.annotation.ClientOnlyMixin; -import org.spongepowered.asm.mixin.Mixin; - -import java.util.function.BooleanSupplier; - -@Mixin(Minecraft.class) -@ClientOnlyMixin -public abstract class MinecraftMixin extends BlockableEventLoop { - - protected MinecraftMixin(String p_i50403_1_) { - super(p_i50403_1_); - } - - @Override - public void managedBlock(BooleanSupplier pIsDone) { - if(!this.isSameThread()) { - ModernFix.LOGGER.warn("A mod is calling Minecraft.managedBlock from the wrong thread. This is most likely related to one of our parallelizations."); - ModernFix.LOGGER.warn("ModernFix will work around this, however ideally the issue should be patched in the other mod."); - ModernFix.LOGGER.warn("Stacktrace", new IllegalThreadStateException()); - while(!pIsDone.getAsBoolean()) { - try { - Thread.sleep(100); - } catch(InterruptedException e) { - Thread.currentThread().interrupt(); - } - } - } else { - super.managedBlock(pIsDone); - } - } -} diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/feature/direct_stack_trace/CrashReportMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/feature/direct_stack_trace/CrashReportMixin.java deleted file mode 100644 index 5cab1338..00000000 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/feature/direct_stack_trace/CrashReportMixin.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.embeddedt.modernfix.common.mixin.feature.direct_stack_trace; - -import net.minecraft.CrashReport; -import net.minecraft.CrashReportCategory; -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; - -@Mixin(CrashReport.class) -public class CrashReportMixin { - @Shadow @Final private Throwable exception; - - @Inject(method = "addCategory(Ljava/lang/String;I)Lnet/minecraft/CrashReportCategory;", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;error(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V", remap = false)) - private void dumpStacktrace(String s, int i, CallbackInfoReturnable cir) { - new Exception("ModernFix crash stacktrace").printStackTrace(); - if(this.exception != null) - this.exception.printStackTrace(); - } -} diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/feature/stalled_chunk_load_detection/ServerChunkCacheMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/feature/stalled_chunk_load_detection/ServerChunkCacheMixin.java deleted file mode 100644 index ca2e5e99..00000000 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/feature/stalled_chunk_load_detection/ServerChunkCacheMixin.java +++ /dev/null @@ -1,70 +0,0 @@ -package org.embeddedt.modernfix.common.mixin.feature.stalled_chunk_load_detection; - -import net.minecraft.core.Holder; -import net.minecraft.core.registries.Registries; -import net.minecraft.server.level.ChunkResult; -import net.minecraft.server.level.ServerChunkCache; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.level.ChunkPos; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.biome.Biomes; -import net.minecraft.world.level.chunk.ChunkAccess; -import net.minecraft.world.level.chunk.status.ChunkStatus; -import net.minecraft.world.level.chunk.EmptyLevelChunk; -import org.embeddedt.modernfix.ModernFix; -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.concurrent.*; - -@Mixin(value = ServerChunkCache.class, priority = 1100) -public abstract class ServerChunkCacheMixin { - @Shadow @Final private Thread mainThread; - @Shadow @Final public ServerLevel level; - - @Shadow protected abstract CompletableFuture> getChunkFutureMainThread(int k, int l, ChunkStatus arg, boolean bl); - - @Shadow @Final private ServerChunkCache.MainThreadExecutor mainThreadProcessor; - private final boolean debugDeadServerAccess = Boolean.getBoolean("modernfix.debugBadChunkloading"); - - @Inject(method = "getChunk", at = @At("HEAD"), cancellable = true) - private void bailIfServerDead(int chunkX, int chunkZ, ChunkStatus requiredStatus, boolean load, CallbackInfoReturnable cir) { - if(!this.level.getServer().isRunning() && !this.mainThread.isAlive()) { - ModernFix.LOGGER.fatal("A mod is accessing chunks from a stopped server (this will also cause memory leaks)"); - if(debugDeadServerAccess) { - new Exception().printStackTrace(); - } - Holder plains = this.level.registryAccess().registryOrThrow(Registries.BIOME).getHolderOrThrow(Biomes.PLAINS); - cir.setReturnValue(new EmptyLevelChunk(this.level, new ChunkPos(chunkX, chunkZ), plains)); - } else if(Thread.currentThread() != this.mainThread) { - CompletableFuture> future = CompletableFuture.supplyAsync(() -> this.getChunkFutureMainThread(chunkX, chunkZ, requiredStatus, false), this.mainThreadProcessor).join(); - if(!future.isDone()) { - // Wait at least 500 milliseconds before printing anything - ChunkResult resultingChunk = null; - try { - resultingChunk = future.get(500, TimeUnit.MILLISECONDS); - } catch(InterruptedException | ExecutionException | TimeoutException ignored) { - } - if(resultingChunk != null && resultingChunk.isSuccess()) { - cir.setReturnValue(resultingChunk.orElse(null)); - return; - } - if(debugDeadServerAccess) - ModernFix.LOGGER.warn("Async loading of a chunk was requested, this might not be desirable", new Exception()); - try { - resultingChunk = future.get(10, TimeUnit.SECONDS); - if(resultingChunk.isSuccess()) { - cir.setReturnValue(resultingChunk.orElse(null)); - return; - } - } catch(InterruptedException | ExecutionException | TimeoutException e) { - ModernFix.LOGGER.error("Async chunk load took way too long, this needs to be reported to the appropriate mod.", e); - } - //cir.setReturnValue(new EmptyLevelChunk(this.level, new ChunkPos(chunkX, chunkZ))); - } - } - } -} diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/cache_model_materials/MultipartMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/cache_model_materials/MultipartMixin.java deleted file mode 100644 index 4d620db9..00000000 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/cache_model_materials/MultipartMixin.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.embeddedt.modernfix.common.mixin.perf.cache_model_materials; - -import net.minecraft.client.renderer.block.model.multipart.MultiPart; -import net.minecraft.resources.ResourceLocation; -import org.embeddedt.modernfix.annotation.ClientOnlyMixin; -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.Collection; - -@Mixin(MultiPart.class) -@ClientOnlyMixin -public class MultipartMixin { - private Collection dependencyCache = null; - @Inject(method = "getDependencies", at = @At("HEAD"), cancellable = true) - private void useDependencyCache(CallbackInfoReturnable> cir) { - if(dependencyCache != null) - cir.setReturnValue(dependencyCache); - } - - @Inject(method = "getDependencies", at = @At("RETURN")) - private void storeDependencyCache(CallbackInfoReturnable> cir) { - if(dependencyCache == null) - dependencyCache = cir.getReturnValue(); - } -} diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/compact_mojang_registries/BlockStateDataMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/compact_mojang_registries/BlockStateDataMixin.java new file mode 100644 index 00000000..eb85f08c --- /dev/null +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/compact_mojang_registries/BlockStateDataMixin.java @@ -0,0 +1,50 @@ +package org.embeddedt.modernfix.common.mixin.perf.compact_mojang_registries; + +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; +import net.minecraft.util.datafix.fixes.BlockStateData; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.Map; + +@Mixin(value = BlockStateData.class, priority = 2000) +public class BlockStateDataMixin { + @Unique + private static ObjectOpenHashSet TAG_INTERNER; + + /** + * @author embeddedt + * @reason Reduce memory use of these constant CompoundTags via aggressive interning. + */ + @ModifyExpressionValue(method = "parse", at = @At(value = "INVOKE", target = "Lnet/minecraft/nbt/TagParser;parseTag(Ljava/lang/String;)Lnet/minecraft/nbt/CompoundTag;")) + private static CompoundTag compactTag(CompoundTag tag) { + if (TAG_INTERNER == null) { + TAG_INTERNER = new ObjectOpenHashSet<>(); + } + Map.Entry[] entries = new Map.Entry[tag.size()]; + int i = 0; + for (var key : tag.getAllKeys()) { + Tag t = tag.get(key); + if (t instanceof CompoundTag ct) { + t = compactTag(ct); + } + t = TAG_INTERNER.addOrGet(t); + entries[i++] = Map.entry(key, t); + } + return new CompoundTag(Map.ofEntries(entries)); + } + + @Inject(method = "", at = @At("RETURN")) + private static void clearInterner(CallbackInfo ci) { + if (TAG_INTERNER != null) { + TAG_INTERNER.clear(); + TAG_INTERNER.trim(); + } + } +} diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/deduplicate_climate_parameters/ParameterMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/deduplicate_climate_parameters/ParameterMixin.java deleted file mode 100644 index bfa22b20..00000000 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/deduplicate_climate_parameters/ParameterMixin.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.embeddedt.modernfix.common.mixin.perf.deduplicate_climate_parameters; - -import net.minecraft.world.level.biome.Climate; -import org.embeddedt.modernfix.dedup.ClimateCache; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -@Mixin({ Climate.Parameter.class, Climate.ParameterPoint.class }) -public class ParameterMixin { - @Redirect(method = "*", at = @At(value = "NEW", target = "net/minecraft/world/level/biome/Climate$Parameter"), require = 0) - private static Climate.Parameter internParameterStatic(long min, long max) { - return ClimateCache.MFIX_INTERNER.intern(new Climate.Parameter(min, max)); - } -} diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/deduplicate_location/MixinResourceLocation.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/deduplicate_location/MixinResourceLocation.java deleted file mode 100644 index b9957e1f..00000000 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/deduplicate_location/MixinResourceLocation.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.embeddedt.modernfix.common.mixin.perf.deduplicate_location; - -import net.minecraft.resources.ResourceLocation; -import org.embeddedt.modernfix.dedup.IdentifierCaches; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Mutable; -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(ResourceLocation.class) -public class MixinResourceLocation { - @Mutable - @Shadow - @Final - private String namespace; - - @Mutable - @Shadow - @Final - private String path; - - @Inject(method = "", at = @At("RETURN")) - private void reinit(String string, String string2, CallbackInfo ci) { - this.namespace = IdentifierCaches.NAMESPACES.deduplicate(this.namespace); - this.path = IdentifierCaches.PATH.deduplicate(this.path); - } -} diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_entity_renderers/EntityRenderDispatcherMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_entity_renderers/EntityRenderDispatcherMixin.java deleted file mode 100644 index 4d3f3b41..00000000 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_entity_renderers/EntityRenderDispatcherMixin.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.embeddedt.modernfix.common.mixin.perf.dynamic_entity_renderers; - -import net.minecraft.client.renderer.entity.EntityRenderDispatcher; -import net.minecraft.client.renderer.entity.EntityRenderer; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EntityType; -import org.embeddedt.modernfix.annotation.ClientOnlyMixin; -import org.embeddedt.modernfix.entity.EntityRendererMap; -import org.objectweb.asm.Opcodes; -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.CallbackInfoReturnable; - -import java.util.Map; - -@Mixin(EntityRenderDispatcher.class) -@ClientOnlyMixin -public class EntityRenderDispatcherMixin { - @Shadow private Map, EntityRenderer> renderers; - - private EntityRendererMap mfix$dynamicRenderers; - - @Inject(method = "getRenderer", at = @At("RETURN"), cancellable = true) - private void checkNullness(T entity, CallbackInfoReturnable> cir) { - // apparently some mods yeet the renderers map and cause issues - if(cir.getReturnValue() == null) - cir.setReturnValue((EntityRenderer)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, EntityRenderer> incomingMap) { - this.renderers = incomingMap; - this.mfix$dynamicRenderers = (EntityRendererMap)incomingMap; - } -} diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_entity_renderers/EntityRenderersMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_entity_renderers/EntityRenderersMixin.java deleted file mode 100644 index a6d93ca0..00000000 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_entity_renderers/EntityRenderersMixin.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.embeddedt.modernfix.common.mixin.perf.dynamic_entity_renderers; - -import net.minecraft.client.renderer.entity.EntityRenderer; -import net.minecraft.client.renderer.entity.EntityRendererProvider; -import net.minecraft.client.renderer.entity.EntityRenderers; -import net.minecraft.world.entity.EntityType; -import org.embeddedt.modernfix.ModernFix; -import org.embeddedt.modernfix.annotation.ClientOnlyMixin; -import org.embeddedt.modernfix.entity.EntityRendererMap; -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.Map; - -@Mixin(EntityRenderers.class) -@ClientOnlyMixin -public class EntityRenderersMixin { - @Shadow @Final private static Map, EntityRendererProvider> PROVIDERS; - - @Inject(method = "createEntityRenderers", at = @At("HEAD"), cancellable = true) - private static void createDynamicRendererLoader(EntityRendererProvider.Context context, CallbackInfoReturnable, EntityRenderer>> cir) { - cir.setReturnValue(new EntityRendererMap(PROVIDERS, context)); - ModernFix.LOGGER.info("Dynamic entity renderer hook setup"); - } -} diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/model_optimizations/PropertyMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/model_optimizations/PropertyMixin.java index a443db3a..9c85baa2 100644 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/model_optimizations/PropertyMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/model_optimizations/PropertyMixin.java @@ -1,25 +1,22 @@ package org.embeddedt.modernfix.common.mixin.perf.model_optimizations; import net.minecraft.world.level.block.state.properties.Property; -import org.embeddedt.modernfix.dedup.IdentifierCaches; import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.ModifyVariable; @Mixin(Property.class) public class PropertyMixin { - @Shadow @Mutable - @Final private String name; - - @Shadow private Integer hashCode; + @Shadow @Final private String name; @Shadow @Final private Class clazz; - @Redirect(method = "", at = @At(value = "FIELD", target = "Lnet/minecraft/world/level/block/state/properties/Property;name:Ljava/lang/String;")) - private void internName(Property instance, String name) { - this.name = IdentifierCaches.PROPERTY.deduplicate(name); + @ModifyVariable(method = "", at = @At("HEAD"), ordinal = 0, argsOnly = true) + private static String internName(String name) { + return name.intern(); } + /** * @author embeddedt * @reason compare hashcodes if generated, use reference equality for speed @@ -32,7 +29,8 @@ public class PropertyMixin { return false; } else { Property property = (Property)p_equals_1_; - /* reference equality is safe here because of deduplication */ + /* reference equality is safe here because of interning above */ + //noinspection StringEquality return this.clazz == property.getValueClass() && this.name == property.getName(); } } diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/mojang_registry_size/ResourceKeyMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/mojang_registry_size/ResourceKeyMixin.java deleted file mode 100644 index 7d6701db..00000000 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/mojang_registry_size/ResourceKeyMixin.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.embeddedt.modernfix.common.mixin.perf.mojang_registry_size; - -import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.ResourceLocation; -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.Map; - -@Mixin(ResourceKey.class) -public class ResourceKeyMixin { - private static final Map>> INTERNING_MAP = new Object2ObjectOpenHashMap<>(); - @Inject(method = "create(Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/resources/ResourceKey;", at = @At("HEAD"), cancellable = true) - private static void createEfficient(ResourceLocation parent, ResourceLocation location, CallbackInfoReturnable> cir) { - synchronized (ResourceKey.class) { - Map> keys = INTERNING_MAP.computeIfAbsent(parent, k -> new Object2ObjectOpenHashMap<>()); - ResourceKey key = keys.get(location); - if(key == null) { - key = new ResourceKey<>(parent, location); - keys.put(location, key); - } - cir.setReturnValue((ResourceKey)key); - } - } -} diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/reduce_blockstate_cache_rebuilds/BlocksMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/reduce_blockstate_cache_rebuilds/BlocksMixin.java index dac6f26d..3d35f9c3 100644 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/reduce_blockstate_cache_rebuilds/BlocksMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/reduce_blockstate_cache_rebuilds/BlocksMixin.java @@ -16,7 +16,7 @@ import java.util.function.Consumer; public class BlocksMixin { @ModifyArg(method = "rebuildCache", at = @At(value = "INVOKE", target = "Lnet/minecraft/core/IdMapper;forEach(Ljava/util/function/Consumer;)V"), index = 0) private static Consumer getEmptyConsumer(Consumer original) { - BlockStateCacheHandler.rebuildParallel(true); + BlockStateCacheHandler.invalidateCache(); return o -> {}; } diff --git a/common/src/main/java/org/embeddedt/modernfix/dedup/ClimateCache.java b/common/src/main/java/org/embeddedt/modernfix/dedup/ClimateCache.java deleted file mode 100644 index 91f54376..00000000 --- a/common/src/main/java/org/embeddedt/modernfix/dedup/ClimateCache.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.embeddedt.modernfix.dedup; - -import com.google.common.collect.Interner; -import com.google.common.collect.Interners; -import net.minecraft.world.level.biome.Climate; - -public class ClimateCache { - public static final Interner MFIX_INTERNER = Interners.newStrongInterner(); -} diff --git a/common/src/main/java/org/embeddedt/modernfix/dedup/DeduplicationCache.java b/common/src/main/java/org/embeddedt/modernfix/dedup/DeduplicationCache.java deleted file mode 100644 index d31cd53e..00000000 --- a/common/src/main/java/org/embeddedt/modernfix/dedup/DeduplicationCache.java +++ /dev/null @@ -1,56 +0,0 @@ -package org.embeddedt.modernfix.dedup; - -import it.unimi.dsi.fastutil.Hash; -import it.unimi.dsi.fastutil.objects.ObjectOpenCustomHashSet; - -import java.util.Objects; - -public class DeduplicationCache { - private final ObjectOpenCustomHashSet pool; - - private int attemptedInsertions = 0; - private int deduplicated = 0; - - public DeduplicationCache(Hash.Strategy strategy) { - this.pool = new ObjectOpenCustomHashSet<>(strategy); - } - - public DeduplicationCache() { - this.pool = new ObjectOpenCustomHashSet<>(new Hash.Strategy() { - @Override - public int hashCode(T o) { - return Objects.hashCode(o); - } - - @Override - public boolean equals(T a, T b) { - return Objects.equals(a, b); - } - }); - } - - public synchronized T deduplicate(T item) { - this.attemptedInsertions++; - - T result = this.pool.addOrGet(item); - - if (result != item) { - this.deduplicated++; - } - - return result; - } - - public synchronized void clearCache() { - this.attemptedInsertions = 0; - this.deduplicated = 0; - - this.pool.clear(); - } - - @Override - public synchronized String toString() { - return String.format("DeduplicationCache ( %d/%d de-duplicated, %d pooled )", - this.deduplicated, this.attemptedInsertions, this.pool.size()); - } -} diff --git a/common/src/main/java/org/embeddedt/modernfix/dedup/IdentifierCaches.java b/common/src/main/java/org/embeddedt/modernfix/dedup/IdentifierCaches.java deleted file mode 100644 index e69b36d5..00000000 --- a/common/src/main/java/org/embeddedt/modernfix/dedup/IdentifierCaches.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.embeddedt.modernfix.dedup; - - -import org.embeddedt.modernfix.ModernFix; - -public class IdentifierCaches { - public static final DeduplicationCache NAMESPACES = new DeduplicationCache<>(); - public static final DeduplicationCache PATH = new DeduplicationCache<>(); - public static final DeduplicationCache PROPERTY = new DeduplicationCache<>(); - - public static void printDebug() { - ModernFix.LOGGER.info("[[[ Identifier de-duplication statistics ]]]"); - ModernFix.LOGGER.info("Namespace cache: {}", NAMESPACES); - ModernFix.LOGGER.info("Path cache: {}", PATH); - } -} diff --git a/common/src/main/java/org/embeddedt/modernfix/duck/ICachedMaterialsModel.java b/common/src/main/java/org/embeddedt/modernfix/duck/ICachedMaterialsModel.java deleted file mode 100644 index 855b8c3b..00000000 --- a/common/src/main/java/org/embeddedt/modernfix/duck/ICachedMaterialsModel.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.embeddedt.modernfix.duck; - -public interface ICachedMaterialsModel { - public void clearMaterialsCache(); -} diff --git a/common/src/main/java/org/embeddedt/modernfix/duck/ILevelSave.java b/common/src/main/java/org/embeddedt/modernfix/duck/ILevelSave.java deleted file mode 100644 index 3299c8b9..00000000 --- a/common/src/main/java/org/embeddedt/modernfix/duck/ILevelSave.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.embeddedt.modernfix.duck; - -import net.minecraft.world.level.storage.LevelStorageSource; - -public interface ILevelSave { - public void runWorldPersistenceHooks(LevelStorageSource format); -} diff --git a/common/src/main/java/org/embeddedt/modernfix/duck/ISafeBlockGetter.java b/common/src/main/java/org/embeddedt/modernfix/duck/ISafeBlockGetter.java deleted file mode 100644 index 3fb462ef..00000000 --- a/common/src/main/java/org/embeddedt/modernfix/duck/ISafeBlockGetter.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.embeddedt.modernfix.duck; - -import org.embeddedt.modernfix.chunk.SafeBlockGetter; - -public interface ISafeBlockGetter { - SafeBlockGetter mfix$getSafeBlockGetter(); -} diff --git a/common/src/main/java/org/embeddedt/modernfix/duck/reuse_datapacks/ICachingResourceClient.java b/common/src/main/java/org/embeddedt/modernfix/duck/reuse_datapacks/ICachingResourceClient.java deleted file mode 100644 index 030967d9..00000000 --- a/common/src/main/java/org/embeddedt/modernfix/duck/reuse_datapacks/ICachingResourceClient.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.embeddedt.modernfix.duck.reuse_datapacks; - -import net.minecraft.server.ReloadableServerResources; - -import java.util.Collection; - -public interface ICachingResourceClient { - void setCachedResources(ReloadableServerResources r); - void setCachedDataPackConfig(Collection c); -} diff --git a/common/src/main/java/org/embeddedt/modernfix/dynamicresources/UVController.java b/common/src/main/java/org/embeddedt/modernfix/dynamicresources/UVController.java deleted file mode 100644 index 7b2efe7e..00000000 --- a/common/src/main/java/org/embeddedt/modernfix/dynamicresources/UVController.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.embeddedt.modernfix.dynamicresources; - -import net.minecraft.client.renderer.block.model.BlockFaceUV; - -public class UVController { - public static final ThreadLocal useDummyUv = ThreadLocal.withInitial(() -> Boolean.FALSE); - public static final BlockFaceUV dummyUv = new BlockFaceUV(new float[4], 0); -} diff --git a/common/src/main/java/org/embeddedt/modernfix/entity/EntityRendererMap.java b/common/src/main/java/org/embeddedt/modernfix/entity/EntityRendererMap.java deleted file mode 100644 index b2ab9510..00000000 --- a/common/src/main/java/org/embeddedt/modernfix/entity/EntityRendererMap.java +++ /dev/null @@ -1,185 +0,0 @@ -package org.embeddedt.modernfix.entity; - -import com.google.common.cache.CacheBuilder; -import com.google.common.cache.CacheLoader; -import com.google.common.cache.LoadingCache; -import com.google.common.collect.Iterators; -import com.google.common.collect.Maps; -import net.minecraft.client.renderer.entity.EntityRenderer; -import net.minecraft.client.renderer.entity.EntityRendererProvider; -import net.minecraft.client.renderer.entity.EntityRenderers; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.world.entity.EntityType; -import org.embeddedt.modernfix.ModernFix; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.AbstractCollection; -import java.util.AbstractSet; -import java.util.Collection; -import java.util.Iterator; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; -import java.util.concurrent.ExecutionException; - -@SuppressWarnings("OptionalAssignedToNull") -public class EntityRendererMap implements Map, EntityRenderer> { - private final Map, EntityRendererProvider> rendererProviders; - private final LoadingCache, Optional>> rendererMap; - private final EntityRendererProvider.Context context; - - public EntityRendererMap(Map, EntityRendererProvider> rendererProviders, EntityRendererProvider.Context context) { - this.rendererProviders = rendererProviders; - this.context = context; - this.rendererMap = CacheBuilder.newBuilder().build(new RenderConstructor()); - } - - class RenderConstructor extends CacheLoader, Optional>> { - @Override - public Optional> load(EntityType key) throws Exception { - EntityRendererProvider provider = rendererProviders.get(key); - if(provider == null) - return Optional.empty(); - synchronized(EntityRenderers.class) { - EntityRenderer renderer; - try { - renderer = provider.create(context); - ModernFix.LOGGER.info("Loaded entity {}", BuiltInRegistries.ENTITY_TYPE.getKey(key)); - } catch(RuntimeException e) { - ModernFix.LOGGER.error("Failed to create entity model for " + BuiltInRegistries.ENTITY_TYPE.getKey(key) + ":", e); - renderer = new ErroredEntityRenderer<>(context); - } - return Optional.ofNullable(renderer); - } - } - } - - @Override - public int size() { - return rendererProviders.size(); - } - - @Override - public boolean isEmpty() { - return rendererProviders.isEmpty(); - } - - @Override - public boolean containsKey(Object o) { - return rendererProviders.containsKey(o); - } - - @Override - public boolean containsValue(Object o) { - return false; - } - - @Override - public EntityRenderer get(Object o) { - try { - Optional> renderer = rendererMap.get((EntityType)o); - return renderer.orElse(null); - } catch (IllegalStateException e) { - return null; /* emulate value not being present if recursive load occurs */ - } catch (ExecutionException e) { - throw new RuntimeException(e); - } - } - - @Nullable - @Override - public EntityRenderer put(EntityType entityType, EntityRenderer entityRenderer) { - Optional> old = rendererMap.getIfPresent(entityType); - rendererMap.put(entityType, Optional.ofNullable(entityRenderer)); - return old != null ? old.orElse(null) : null; - } - - @Override - public EntityRenderer remove(Object o) { - Optional> old = rendererMap.getIfPresent(o); - rendererMap.invalidate(o); - return old != null ? old.orElse(null) : null; - } - - @Override - public void putAll(@NotNull Map, ? extends EntityRenderer> map) { - rendererMap.putAll(Maps.transformValues(map, Optional::ofNullable)); - } - - @Override - public void clear() { - rendererMap.invalidateAll(); - } - - @NotNull - @Override - public Set> keySet() { - return rendererProviders.keySet(); - } - - @NotNull - @Override - public Collection> values() { - return new AbstractCollection<>() { - @Override - public Iterator> iterator() { - return Iterators.transform(Iterators.unmodifiableIterator(rendererProviders.keySet().iterator()), EntityRendererMap.this::get); - } - - @Override - public int size() { - return rendererProviders.size(); - } - }; - } - - private class Entry implements Map.Entry, EntityRenderer> { - private final EntityType key; - - private Entry(EntityType key) { - this.key = key; - } - - @Override - public EntityType getKey() { - return key; - } - - @Override - public EntityRenderer getValue() { - return get(key); - } - - @Override - public EntityRenderer setValue(EntityRenderer value) { - return put(key, value); - } - } - - @NotNull - @Override - public Set, EntityRenderer>> entrySet() { - return new AbstractSet<>() { - @Override - public Iterator, EntityRenderer>> iterator() { - return Iterators.transform(Iterators.unmodifiableIterator(rendererProviders.keySet().iterator()), Entry::new); - } - - @Override - public boolean contains(Object o) { - if (o instanceof Map.Entry e) { - return rendererProviders.containsKey(e.getKey()) && Objects.equals(get(e.getKey()), e.getValue()); - } else { - return false; - } - } - - @Override - public int size() { - return rendererProviders.size(); - } - }; - } -} diff --git a/common/src/main/java/org/embeddedt/modernfix/entity/ErroredEntityRenderer.java b/common/src/main/java/org/embeddedt/modernfix/entity/ErroredEntityRenderer.java deleted file mode 100644 index 14e97369..00000000 --- a/common/src/main/java/org/embeddedt/modernfix/entity/ErroredEntityRenderer.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.embeddedt.modernfix.entity; - -import com.mojang.blaze3d.vertex.PoseStack; -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.world.entity.Entity; - -public class ErroredEntityRenderer extends EntityRenderer { - 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) { - } -} diff --git a/common/src/main/java/org/embeddedt/modernfix/sound/SoundBufferCache.java b/common/src/main/java/org/embeddedt/modernfix/sound/SoundBufferCache.java deleted file mode 100644 index 36a10300..00000000 --- a/common/src/main/java/org/embeddedt/modernfix/sound/SoundBufferCache.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.embeddedt.modernfix.sound; - -import com.mojang.blaze3d.audio.SoundBuffer; -import net.minecraft.resources.ResourceLocation; - -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.concurrent.CompletableFuture; - -public class SoundBufferCache extends LinkedHashMap> { - @Override - protected boolean removeEldestEntry(Map.Entry> eldest) { - return super.removeEldestEntry(eldest); - } -} diff --git a/common/src/main/java/org/embeddedt/modernfix/tickables/LoadableTickableObject.java b/common/src/main/java/org/embeddedt/modernfix/tickables/LoadableTickableObject.java deleted file mode 100644 index 8cb32cd5..00000000 --- a/common/src/main/java/org/embeddedt/modernfix/tickables/LoadableTickableObject.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.embeddedt.modernfix.tickables; - -import org.jetbrains.annotations.Nullable; - -import java.util.function.Consumer; -import java.util.function.Supplier; - -public class LoadableTickableObject implements TickableObject { - private volatile int ticksInactive = 0; - private final int timeout; - private final Supplier loader; - private final Consumer finalizer; - private volatile T theObject = null; - - public LoadableTickableObject(int timeout, Supplier loader, Consumer finalizer) { - this(timeout, loader, finalizer, null); - } - - public LoadableTickableObject(int timeout, Supplier loader, Consumer finalizer, @Nullable T initialValue) { - this.timeout = timeout; - this.loader = loader; - this.finalizer = finalizer; - this.theObject = initialValue; - } - - public T get() { - synchronized (this) { - ticksInactive++; - T obj = theObject; - if(obj == null) { - obj = loader.get(); - theObject = obj; - } - return obj; - } - } - - public final void tick() { - synchronized (this) { - ticksInactive++; - if(ticksInactive >= this.timeout) { - finalizer.accept(theObject); - theObject = null; - } - } - } -} diff --git a/common/src/main/java/org/embeddedt/modernfix/tickables/TickableObject.java b/common/src/main/java/org/embeddedt/modernfix/tickables/TickableObject.java deleted file mode 100644 index cc31c47f..00000000 --- a/common/src/main/java/org/embeddedt/modernfix/tickables/TickableObject.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.embeddedt.modernfix.tickables; - -public interface TickableObject { - void tick(); -} diff --git a/common/src/main/java/org/embeddedt/modernfix/tickables/TickableObjectManager.java b/common/src/main/java/org/embeddedt/modernfix/tickables/TickableObjectManager.java deleted file mode 100644 index 4ec5f8e8..00000000 --- a/common/src/main/java/org/embeddedt/modernfix/tickables/TickableObjectManager.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.embeddedt.modernfix.tickables; - -import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; - -public class TickableObjectManager { - private static final List TICKABLE_OBJECT_LIST = new CopyOnWriteArrayList<>(); - - public static void register(TickableObject object) { - TICKABLE_OBJECT_LIST.add(object); - } - - public static void runTick() { - for(TickableObject o : TICKABLE_OBJECT_LIST) { - o.tick(); - } - } -} diff --git a/common/src/main/java/org/embeddedt/modernfix/util/CanonizingStringMap.java b/common/src/main/java/org/embeddedt/modernfix/util/CanonizingStringMap.java deleted file mode 100644 index 015e74a4..00000000 --- a/common/src/main/java/org/embeddedt/modernfix/util/CanonizingStringMap.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.embeddedt.modernfix.util; - -import com.google.common.base.Function; -import com.google.common.collect.Interner; -import com.google.common.collect.Interners; -import com.google.common.collect.Maps; - -import java.util.HashMap; -import java.util.Map; - -/** - * Replacement backing map for CompoundTags that interns keys. - */ -public class CanonizingStringMap extends HashMap { - private static final Interner KEY_INTERNER = Interners.newWeakInterner(); - - private static String intern(String key) { - return key != null ? KEY_INTERNER.intern(key) : null; - } - - public CanonizingStringMap() { - super(); - } - - @Override - public T put(String key, T value) { - return super.put(intern(key), value); - } - - @Override - public void putAll(Map m) { - if(m.isEmpty()) - return; - HashMap tmp = new HashMap<>(); - m.forEach((k, v) -> tmp.put(intern(k), v)); - super.putAll(tmp); - } - - private void putAllWithoutInterning(Map m) { - super.putAll(m); - } - - public static CanonizingStringMap deepCopy(CanonizingStringMap incomingMap, Function deepCopier) { - CanonizingStringMap newMap = new CanonizingStringMap<>(); - newMap.putAllWithoutInterning(Maps.transformValues(incomingMap, deepCopier)); - return newMap; - } -} diff --git a/common/src/main/java/org/embeddedt/modernfix/util/DummyServerConfiguration.java b/common/src/main/java/org/embeddedt/modernfix/util/DummyServerConfiguration.java deleted file mode 100644 index 6e48a61d..00000000 --- a/common/src/main/java/org/embeddedt/modernfix/util/DummyServerConfiguration.java +++ /dev/null @@ -1,162 +0,0 @@ -package org.embeddedt.modernfix.util; - -import com.google.common.collect.ImmutableSet; -import com.mojang.serialization.Lifecycle; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.level.*; -import net.minecraft.core.RegistryAccess; -import net.minecraft.world.Difficulty; -import net.minecraft.world.level.dimension.end.EndDragonFight; -import net.minecraft.world.level.levelgen.WorldOptions; -import net.minecraft.world.level.storage.WorldData; -import net.minecraft.world.level.storage.ServerLevelData; - -import java.util.Collections; -import java.util.Set; - -public class DummyServerConfiguration implements WorldData { - @Override - public WorldDataConfiguration getDataConfiguration() { - return null; - } - - @Override - public void setDataConfiguration(WorldDataConfiguration arg) { - - } - - @Override - public Set getRemovedFeatureFlags() { - return Collections.emptySet(); - } - - @Override - public boolean wasModded() { - return true; - } - - @Override - public Set getKnownServerBrands() { - return ImmutableSet.of("forge"); - } - - @Override - public void setModdedInfo(String name, boolean isModded) { - - } - - @Override - public CompoundTag getCustomBossEvents() { - return null; - } - - @Override - public void setCustomBossEvents(CompoundTag nbt) { - - } - - @Override - public ServerLevelData overworldData() { - return null; - } - - @Override - public LevelSettings getLevelSettings() { - return null; - } - - @Override - public CompoundTag createTag(RegistryAccess registries, CompoundTag hostPlayerNBT) { - return null; - } - - @Override - public boolean isHardcore() { - return false; - } - - @Override - public int getVersion() { - return 0; - } - - @Override - public String getLevelName() { - return null; - } - - @Override - public GameType getGameType() { - return null; - } - - @Override - public void setGameType(GameType type) { - - } - - @Override - public boolean isAllowCommands() { - return false; - } - - @Override - public Difficulty getDifficulty() { - return null; - } - - @Override - public void setDifficulty(Difficulty difficulty) { - - } - - @Override - public boolean isDifficultyLocked() { - return false; - } - - @Override - public void setDifficultyLocked(boolean locked) { - - } - - @Override - public GameRules getGameRules() { - return null; - } - - @Override - public CompoundTag getLoadedPlayerTag() { - return null; - } - - @Override - public EndDragonFight.Data endDragonFightData() { - return EndDragonFight.Data.DEFAULT; - } - - @Override - public void setEndDragonFightData(EndDragonFight.Data data) { - - } - - @Override - public WorldOptions worldGenOptions() { - return null; - } - - @Override - public boolean isFlatWorld() { - return false; - } - - @Override - public boolean isDebugWorld() { - return false; - } - - @Override - public Lifecycle worldGenSettingsLifecycle() { - return Lifecycle.stable(); - } -} diff --git a/common/src/main/java/org/embeddedt/modernfix/util/LayeredForwardingMap.java b/common/src/main/java/org/embeddedt/modernfix/util/LayeredForwardingMap.java deleted file mode 100644 index cf9f3528..00000000 --- a/common/src/main/java/org/embeddedt/modernfix/util/LayeredForwardingMap.java +++ /dev/null @@ -1,132 +0,0 @@ -package org.embeddedt.modernfix.util; - -import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.*; - -/** - * Simple forwarding map implementation that allows layering multiple maps together. - */ -public class LayeredForwardingMap implements Map { - private final Map[] layers; - - public LayeredForwardingMap(Map[] layers) { - if(layers.length < 1) - throw new IllegalArgumentException(); - for(Map layer : layers) { - if(layer == null) - throw new IllegalArgumentException(); - } - this.layers = layers; - } - - @Override - public int size() { - return 1; - } - - @Override - public boolean isEmpty() { - for(Map map : layers) { - if(!map.isEmpty()) - return false; - } - return true; - } - - @Override - public boolean containsKey(Object key) { - for(Map map : layers) { - if(map.containsKey(key)) - return true; - } - return false; - } - - @Override - public boolean containsValue(Object value) { - for(Map map : layers) { - if(map.containsValue(value)) - return true; - } - return false; - } - - @Override - public V get(Object key) { - for(Map map : layers) { - V value = map.get(key); - if(value != null) - return value; - } - return null; - } - - @Nullable - @Override - public V put(K key, V value) { - if(value == null) - throw new IllegalArgumentException(); - V originalValue = null; - for(Map map : layers) { - V oldVal = map.remove(key); - if(originalValue == null) - originalValue = oldVal; - map.put(key, value); - } - return originalValue; - } - - @Override - public V remove(Object key) { - for(Map map : layers) { - map.remove(key); - } - return null; - } - - @Override - public void putAll(@NotNull Map m) { - for(V value : m.values()) { - if(value == null) - throw new IllegalArgumentException(); - } - for(Map map : layers) { - map.putAll(m); - } - } - - @Override - public void clear() { - throw new UnsupportedOperationException(); - } - - @NotNull - @Override - public Set keySet() { - Set keys = new ObjectOpenHashSet<>(); - for(Map map : layers) { - keys.addAll(map.keySet()); - } - return Collections.unmodifiableSet(keys); - } - - @NotNull - @Override - public Collection values() { - Set keys = keySet(); - List vals = new ArrayList<>(); - for(K key : keys) { - vals.add(get(key)); - } - return vals; - } - - @NotNull - @Override - public Set> entrySet() { - throw new UnsupportedOperationException(); - } -} diff --git a/neoforge/src/main/java/org/embeddedt/modernfix/neoforge/classloading/ClassLoadHack.java b/neoforge/src/main/java/org/embeddedt/modernfix/neoforge/classloading/ClassLoadHack.java deleted file mode 100644 index 2a073cbc..00000000 --- a/neoforge/src/main/java/org/embeddedt/modernfix/neoforge/classloading/ClassLoadHack.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.embeddedt.modernfix.neoforge.classloading; - -/** - * Sometimes mods have classes that circularly reference each other. If each of these classes ends up being loaded - * from two mods, a deadlock occurs. - * - * To avoid this problem we maintain a list of classes that should be loaded early and do it via Class.forName. - */ -public class ClassLoadHack { - private static final String[] classesToLoadEarly = new String[] { - "team.creative.creativecore.common.config.ConfigTypeConveration", - "team.creative.creativecore.common.util.ingredient.CreativeIngredient" - }; - - public static void loadModClasses() { - for(String clzName : classesToLoadEarly) { - try { - Class.forName(clzName); - } catch(Throwable e) { - if(!(e instanceof ClassNotFoundException)) { - e.printStackTrace(); - } - } - } - } -}