From 1176cc98e3a700abe91979375c240313220d9d20 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Fri, 26 Dec 2025 14:02:15 -0500 Subject: [PATCH 1/6] Compact NBT used for Flattening world upgrades --- .../BlockStateDataMixin.java | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/compact_mojang_registries/BlockStateDataMixin.java 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(); + } + } +} From a7a9aac23a306ace1302fca04344e9c4313ec0a7 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Fri, 26 Dec 2025 15:37:32 -0500 Subject: [PATCH 2/6] Begin cleaning up a large volume of code --- .../embeddedt/modernfix/ModernFixClient.java | 105 ------------------ .../blockstate/BlockStateCacheHandler.java | 2 +- .../blockstate/FerriteCorePostProcess.java | 62 ----------- .../modernfix/chunk/SafeBlockGetter.java | 78 ------------- .../chunk_deadlock/BlockStateBaseMixin.java | 22 ---- .../chunk_deadlock/ServerLevelMixin.java | 18 --- .../bugfix/concurrency/MinecraftMixin.java | 36 ------ .../mixin/core/SynchedEntityDataMixin.java | 26 ----- .../direct_stack_trace/CrashReportMixin.java | 22 ---- .../ServerChunkCacheMixin.java | 71 ------------ .../cache_model_materials/MultipartMixin.java | 28 ----- .../MixinResourceLocation.java | 30 ----- .../EntityRenderDispatcherMixin.java | 38 ------- .../EntityRenderersMixin.java | 29 ----- .../BlockElementFaceDeserializerMixin.java | 23 ---- .../model_optimizations/PropertyMixin.java | 18 ++- .../ResourceKeyMixin.java | 28 ----- .../BlocksMixin.java | 2 +- .../modernfix/dedup/IdentifierCaches.java | 6 - .../dynamicresources/UVController.java | 8 -- .../entity/EntityDataIDSyncHandler.java | 57 ---------- .../modernfix/packet/EntityIDSyncPacket.java | 78 ------------- .../BlockCallbacksMixin.java | 2 +- .../modernfix/forge/packet/PacketHandler.java | 15 --- 24 files changed, 11 insertions(+), 793 deletions(-) delete mode 100644 common/src/main/java/org/embeddedt/modernfix/blockstate/FerriteCorePostProcess.java delete mode 100644 common/src/main/java/org/embeddedt/modernfix/chunk/SafeBlockGetter.java delete mode 100644 common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/chunk_deadlock/BlockStateBaseMixin.java delete mode 100644 common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/chunk_deadlock/ServerLevelMixin.java delete mode 100644 common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/concurrency/MinecraftMixin.java delete mode 100644 common/src/main/java/org/embeddedt/modernfix/common/mixin/core/SynchedEntityDataMixin.java delete mode 100644 common/src/main/java/org/embeddedt/modernfix/common/mixin/feature/direct_stack_trace/CrashReportMixin.java delete mode 100644 common/src/main/java/org/embeddedt/modernfix/common/mixin/feature/stalled_chunk_load_detection/ServerChunkCacheMixin.java delete mode 100644 common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/cache_model_materials/MultipartMixin.java delete mode 100644 common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/deduplicate_location/MixinResourceLocation.java delete mode 100644 common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_entity_renderers/EntityRenderDispatcherMixin.java delete mode 100644 common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_entity_renderers/EntityRenderersMixin.java delete mode 100644 common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/BlockElementFaceDeserializerMixin.java delete mode 100644 common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/mojang_registry_size/ResourceKeyMixin.java delete mode 100644 common/src/main/java/org/embeddedt/modernfix/dynamicresources/UVController.java delete mode 100644 common/src/main/java/org/embeddedt/modernfix/entity/EntityDataIDSyncHandler.java delete mode 100644 common/src/main/java/org/embeddedt/modernfix/packet/EntityIDSyncPacket.java diff --git a/common/src/main/java/org/embeddedt/modernfix/ModernFixClient.java b/common/src/main/java/org/embeddedt/modernfix/ModernFixClient.java index 7dbee016..aa55531a 100644 --- a/common/src/main/java/org/embeddedt/modernfix/ModernFixClient.java +++ b/common/src/main/java/org/embeddedt/modernfix/ModernFixClient.java @@ -1,17 +1,11 @@ package org.embeddedt.modernfix; -import com.mojang.datafixers.util.Pair; -import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import net.minecraft.client.Minecraft; -import net.minecraft.network.syncher.EntityDataAccessor; -import net.minecraft.network.syncher.SynchedEntityData; 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; -import org.embeddedt.modernfix.packet.EntityIDSyncPacket; import org.embeddedt.modernfix.platform.ModernFixPlatformHooks; import org.embeddedt.modernfix.searchtree.JEIBackedSearchTree; import org.embeddedt.modernfix.searchtree.REIBackedSearchTree; @@ -21,7 +15,6 @@ import org.embeddedt.modernfix.util.ClassInfoManager; import org.embeddedt.modernfix.world.IntegratedWatchdog; import java.lang.management.ManagementFactory; -import java.lang.reflect.Field; import java.util.*; import java.util.concurrent.CopyOnWriteArrayList; @@ -108,104 +101,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; - } - } - - /** - * Horrendous hack to allow tracking every synced entity data manager. - * - * This is to ensure we can perform ID fixup on already constructed managers. - */ - public static final Set allEntityDatas = Collections.newSetFromMap(new WeakHashMap<>()); - - private static final Field entriesArrayField; - static { - Field field; - try { - field = SynchedEntityData.class.getDeclaredField("entriesArray"); - field.setAccessible(true); - } catch(ReflectiveOperationException e) { - field = null; - } - entriesArrayField = field; - } - - /** - * Extremely hacky method to detect and correct mismatched entity data parameter IDs on the client and server. - * - * The technique is far from ideal, but it should detect reliably and also not break already constructed entities. - */ - public static void handleEntityIDSync(EntityIDSyncPacket packet) { - Map, List>> info = packet.getFieldInfo(); - boolean fixNeeded = false; - for(Map.Entry, List>> entry : info.entrySet()) { - Class eClass = entry.getKey(); - for(Pair field : entry.getValue()) { - String fieldName = field.getFirst(); - int newId = field.getSecond(); - try { - Field f = eClass.getDeclaredField(fieldName); - f.setAccessible(true); - EntityDataAccessor accessor = (EntityDataAccessor)f.get(null); - if(compareAndSwitchIds(eClass, fieldName, accessor, newId)) - fixNeeded = true; - } catch(NoSuchFieldException e) { - ModernFix.LOGGER.warn("Couldn't find field on {}: {}", eClass, fieldName); - } catch(ReflectiveOperationException e) { - throw new RuntimeException("Unexpected exception", e); - } - } - } - /* Now the ID mappings on synced entity data instances are probably all wrong. Fix that. */ - List dataEntries; - synchronized (allEntityDatas) { - if(fixNeeded) { - dataEntries = new ArrayList<>(allEntityDatas); - for(SynchedEntityData manager : dataEntries) { - Int2ObjectOpenHashMap> fixedMap = new Int2ObjectOpenHashMap<>(); - List> items = new ArrayList<>(manager.itemsById.values()); - for(SynchedEntityData.DataItem item : items) { - fixedMap.put(item.getAccessor().id, item); - } - manager.lock.writeLock().lock(); - try { - manager.itemsById.replaceAll((id, parameter) -> fixedMap.get((int)id)); - if(entriesArrayField != null) { - try { - SynchedEntityData.DataItem[] dataArray = new SynchedEntityData.DataItem[items.size()]; - for(int i = 0; i < dataArray.length; i++) { - dataArray[i] = fixedMap.get(i); - } - entriesArrayField.set(manager, dataArray); - } catch(ReflectiveOperationException e) { - ModernFix.LOGGER.error(e); - } - } - } finally { - manager.lock.writeLock().unlock(); - } - } - } - allEntityDatas.clear(); - } - } - 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 3d4efe52..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.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.getStatus().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/core/SynchedEntityDataMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/core/SynchedEntityDataMixin.java deleted file mode 100644 index 9737a2f2..00000000 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/core/SynchedEntityDataMixin.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.embeddedt.modernfix.common.mixin.core; - -import net.minecraft.network.syncher.SynchedEntityData; -import net.minecraft.world.entity.Entity; -import org.embeddedt.modernfix.ModernFixClient; -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.CallbackInfo; - -@Mixin(SynchedEntityData.class) -@ClientOnlyMixin -public class SynchedEntityDataMixin { - /** - * Store this in our set of all entity data objects. - * - * Not an ideal solution, but it should guarantee compatibility with mods. - */ - @Inject(method = "", at = @At("RETURN")) - private void storeInSet(Entity arg, CallbackInfo ci) { - synchronized (ModernFixClient.allEntityDatas) { - ModernFixClient.allEntityDatas.add((SynchedEntityData)(Object)this); - } - } -} 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 2841921c..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 = "Ljava/io/PrintStream;println(Ljava/lang/String;)V")) - 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 72a6fb2b..00000000 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/feature/stalled_chunk_load_detection/ServerChunkCacheMixin.java +++ /dev/null @@ -1,71 +0,0 @@ -package org.embeddedt.modernfix.common.mixin.feature.stalled_chunk_load_detection; - -import com.mojang.datafixers.util.Either; -import net.minecraft.core.Holder; -import net.minecraft.core.registries.Registries; -import net.minecraft.server.level.ChunkHolder; -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.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 - Either resultingChunk = null; - try { - resultingChunk = future.get(500, TimeUnit.MILLISECONDS); - } catch(InterruptedException | ExecutionException | TimeoutException ignored) { - } - if(resultingChunk != null && resultingChunk.left().isPresent()) { - cir.setReturnValue(resultingChunk.left().get()); - 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.left().isPresent()) { - cir.setReturnValue(resultingChunk.left().get()); - 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/deduplicate_location/MixinResourceLocation.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/deduplicate_location/MixinResourceLocation.java deleted file mode 100644 index eb2c8cba..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 - protected String namespace; - - @Mutable - @Shadow - @Final - protected String path; - - @Inject(method = "([Ljava/lang/String;)V", at = @At("RETURN")) - private void reinit(String[] id, 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/dynamic_resources/BlockElementFaceDeserializerMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/BlockElementFaceDeserializerMixin.java deleted file mode 100644 index 17404372..00000000 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/BlockElementFaceDeserializerMixin.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.embeddedt.modernfix.common.mixin.perf.dynamic_resources; - -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonElement; -import net.minecraft.client.renderer.block.model.BlockElementFace; -import org.embeddedt.modernfix.annotation.ClientOnlyMixin; -import org.embeddedt.modernfix.dynamicresources.UVController; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -import java.lang.reflect.Type; - -@Mixin(BlockElementFace.Deserializer.class) -@ClientOnlyMixin -public class BlockElementFaceDeserializerMixin { - - @Redirect(method = "deserialize(Lcom/google/gson/JsonElement;Ljava/lang/reflect/Type;Lcom/google/gson/JsonDeserializationContext;)Lnet/minecraft/client/renderer/block/model/BlockElementFace;", - at = @At(value = "INVOKE", target = "Lcom/google/gson/JsonDeserializationContext;deserialize(Lcom/google/gson/JsonElement;Ljava/lang/reflect/Type;)Ljava/lang/Object;", ordinal = 0, remap = false)) - private Object skipUvsForInitialLoad(JsonDeserializationContext context, JsonElement element, Type type) { - return UVController.useDummyUv.get() ? UVController.dummyUv : context.deserialize(element, type); - } -} 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/IdentifierCaches.java b/common/src/main/java/org/embeddedt/modernfix/dedup/IdentifierCaches.java index e69b36d5..b8569f6b 100644 --- a/common/src/main/java/org/embeddedt/modernfix/dedup/IdentifierCaches.java +++ b/common/src/main/java/org/embeddedt/modernfix/dedup/IdentifierCaches.java @@ -7,10 +7,4 @@ 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/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/EntityDataIDSyncHandler.java b/common/src/main/java/org/embeddedt/modernfix/entity/EntityDataIDSyncHandler.java deleted file mode 100644 index 9a9bb88d..00000000 --- a/common/src/main/java/org/embeddedt/modernfix/entity/EntityDataIDSyncHandler.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.embeddedt.modernfix.entity; - -import com.mojang.datafixers.util.Pair; -import net.minecraft.network.syncher.EntityDataAccessor; -import net.minecraft.network.syncher.SynchedEntityData; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.entity.Entity; -import org.embeddedt.modernfix.ModernFix; -import org.embeddedt.modernfix.packet.EntityIDSyncPacket; -import org.embeddedt.modernfix.platform.ModernFixPlatformHooks; - -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class EntityDataIDSyncHandler { - private static Map, List>> fieldsToSyncMap; - - @SuppressWarnings("unchecked") - public static void onDatapackSyncEvent(ServerPlayer targetPlayer) { - if(targetPlayer != null) { - /* Compute the current set of serializer IDs in use and send them */ - if(fieldsToSyncMap == null) { - fieldsToSyncMap = new HashMap<>(); - Map, Integer> entityPoolMap = SynchedEntityData.ENTITY_ID_POOL; - List fieldsToSync = new ArrayList<>(); - for(Class eClass : entityPoolMap.keySet()) { - fieldsToSync.clear(); - try { - Field[] classFields = eClass.getDeclaredFields(); - for(Field field : classFields) { - if(!Modifier.isStatic(field.getModifiers())) - continue; - field.setAccessible(true); - Object o = field.get(null); - if(o != null && EntityDataAccessor.class.isAssignableFrom(o.getClass())) { - fieldsToSync.add(field); - } - } - for(Field field : fieldsToSync) { - int id = ((EntityDataAccessor)field.get(null)).id; - fieldsToSyncMap.computeIfAbsent(eClass, k -> new ArrayList<>()).add(Pair.of(field.getName(), id)); - } - } catch(Throwable e) { - ModernFix.LOGGER.error("Skipping entity ID sync for {}: {}", eClass.getName(), e); - } - } - } - EntityIDSyncPacket packet = new EntityIDSyncPacket(fieldsToSyncMap); - ModernFix.LOGGER.debug("Sending ID correction packet to client with " + fieldsToSyncMap.size() + " classes"); - ModernFixPlatformHooks.INSTANCE.sendPacket(targetPlayer, packet); - } - } -} diff --git a/common/src/main/java/org/embeddedt/modernfix/packet/EntityIDSyncPacket.java b/common/src/main/java/org/embeddedt/modernfix/packet/EntityIDSyncPacket.java deleted file mode 100644 index 6fe2c6b1..00000000 --- a/common/src/main/java/org/embeddedt/modernfix/packet/EntityIDSyncPacket.java +++ /dev/null @@ -1,78 +0,0 @@ -package org.embeddedt.modernfix.packet; - -import com.mojang.datafixers.util.Pair; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.syncher.EntityDataAccessor; -import net.minecraft.world.entity.Entity; -import org.embeddedt.modernfix.ModernFix; - -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.util.*; - -public class EntityIDSyncPacket { - private Map, List>> map; - - public EntityIDSyncPacket(Map, List>> map) { - this.map = map; - } - - public Map, List>> getFieldInfo() { - return this.map; - } - - public EntityIDSyncPacket() { - this.map = new HashMap<>(); - } - - public void serialize(FriendlyByteBuf buf) { - buf.writeVarInt(map.keySet().size()); - for(Map.Entry, List>> entry : map.entrySet()) { - buf.writeUtf(entry.getKey().getName()); - buf.writeVarInt(entry.getValue().size()); - for(Pair field : entry.getValue()) { - buf.writeUtf(field.getFirst()); - buf.writeVarInt(field.getSecond()); - } - } - } - - @SuppressWarnings("unchecked") - public static EntityIDSyncPacket deserialize(FriendlyByteBuf buf) { - EntityIDSyncPacket self = new EntityIDSyncPacket(); - int numEntityClasses = buf.readVarInt(); - for(int i = 0; i < numEntityClasses; i++) { - String clzName = buf.readUtf(); - try { - Class clz; - try { - clz = Class.forName(clzName); - } catch(ClassNotFoundException e) { - ModernFix.LOGGER.warn("Entity class not found: {}", clzName); - break; - } - if(!Entity.class.isAssignableFrom(clz)) { - ModernFix.LOGGER.error("Not an entity: " + clzName); - break; - } - int numFields = buf.readVarInt(); - for(int j = 0; j < numFields; j++) { - String fieldName = buf.readUtf(); - int id = buf.readVarInt(); - Field f = clz.getDeclaredField(fieldName); - if(!Modifier.isStatic(f.getModifiers())) - continue; - f.setAccessible(true); - if(!EntityDataAccessor.class.isAssignableFrom(f.get(null).getClass())) { - ModernFix.LOGGER.error("Not a data accessor field: " + clz + "." + fieldName); - continue; - } - self.map.computeIfAbsent((Class)clz, k -> new ArrayList<>()).add(Pair.of(fieldName, id)); - } - } catch(ReflectiveOperationException e) { - ModernFix.LOGGER.error("Error deserializing packet", e); - } - } - return self; - } -} diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/reduce_blockstate_cache_rebuilds/BlockCallbacksMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/reduce_blockstate_cache_rebuilds/BlockCallbacksMixin.java index 85c718d3..45c1634d 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/reduce_blockstate_cache_rebuilds/BlockCallbacksMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/reduce_blockstate_cache_rebuilds/BlockCallbacksMixin.java @@ -20,6 +20,6 @@ public class BlockCallbacksMixin { @Inject(method = "onBake", at = @At(value = "TAIL"), remap = false) private void computeCaches(IForgeRegistryInternal owner, RegistryManager stage, CallbackInfo ci) { - BlockStateCacheHandler.rebuildParallel(false); + BlockStateCacheHandler.invalidateCache(); } } diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/packet/PacketHandler.java b/forge/src/main/java/org/embeddedt/modernfix/forge/packet/PacketHandler.java index 3613b7a4..be9b272b 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/packet/PacketHandler.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/packet/PacketHandler.java @@ -1,17 +1,10 @@ package org.embeddedt.modernfix.forge.packet; import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.network.NetworkEvent; import net.minecraftforge.network.NetworkRegistry; import net.minecraftforge.network.simple.SimpleChannel; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.fml.DistExecutor; import org.embeddedt.modernfix.ModernFix; -import org.embeddedt.modernfix.ModernFixClient; import org.embeddedt.modernfix.core.ModernFixMixinPlugin; -import org.embeddedt.modernfix.packet.EntityIDSyncPacket; - -import java.util.function.Supplier; public class PacketHandler { public static final SimpleChannel INSTANCE = buildChannel("main", "1"); @@ -39,13 +32,5 @@ public class PacketHandler { } public static void register() { - INSTANCE.registerMessage(1, EntityIDSyncPacket.class, EntityIDSyncPacket::serialize, EntityIDSyncPacket::deserialize, PacketHandler::handleSyncPacket); - } - - private static void handleSyncPacket(EntityIDSyncPacket packet, Supplier contextSupplier) { - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { - contextSupplier.get().enqueueWork(() -> ModernFixClient.handleEntityIDSync(packet)); - contextSupplier.get().setPacketHandled(true); - }); } } From a8227a964dc136278070379796e6a4548c67e3b7 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Fri, 26 Dec 2025 15:49:33 -0500 Subject: [PATCH 3/6] Remove deduplicate_climate_parameters, not worth the overhead Also remove some other misc classes --- .../ParameterMixin.java | 15 -- .../modernfix/dedup/ClimateCache.java | 9 - .../modernfix/dedup/DeduplicationCache.java | 56 ------ .../modernfix/dedup/IdentifierCaches.java | 10 - .../modernfix/duck/ICachedMaterialsModel.java | 5 - .../embeddedt/modernfix/duck/ILevelSave.java | 7 - .../modernfix/duck/ISafeBlockGetter.java | 7 - .../ICachingResourceClient.java | 10 - .../modernfix/entity/EntityRendererMap.java | 185 ------------------ .../entity/ErroredEntityRenderer.java | 30 --- 10 files changed, 334 deletions(-) delete mode 100644 common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/deduplicate_climate_parameters/ParameterMixin.java delete mode 100644 common/src/main/java/org/embeddedt/modernfix/dedup/ClimateCache.java delete mode 100644 common/src/main/java/org/embeddedt/modernfix/dedup/DeduplicationCache.java delete mode 100644 common/src/main/java/org/embeddedt/modernfix/dedup/IdentifierCaches.java delete mode 100644 common/src/main/java/org/embeddedt/modernfix/duck/ICachedMaterialsModel.java delete mode 100644 common/src/main/java/org/embeddedt/modernfix/duck/ILevelSave.java delete mode 100644 common/src/main/java/org/embeddedt/modernfix/duck/ISafeBlockGetter.java delete mode 100644 common/src/main/java/org/embeddedt/modernfix/duck/reuse_datapacks/ICachingResourceClient.java delete mode 100644 common/src/main/java/org/embeddedt/modernfix/entity/EntityRendererMap.java delete mode 100644 common/src/main/java/org/embeddedt/modernfix/entity/ErroredEntityRenderer.java 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/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 b8569f6b..00000000 --- a/common/src/main/java/org/embeddedt/modernfix/dedup/IdentifierCaches.java +++ /dev/null @@ -1,10 +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<>(); -} 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/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) { - } -} From 7f27141a16682241873fa802e02fe51575c273d1 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Fri, 26 Dec 2025 15:53:26 -0500 Subject: [PATCH 4/6] Remove more old code --- .../org/embeddedt/modernfix/FileWalker.java | 21 --- .../modernfix/sound/SoundBufferCache.java | 15 -- .../tickables/LoadableTickableObject.java | 47 ----- .../modernfix/tickables/TickableObject.java | 5 - .../tickables/TickableObjectManager.java | 18 -- .../embeddedt/modernfix/util/BakeReason.java | 25 --- .../modernfix/util/CanonizingStringMap.java | 48 ------ .../util/DummyServerConfiguration.java | 162 ------------------ .../modernfix/util/LayeredForwardingMap.java | 132 -------------- .../GameDataMixin.java | 47 ----- 10 files changed, 520 deletions(-) delete mode 100644 common/src/main/java/org/embeddedt/modernfix/FileWalker.java delete mode 100644 common/src/main/java/org/embeddedt/modernfix/sound/SoundBufferCache.java delete mode 100644 common/src/main/java/org/embeddedt/modernfix/tickables/LoadableTickableObject.java delete mode 100644 common/src/main/java/org/embeddedt/modernfix/tickables/TickableObject.java delete mode 100644 common/src/main/java/org/embeddedt/modernfix/tickables/TickableObjectManager.java delete mode 100644 common/src/main/java/org/embeddedt/modernfix/util/BakeReason.java delete mode 100644 common/src/main/java/org/embeddedt/modernfix/util/CanonizingStringMap.java delete mode 100644 common/src/main/java/org/embeddedt/modernfix/util/DummyServerConfiguration.java delete mode 100644 common/src/main/java/org/embeddedt/modernfix/util/LayeredForwardingMap.java delete mode 100644 forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/reduce_blockstate_cache_rebuilds/GameDataMixin.java 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/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/BakeReason.java b/common/src/main/java/org/embeddedt/modernfix/util/BakeReason.java deleted file mode 100644 index e7074389..00000000 --- a/common/src/main/java/org/embeddedt/modernfix/util/BakeReason.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.embeddedt.modernfix.util; - -import org.embeddedt.modernfix.ModernFix; - -public enum BakeReason { - FREEZE, - REMOTE_SNAPSHOT_INJECT, - LOCAL_SNAPSHOT_INJECT, - REVERT, - UNKNOWN; - private static BakeReason currentBakeReason = null; - private static boolean bakeReasonWarned = false; - - public static BakeReason getCurrentBakeReason() { - if(currentBakeReason == null && !bakeReasonWarned) { - ModernFix.LOGGER.warn("No bake reason found, mixin probably not applied correctly", new IllegalStateException()); - bakeReasonWarned = false; - } - return currentBakeReason; - } - - public static void setCurrentBakeReason(BakeReason reason) { - currentBakeReason = reason; - } -} 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 8b50b073..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 getAllowCommands() { - 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/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/reduce_blockstate_cache_rebuilds/GameDataMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/reduce_blockstate_cache_rebuilds/GameDataMixin.java deleted file mode 100644 index 1bf49444..00000000 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/reduce_blockstate_cache_rebuilds/GameDataMixin.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.embeddedt.modernfix.forge.mixin.perf.reduce_blockstate_cache_rebuilds; - -import com.google.common.collect.Multimap; -import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.registries.ForgeRegistry; -import net.minecraftforge.registries.GameData; -import org.embeddedt.modernfix.util.BakeReason; -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.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import java.util.Map; - -@Mixin(GameData.class) -public class GameDataMixin { - @Inject(method = "freezeData", at = @At(value = "INVOKE", target = "Lcom/google/common/collect/BiMap;forEach(Ljava/util/function/BiConsumer;)V", ordinal = 1), remap = false) - private static void markFreezeBakeReason(CallbackInfo ci) { - BakeReason.setCurrentBakeReason(BakeReason.FREEZE); - } - - @Inject(method = "freezeData", at = @At(value = "INVOKE", target = "Lnet/minecraftforge/registries/GameData;fireRemapEvent(Ljava/util/Map;Z)V"), remap = false) - private static void markEmptyBakeReason1(CallbackInfo ci) { - BakeReason.setCurrentBakeReason(null); - } - - @Inject(method = "revertTo", at = @At(value = "INVOKE", target = "Lcom/google/common/collect/BiMap;forEach(Ljava/util/function/BiConsumer;)V", ordinal = 1), remap = false) - private static void markRevertBakeReason(CallbackInfo ci) { - BakeReason.setCurrentBakeReason(BakeReason.REVERT); - } - - @Inject(method = "revertTo", at = @At(value = "INVOKE", target = "Lcom/google/common/collect/BiMap;forEach(Ljava/util/function/BiConsumer;)V", ordinal = 1, shift = At.Shift.AFTER), remap = false) - private static void markEmptyBakeReason2(CallbackInfo ci) { - BakeReason.setCurrentBakeReason(null); - } - - @Inject(method = "injectSnapshot", at = @At("HEAD"), remap = false) - private static void markSnapshotInjectBakeReason(Map snapshot, boolean injectFrozenData, boolean isLocalWorld, CallbackInfoReturnable> cir) { - BakeReason.setCurrentBakeReason(isLocalWorld ? BakeReason.LOCAL_SNAPSHOT_INJECT : BakeReason.REMOTE_SNAPSHOT_INJECT); - } - - @Inject(method = "injectSnapshot", at = @At("RETURN"), remap = false) - private static void markEmptyBakeReason2(Map snapshot, boolean injectFrozenData, boolean isLocalWorld, CallbackInfoReturnable> cir) { - BakeReason.setCurrentBakeReason(null); - } -} From 555213714ff5c2bbfa26ea6e425990376c65013c Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Fri, 26 Dec 2025 16:10:07 -0500 Subject: [PATCH 5/6] Delete more old code --- .../forge/classloading/ClassLoadHack.java | 26 ------------------- .../ForgeRegistryMixin.java | 18 ------------- .../forge/rs/IFluidExternalStorageCache.java | 7 ----- .../forge/rs/IItemExternalStorageCache.java | 7 ----- 4 files changed, 58 deletions(-) delete mode 100644 forge/src/main/java/org/embeddedt/modernfix/forge/classloading/ClassLoadHack.java delete mode 100644 forge/src/main/java/org/embeddedt/modernfix/forge/rs/IFluidExternalStorageCache.java delete mode 100644 forge/src/main/java/org/embeddedt/modernfix/forge/rs/IItemExternalStorageCache.java diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/classloading/ClassLoadHack.java b/forge/src/main/java/org/embeddedt/modernfix/forge/classloading/ClassLoadHack.java deleted file mode 100644 index 169de148..00000000 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/classloading/ClassLoadHack.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.embeddedt.modernfix.forge.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(); - } - } - } - } -} diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/fast_registry_validation/ForgeRegistryMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/fast_registry_validation/ForgeRegistryMixin.java index 2612ba24..ff20449d 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/fast_registry_validation/ForgeRegistryMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/fast_registry_validation/ForgeRegistryMixin.java @@ -1,6 +1,5 @@ package org.embeddedt.modernfix.forge.mixin.perf.fast_registry_validation; -import net.minecraftforge.fml.util.ObfuscationReflectionHelper; import net.minecraftforge.registries.ForgeRegistry; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Marker; @@ -10,27 +9,10 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import java.lang.reflect.Method; import java.util.*; @Mixin(value = ForgeRegistry.class, remap = false) public class ForgeRegistryMixin { - private static Method bitSetTrimMethod = null; - private static boolean bitSetTrimMethodRetrieved = false; - - /** - * Cache the result of findMethod instead of running it multiple times. - * Null checks are not required as the surrounding code handles it already. - */ - @Redirect(method = "validateContent", at = @At(value = "INVOKE", target = "Lnet/minecraftforge/fml/util/ObfuscationReflectionHelper;findMethod(Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;"), require = 0) - private Method skipMultipleRemap(Class clz, String methodName, Class[] params) { - if(!bitSetTrimMethodRetrieved) { - bitSetTrimMethodRetrieved = true; - bitSetTrimMethod = ObfuscationReflectionHelper.findMethod(clz, methodName, params); - } - return bitSetTrimMethod; - } - private int expectedNextBit = -1; /** diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/rs/IFluidExternalStorageCache.java b/forge/src/main/java/org/embeddedt/modernfix/forge/rs/IFluidExternalStorageCache.java deleted file mode 100644 index 4b7f192a..00000000 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/rs/IFluidExternalStorageCache.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.embeddedt.modernfix.forge.rs; - -import net.minecraftforge.fluids.capability.IFluidHandler; - -public interface IFluidExternalStorageCache { - boolean initCache(IFluidHandler handler); -} diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/rs/IItemExternalStorageCache.java b/forge/src/main/java/org/embeddedt/modernfix/forge/rs/IItemExternalStorageCache.java deleted file mode 100644 index 4d5555d5..00000000 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/rs/IItemExternalStorageCache.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.embeddedt.modernfix.forge.rs; - -import net.minecraftforge.items.IItemHandler; - -public interface IItemExternalStorageCache { - boolean initCache(IItemHandler handler); -} From d64a1c760b7cd66393b8cb962501278624f23444 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Fri, 26 Dec 2025 16:16:15 -0500 Subject: [PATCH 6/6] Fix compile errors --- .../modernfix/forge/init/ModernFixForge.java | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/init/ModernFixForge.java b/forge/src/main/java/org/embeddedt/modernfix/forge/init/ModernFixForge.java index 43c5ac4e..d46a1cd8 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/init/ModernFixForge.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/init/ModernFixForge.java @@ -7,7 +7,6 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.OnDatapackSyncEvent; import net.minecraftforge.event.RegisterCommandsEvent; import net.minecraftforge.event.server.ServerStartedEvent; import net.minecraftforge.event.server.ServerStoppedEvent; @@ -22,12 +21,10 @@ import net.minecraftforge.fml.loading.FMLLoader; import net.minecraftforge.network.NetworkConstants; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegisterEvent; -import net.minecraftforge.server.ServerLifecycleHooks; import org.apache.commons.lang3.tuple.Pair; import org.apache.maven.artifact.versioning.DefaultArtifactVersion; import org.embeddedt.modernfix.ModernFix; import org.embeddedt.modernfix.core.ModernFixMixinPlugin; -import org.embeddedt.modernfix.entity.EntityDataIDSyncHandler; import org.embeddedt.modernfix.forge.ModernFixConfig; import org.embeddedt.modernfix.forge.config.ConfigFixer; import org.embeddedt.modernfix.forge.config.NightConfigFixer; @@ -66,15 +63,6 @@ public class ModernFixForge { } } - @SubscribeEvent - public void onDatapackSync(OnDatapackSyncEvent event) { - if(event.getPlayer() != null) { - if(!ServerLifecycleHooks.getCurrentServer().isDedicatedServer() && event.getPlayerList().getPlayerCount() == 0) - return; - EntityDataIDSyncHandler.onDatapackSyncEvent(event.getPlayer()); - } - } - private void registerItems(RegisterEvent event) { if(Boolean.getBoolean("modernfix.largeRegistryTest")) { event.register(ForgeRegistries.Keys.ITEMS, helper -> {