diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 873cb766..af3fe6c9 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -22,5 +22,9 @@ jobs: run: ./gradlew --no-daemon build - uses: actions/upload-artifact@v2 with: - name: Package - path: build/libs \ No newline at end of file + name: Forge + path: forge/build/libs + - uses: actions/upload-artifact@v2 + with: + name: Fabric + path: fabric/build/libs \ No newline at end of file diff --git a/build.gradle b/build.gradle index 5423a9ca..a6fccb25 100644 --- a/build.gradle +++ b/build.gradle @@ -1,92 +1,128 @@ plugins { - id "dev.architectury.loom" version "1.1-SNAPSHOT" + id "architectury-plugin" version "3.4-SNAPSHOT" + id "dev.architectury.loom" version "1.1-SNAPSHOT" apply false id "maven-publish" - id 'com.matthewprenger.cursegradle' version '1.4.0' + id 'com.matthewprenger.cursegradle' version '1.4.0' apply false id 'com.palantir.git-version' version '1.0.0' id 'se.bjurr.gitchangelog.git-changelog-gradle-plugin' version '1.79.0' - id "com.modrinth.minotaur" version "2.+" + id "com.modrinth.minotaur" version "2.+" apply false + id("com.diffplug.spotless") version "6.18.0" apply false } -sourceCompatibility = targetCompatibility = JavaVersion.VERSION_17 - -group = 'org.embeddedt' -version = gitVersion() - -java { - archivesBaseName = 'modernfix-mc' + minecraft_version +architectury { + minecraft = rootProject.minecraft_version } -loom { - // use this if you are using the official mojang mappings - // and want loom to stop warning you about their license - silentMojangMappingsLicense() +ext.archives_base_name = 'modernfix-mc' + minecraft_version - // since loom 0.10, you are **required** to use the - // "forge" block to configure forge-specific features, - // such as the mixinConfigs array or datagen - forge { - // specify the mixin configs used in this mod - // this will be added to the jar manifest as well! - mixinConfigs = [ - "modernfix.mixins.json" +allprojects { + apply plugin: "java" + apply plugin: "architectury-plugin" + apply plugin: "maven-publish" + apply plugin: "com.diffplug.spotless" + + spotless { + java { + removeUnusedImports() + } + } + + group = 'org.embeddedt' + version = gitVersion() + archivesBaseName = rootProject.archives_base_name + '-' + project.name + + sourceCompatibility = targetCompatibility = JavaVersion.VERSION_17 + + repositories { + maven { url 'https://modmaven.dev/' } + maven { + url "https://cursemaven.com" + content { + includeGroup "curse.maven" + } + } + maven { + name = 'ParchmentMC' + url = 'https://maven.parchmentmc.org' + } + maven { + // Shedaniel's maven (Architectury API) + url = "https://maven.architectury.dev" + content { + includeGroup "me.shedaniel" + } + } + + maven { + // saps.dev Maven (KubeJS and Rhino) + url = "https://maven.saps.dev/minecraft" + content { + includeGroup "dev.latvian.mods" + } + } + maven { // CTM + url "https://maven.tterrag.com/" + } + maven { url 'https://maven.blamejared.com' } + repositories { + maven { + name = "Fuzs Mod Resources" + url = "https://raw.githubusercontent.com/Fuzss/modresources/main/maven/" + } + } + } +} + +subprojects { + apply plugin: "dev.architectury.loom" + + loom { + silentMojangMappingsLicense() + } + + dependencies { + minecraft "com.mojang:minecraft:${rootProject.minecraft_version}" + mappings loom.layered() { + officialMojangMappings() + parchment("org.parchmentmc.data:parchment-${minecraft_version}:${parchment_version}@zip") + } + } + + processResources { + def mixinFileList = [] + def mixinDirectory = file("src/main/java/org/embeddedt/modernfix/" + project.name + "/mixin") + fileTree(mixinDirectory).visit { FileVisitDetails details -> + if(details.file.isFile()) { + def fileName = mixinDirectory.relativePath(details.file).toString().replaceFirst(/\.java$/, "").replace('/', '.') + mixinFileList << fileName + } + } + + def mixinClassesStringB = new StringBuilder() + for(int i = 0; i < mixinFileList.size(); i++) { + mixinClassesStringB.append(" \"") + mixinClassesStringB.append(mixinFileList.get(i)) + mixinClassesStringB.append('"') + if(i < (mixinFileList.size() - 1)) + mixinClassesStringB.append(',') + mixinClassesStringB.append('\n') + } + + def replacements = [ + mixin_classes: mixinClassesStringB.toString() ] + + inputs.properties replacements + def filePattern = "modernfix-" + project.name + ".mixins.json" + filesMatching(filePattern) { + expand replacements + } } - mixin.defaultRefmapName = "modernfix.refmap.json" } -repositories { - maven { url 'https://modmaven.dev/' } - maven { - url "https://cursemaven.com" - content { - includeGroup "curse.maven" - } - } - maven { - name = 'ParchmentMC' - url = 'https://maven.parchmentmc.org' - } - maven { - // Shedaniel's maven (Architectury API) - url = "https://maven.architectury.dev" - content { - includeGroup "me.shedaniel" - } - } - - maven { - // saps.dev Maven (KubeJS and Rhino) - url = "https://maven.saps.dev/minecraft" - content { - includeGroup "dev.latvian.mods" - } - } - maven { // CTM - url "https://maven.tterrag.com/" - } - maven { url "https://maven.shedaniel.me" } - maven { url 'https://maven.blamejared.com' } -} - -dependencies { - // to change the versions see the gradle.properties file - minecraft "com.mojang:minecraft:${project.minecraft_version}" - - // choose what mappings you want to use here - // leave this uncommented if you want to use - // mojang's official mappings, or feel free - // to add your own mappings here (how about - // mojmap layered with parchment, for example?) - mappings loom.layered() { - officialMojangMappings() - parchment("org.parchmentmc.data:parchment-${minecraft_version}:${parchment_version}@zip") - } - - // uncomment this if you want to use yarn mappings - // mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" - - // your forge dependency, this is **required** when using Forge Loom in forge mode! - forge "net.minecraftforge:forge:${project.forge_version}" +/* + modCompileOnly("mezz.jei:jei-${minecraft_version}:${jei_version}") + //modRuntimeOnly("mezz.jei:jei-${minecraft_version}:${jei_version}") modCompileOnly("curse.maven:refinedstorage-243076:${refined_storage_version}") @@ -101,7 +137,7 @@ dependencies { modCompileOnly("curse.maven:supermartijncore-454372:4455391") modCompileOnly("appeng:appliedenergistics2-forge:12.9.4") modCompileOnly("vazkii.patchouli:Patchouli:1.19.2-77") -} +*/ tasks.withType(JavaCompile) { // ensure that the encoding is set to UTF-8, no matter what the system default is @@ -110,7 +146,10 @@ tasks.withType(JavaCompile) { // If Javadoc is generated, this must be specified in that task too. options.encoding = "UTF-8" - def targetVersion = 17 + // The Minecraft launcher currently installs Java 8 for users, so your mod probably wants to target Java 8 too + // JDK 9 introduced a new way of specifying this that will make sure no newer classes or methods are used. + // We'll use that if it's available, but otherwise we'll use the older option. + def targetVersion = 8 /* if (JavaVersion.current().isJava9Compatible()) { options.release = targetVersion @@ -118,36 +157,6 @@ tasks.withType(JavaCompile) { */ } -processResources { - def mixinFileList = [] - def mixinDirectory = file("src/main/java/org/embeddedt/modernfix/mixin") - fileTree(mixinDirectory).visit { FileVisitDetails details -> - if(details.file.isFile()) { - def fileName = mixinDirectory.relativePath(details.file).toString().replaceFirst(/\.java$/, "").replace('/', '.') - mixinFileList << fileName - } - } - - def mixinClassesStringB = new StringBuilder() - for(int i = 0; i < mixinFileList.size(); i++) { - mixinClassesStringB.append(" \"") - mixinClassesStringB.append(mixinFileList.get(i)) - mixinClassesStringB.append('"') - if(i < (mixinFileList.size() - 1)) - mixinClassesStringB.append(',') - mixinClassesStringB.append('\n') - } - - def replacements = [ - mixin_classes: mixinClassesStringB.toString() - ] - - inputs.properties replacements - filesMatching("modernfix.mixins.json") { - expand replacements - } -} - task generateChangelog(type: se.bjurr.gitchangelog.plugin.gradle.GitChangelogTask) { def details = versionDetails(); if(details.commitDistance > 0) { @@ -164,46 +173,7 @@ task generateChangelog(type: se.bjurr.gitchangelog.plugin.gradle.GitChangelogTas toCommit = "HEAD"; } -java { - // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task - // if it is present. - // If you remove this line, sources will not be generated. - // withSourcesJar() -} - -// Example for how to get properties into the manifest for reading at runtime. -jar { - manifest { - attributes([ - "Specification-Title" : "modernfix", - "Operative-Class" : "org.embeddedt.modernfix.agent.Agent", - //"Specification-Vendor": "modernfix authors", - "Specification-Version" : "1", // We are version 1 of ourselves - "Implementation-Title" : project.name, - "Implementation-Version" : project.jar.archiveVersion, - //"Implementation-Vendor": "modernfix authors", - "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") - ]) - } -} - -// configure the maven publication -publishing { - publications { - mavenJava(MavenPublication) { - from components.java - } - } - - // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. - repositories { - // Add repositories to publish to here. - // Notice: This block does NOT have the same function as the block in the top level. - // The repositories here will be used for publishing your artifact, not for - // retrieving dependencies. - } -} - +/* curseforge { if (System.getenv("CURSEFORGE_TOKEN") != null) { apiKey = System.getenv("CURSEFORGE_TOKEN") @@ -247,3 +217,4 @@ tasks.register('publishToModSites') { publishToModSites.dependsOn(tasks.modrinth) publishToModSites.dependsOn(tasks.curseforge) } + */ \ No newline at end of file diff --git a/common/build.gradle b/common/build.gradle new file mode 100644 index 00000000..9ed3b9ae --- /dev/null +++ b/common/build.gradle @@ -0,0 +1,42 @@ +architectury { + common(rootProject.enabled_platforms.split(",")) +} + +loom { + accessWidenerPath = file("src/main/resources/modernfix.accesswidener") +} + +dependencies { + // We depend on fabric loader here to use the fabric @Environment annotations and get the mixin dependencies + // Do NOT use other classes from fabric loader + modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" + + modApi("dev.latvian.mods:kubejs:${kubejs_version}") { + transitive = false + } + modApi("dev.latvian.mods:rhino:${rhino_version}") { + transitive = false + } + modApi("me.shedaniel:RoughlyEnoughItems-api:${rei_version}") { + transitive = false + } + modCompileOnly("me.shedaniel:RoughlyEnoughItems-fabric:${rei_version}") { + transitive = false + } + // Remove the next line if you don't want to depend on the API + // modApi "me.shedaniel:architectury:${rootProject.architectury_version}" +} + +publishing { + publications { + mavenCommon(MavenPublication) { + artifactId = rootProject.archives_base_name + from components.java + } + } + + // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. + repositories { + // Add repositories to publish to here. + } +} diff --git a/src/main/java/org/embeddedt/modernfix/FileWalker.java b/common/src/main/java/org/embeddedt/modernfix/FileWalker.java similarity index 100% rename from src/main/java/org/embeddedt/modernfix/FileWalker.java rename to common/src/main/java/org/embeddedt/modernfix/FileWalker.java diff --git a/common/src/main/java/org/embeddedt/modernfix/ModernFix.java b/common/src/main/java/org/embeddedt/modernfix/ModernFix.java new file mode 100644 index 00000000..6f9904a7 --- /dev/null +++ b/common/src/main/java/org/embeddedt/modernfix/ModernFix.java @@ -0,0 +1,73 @@ +package org.embeddedt.modernfix; + +import net.minecraft.Util; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ChunkMap; +import net.minecraft.server.level.ServerLevel; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.embeddedt.modernfix.core.ModernFixMixinPlugin; +import org.embeddedt.modernfix.platform.ModernFixPlatformHooks; +import org.embeddedt.modernfix.util.ClassInfoManager; + +import java.lang.management.ManagementFactory; +import java.util.concurrent.*; + +// The value here should match an entry in the META-INF/mods.toml file +public class ModernFix { + + // Directly reference a log4j logger. + public static final Logger LOGGER = LogManager.getLogger("ModernFix"); + + public static final String MODID = "modernfix"; + + public static ModernFix INSTANCE; + + // Used to skip computing the blockstate caches twice + public static boolean runningFirstInjection = false; + + private static ExecutorService resourceReloadService = null; + + static { + if(ModernFixMixinPlugin.instance.isOptionEnabled("perf.dedicated_reload_executor.ReloadExecutor")) { + resourceReloadService = Util.makeExecutor("ResourceReload"); + } else { + resourceReloadService = Util.backgroundExecutor(); + } + } + + public static ExecutorService resourceReloadExecutor() { + return resourceReloadService; + } + + + public ModernFix() { + INSTANCE = this; + } + + public void onServerStarted() { + if(ModernFixPlatformHooks.isDedicatedServer()) { + float gameStartTime = ManagementFactory.getRuntimeMXBean().getUptime() / 1000f; + ModernFix.LOGGER.warn("Dedicated server took " + gameStartTime + " seconds to load"); + } + ClassInfoManager.clear(); + } + + public void onLoadComplete() { + ClassInfoManager.clear(); + } + + public void onServerDead(MinecraftServer server) { + /* Clear as much data from the integrated server as possible, in case a mod holds on to it */ + try { + for(ServerLevel level : server.getAllLevels()) { + ChunkMap chunkMap = level.getChunkSource().chunkMap; + chunkMap.updatingChunkMap.clear(); + chunkMap.visibleChunkMap.clear(); + chunkMap.pendingUnloads.clear(); + } + } catch(RuntimeException e) { + ModernFix.LOGGER.error("Couldn't clear chunk data", e); + } + } +} diff --git a/common/src/main/java/org/embeddedt/modernfix/ModernFixClient.java b/common/src/main/java/org/embeddedt/modernfix/ModernFixClient.java new file mode 100644 index 00000000..93020fa2 --- /dev/null +++ b/common/src/main/java/org/embeddedt/modernfix/ModernFixClient.java @@ -0,0 +1,180 @@ +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.client.gui.screens.ConnectScreen; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.TitleScreen; +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.core.ModernFixMixinPlugin; +import org.embeddedt.modernfix.packet.EntityIDSyncPacket; +import org.embeddedt.modernfix.platform.ModernFixPlatformHooks; +import org.embeddedt.modernfix.world.IntegratedWatchdog; + +import java.lang.management.ManagementFactory; +import java.lang.reflect.Field; +import java.util.*; + +public class ModernFixClient { + public static long worldLoadStartTime; + private static int numRenderTicks; + + public static float gameStartTimeSeconds = -1; + + private static boolean recipesUpdated, tagsUpdated = false; + + public String brandingString = null; + + public ModernFixClient() { + // clear reserve as it's not needed + MemoryReserve.release(); + if(ModernFixMixinPlugin.instance.isOptionEnabled("feature.branding.F3Screen")) { + brandingString = "ModernFix " + ModernFixPlatformHooks.getVersionString(); + } + } + + public void resetWorldLoadStateMachine() { + numRenderTicks = 0; + worldLoadStartTime = -1; + recipesUpdated = false; + tagsUpdated = false; + } + + public void onScreenOpening(Screen openingScreen) { + if(openingScreen instanceof ConnectScreen) { + worldLoadStartTime = System.nanoTime(); + } else if (openingScreen instanceof TitleScreen && gameStartTimeSeconds < 0) { + gameStartTimeSeconds = ManagementFactory.getRuntimeMXBean().getUptime() / 1000f; + ModernFix.LOGGER.warn("Game took " + gameStartTimeSeconds + " seconds to start"); + } + } + + public void onRecipesUpdated() { + recipesUpdated = true; + } + + public void onTagsUpdated() { + tagsUpdated = true; + } + + public void onRenderTickEnd() { + if(recipesUpdated + && tagsUpdated + && worldLoadStartTime != -1 + && Minecraft.getInstance().player != null + && numRenderTicks++ >= 10) { + float timeSpentLoading = ((float)(System.nanoTime() - worldLoadStartTime) / 1000000000f); + ModernFix.LOGGER.warn("Time from main menu to in-game was " + timeSpentLoading + " seconds"); + ModernFix.LOGGER.warn("Total time to load game and open world was " + (timeSpentLoading + gameStartTimeSeconds) + " seconds"); + resetWorldLoadStateMachine(); + } + } + + /** + * 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) { + IntegratedWatchdog watchdog = new IntegratedWatchdog(server); + watchdog.start(); + } +} diff --git a/src/main/java/org/embeddedt/modernfix/annotation/ClientOnlyMixin.java b/common/src/main/java/org/embeddedt/modernfix/annotation/ClientOnlyMixin.java similarity index 100% rename from src/main/java/org/embeddedt/modernfix/annotation/ClientOnlyMixin.java rename to common/src/main/java/org/embeddedt/modernfix/annotation/ClientOnlyMixin.java diff --git a/src/main/java/org/embeddedt/modernfix/annotation/RequiresMod.java b/common/src/main/java/org/embeddedt/modernfix/annotation/RequiresMod.java similarity index 100% rename from src/main/java/org/embeddedt/modernfix/annotation/RequiresMod.java rename to common/src/main/java/org/embeddedt/modernfix/annotation/RequiresMod.java diff --git a/common/src/main/java/org/embeddedt/modernfix/blockstate/BlockStateCacheHandler.java b/common/src/main/java/org/embeddedt/modernfix/blockstate/BlockStateCacheHandler.java new file mode 100644 index 00000000..c2be9256 --- /dev/null +++ b/common/src/main/java/org/embeddedt/modernfix/blockstate/BlockStateCacheHandler.java @@ -0,0 +1,16 @@ +package org.embeddedt.modernfix.blockstate; + +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import org.embeddedt.modernfix.duck.IBlockState; + +public class BlockStateCacheHandler { + public static void rebuildParallel(boolean force) { + synchronized (BlockBehaviour.BlockStateBase.class) { + for (BlockState blockState : Block.BLOCK_STATE_REGISTRY) { + ((IBlockState)blockState).clearCache(); + } + } + } +} diff --git a/src/main/java/org/embeddedt/modernfix/blockstate/FakeStateMap.java b/common/src/main/java/org/embeddedt/modernfix/blockstate/FakeStateMap.java similarity index 99% rename from src/main/java/org/embeddedt/modernfix/blockstate/FakeStateMap.java rename to common/src/main/java/org/embeddedt/modernfix/blockstate/FakeStateMap.java index 42194e5d..ff7cc745 100644 --- a/src/main/java/org/embeddedt/modernfix/blockstate/FakeStateMap.java +++ b/common/src/main/java/org/embeddedt/modernfix/blockstate/FakeStateMap.java @@ -1,6 +1,5 @@ package org.embeddedt.modernfix.blockstate; -import com.google.common.collect.ImmutableSet; import net.minecraft.world.level.block.state.properties.Property; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/bugfix/chunk_deadlock/ServerChunkCacheMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/chunk_deadlock/ServerChunkCacheMixin.java similarity index 98% rename from src/main/java/org/embeddedt/modernfix/mixin/bugfix/chunk_deadlock/ServerChunkCacheMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/chunk_deadlock/ServerChunkCacheMixin.java index 93806ffc..71dba962 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/bugfix/chunk_deadlock/ServerChunkCacheMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/chunk_deadlock/ServerChunkCacheMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.bugfix.chunk_deadlock; +package org.embeddedt.modernfix.common.mixin.bugfix.chunk_deadlock; import com.mojang.datafixers.util.Either; import net.minecraft.core.Holder; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/bugfix/concurrency/MinecraftMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/concurrency/MinecraftMixin.java similarity index 95% rename from src/main/java/org/embeddedt/modernfix/mixin/bugfix/concurrency/MinecraftMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/concurrency/MinecraftMixin.java index 65e5c56c..875fcbd7 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/bugfix/concurrency/MinecraftMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/concurrency/MinecraftMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.bugfix.concurrency; +package org.embeddedt.modernfix.common.mixin.bugfix.concurrency; import net.minecraft.client.Minecraft; import net.minecraft.util.thread.BlockableEventLoop; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/bugfix/edge_chunk_not_saved/ChunkManagerMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/edge_chunk_not_saved/ChunkManagerMixin.java similarity index 96% rename from src/main/java/org/embeddedt/modernfix/mixin/bugfix/edge_chunk_not_saved/ChunkManagerMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/edge_chunk_not_saved/ChunkManagerMixin.java index 8c8990e7..1b635a8f 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/bugfix/edge_chunk_not_saved/ChunkManagerMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/edge_chunk_not_saved/ChunkManagerMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.bugfix.edge_chunk_not_saved; +package org.embeddedt.modernfix.common.mixin.bugfix.edge_chunk_not_saved; import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.chunk.ProtoChunk; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/bugfix/paper_chunk_patches/ChunkHolderMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/paper_chunk_patches/ChunkHolderMixin.java similarity index 97% rename from src/main/java/org/embeddedt/modernfix/mixin/bugfix/paper_chunk_patches/ChunkHolderMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/paper_chunk_patches/ChunkHolderMixin.java index 0a51f6d7..c255628f 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/bugfix/paper_chunk_patches/ChunkHolderMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/paper_chunk_patches/ChunkHolderMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.bugfix.paper_chunk_patches; +package org.embeddedt.modernfix.common.mixin.bugfix.paper_chunk_patches; import com.mojang.datafixers.util.Either; import net.minecraft.server.level.ChunkHolder; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/bugfix/paper_chunk_patches/ChunkMapMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/paper_chunk_patches/ChunkMapMixin.java similarity index 95% rename from src/main/java/org/embeddedt/modernfix/mixin/bugfix/paper_chunk_patches/ChunkMapMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/paper_chunk_patches/ChunkMapMixin.java index e147a76e..de2cc7ca 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/bugfix/paper_chunk_patches/ChunkMapMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/paper_chunk_patches/ChunkMapMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.bugfix.paper_chunk_patches; +package org.embeddedt.modernfix.common.mixin.bugfix.paper_chunk_patches; import com.mojang.datafixers.util.Either; import net.minecraft.server.MinecraftServer; @@ -9,8 +9,8 @@ import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.ChunkStatus; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; -import net.minecraftforge.server.ServerLifecycleHooks; import org.embeddedt.modernfix.duck.IPaperChunkHolder; +import org.embeddedt.modernfix.platform.ModernFixPlatformHooks; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -45,10 +45,10 @@ public abstract class ChunkMapMixin { @Shadow @Final private StructureTemplateManager structureTemplateManager; private Executor mainInvokingExecutor; - @Inject(method = "", at = @At("RETURN"), cancellable = true) + @Inject(method = "", at = @At("RETURN")) private void setup(CallbackInfo ci) { this.mainInvokingExecutor = (runnable) -> { - if(ServerLifecycleHooks.getCurrentServer().isSameThread()) + if(ModernFixPlatformHooks.getCurrentServer().isSameThread()) runnable.run(); else this.mainThreadExecutor.execute(runnable); diff --git a/src/main/java/org/embeddedt/modernfix/mixin/bugfix/paper_chunk_patches/SortedArraySetMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/paper_chunk_patches/SortedArraySetMixin.java similarity index 95% rename from src/main/java/org/embeddedt/modernfix/mixin/bugfix/paper_chunk_patches/SortedArraySetMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/paper_chunk_patches/SortedArraySetMixin.java index ea9e9167..0587964f 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/bugfix/paper_chunk_patches/SortedArraySetMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/paper_chunk_patches/SortedArraySetMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.bugfix.paper_chunk_patches; +package org.embeddedt.modernfix.common.mixin.bugfix.paper_chunk_patches; import net.minecraft.util.SortedArraySet; import org.spongepowered.asm.mixin.Mixin; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/core/SynchedEntityDataMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/core/SynchedEntityDataMixin.java similarity index 94% rename from src/main/java/org/embeddedt/modernfix/mixin/core/SynchedEntityDataMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/core/SynchedEntityDataMixin.java index 9b7e505a..9737a2f2 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/core/SynchedEntityDataMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/core/SynchedEntityDataMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.core; +package org.embeddedt.modernfix.common.mixin.core; import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.world.entity.Entity; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/devenv/MinecraftMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/devenv/MinecraftMixin.java similarity index 92% rename from src/main/java/org/embeddedt/modernfix/mixin/devenv/MinecraftMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/devenv/MinecraftMixin.java index 5b1fb097..b5e9cfec 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/devenv/MinecraftMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/devenv/MinecraftMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.devenv; +package org.embeddedt.modernfix.common.mixin.devenv; import com.mojang.authlib.minecraft.UserApiService; import com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/devenv/NarratorMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/devenv/NarratorMixin.java similarity index 92% rename from src/main/java/org/embeddedt/modernfix/mixin/devenv/NarratorMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/devenv/NarratorMixin.java index 43f491d1..c9a7a74a 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/devenv/NarratorMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/devenv/NarratorMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.devenv; +package org.embeddedt.modernfix.common.mixin.devenv; import com.mojang.text2speech.Narrator; import net.minecraft.client.GameNarrator; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/feature/direct_stack_trace/CrashReportMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/feature/direct_stack_trace/CrashReportMixin.java similarity index 92% rename from src/main/java/org/embeddedt/modernfix/mixin/feature/direct_stack_trace/CrashReportMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/feature/direct_stack_trace/CrashReportMixin.java index 2457a5b8..2841921c 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/feature/direct_stack_trace/CrashReportMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/feature/direct_stack_trace/CrashReportMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.feature.direct_stack_trace; +package org.embeddedt.modernfix.common.mixin.feature.direct_stack_trace; import net.minecraft.CrashReport; import net.minecraft.CrashReportCategory; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/feature/measure_time/BootstrapMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/feature/measure_time/BootstrapMixin.java similarity index 94% rename from src/main/java/org/embeddedt/modernfix/mixin/feature/measure_time/BootstrapMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/feature/measure_time/BootstrapMixin.java index 0e399bbc..861ce9f6 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/feature/measure_time/BootstrapMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/feature/measure_time/BootstrapMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.feature.measure_time; +package org.embeddedt.modernfix.common.mixin.feature.measure_time; import com.google.common.base.Stopwatch; import net.minecraft.server.Bootstrap; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/feature/measure_time/MinecraftMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/feature/measure_time/MinecraftMixin.java similarity index 83% rename from src/main/java/org/embeddedt/modernfix/mixin/feature/measure_time/MinecraftMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/feature/measure_time/MinecraftMixin.java index 695b7a4b..763a539b 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/feature/measure_time/MinecraftMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/feature/measure_time/MinecraftMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.feature.measure_time; +package org.embeddedt.modernfix.common.mixin.feature.measure_time; import com.mojang.datafixers.util.Function4; import net.minecraft.client.Minecraft; @@ -9,12 +9,10 @@ import net.minecraft.core.RegistryAccess; import net.minecraft.world.level.storage.WorldData; import net.minecraft.world.level.storage.LevelStorageSource; import org.embeddedt.modernfix.ModernFix; -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; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import java.util.function.Function; @@ -36,8 +34,4 @@ public class MinecraftMixin { ModernFix.LOGGER.warn("Datapack reload took " + timeSpentReloading + " seconds."); } */ - @Inject(method = "m_231380_", at = @At("HEAD"), remap = false) - private void recordWorldLoadStart(CallbackInfo ci) { - ModernFixClient.worldLoadStartTime = System.nanoTime(); - } } diff --git a/src/main/java/org/embeddedt/modernfix/mixin/feature/measure_time/ProfiledReloadInstanceMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/feature/measure_time/ProfiledReloadInstanceMixin.java similarity index 89% rename from src/main/java/org/embeddedt/modernfix/mixin/feature/measure_time/ProfiledReloadInstanceMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/feature/measure_time/ProfiledReloadInstanceMixin.java index 9d93fc83..349c082e 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/feature/measure_time/ProfiledReloadInstanceMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/feature/measure_time/ProfiledReloadInstanceMixin.java @@ -1,11 +1,10 @@ -package org.embeddedt.modernfix.mixin.feature.measure_time; +package org.embeddedt.modernfix.common.mixin.feature.measure_time; import net.minecraft.server.packs.resources.PreparableReloadListener; import net.minecraft.server.packs.resources.ProfiledReloadInstance; import org.embeddedt.modernfix.util.NamedPreparableResourceListener; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.ModifyArg; import org.spongepowered.asm.mixin.injection.ModifyVariable; import java.util.ArrayList; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/feature/measure_time/SimpleReloadableResourceManagerMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/feature/measure_time/SimpleReloadableResourceManagerMixin.java similarity index 73% rename from src/main/java/org/embeddedt/modernfix/mixin/feature/measure_time/SimpleReloadableResourceManagerMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/feature/measure_time/SimpleReloadableResourceManagerMixin.java index 3b17d299..a8a8d5f7 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/feature/measure_time/SimpleReloadableResourceManagerMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/feature/measure_time/SimpleReloadableResourceManagerMixin.java @@ -1,22 +1,20 @@ -package org.embeddedt.modernfix.mixin.feature.measure_time; +package org.embeddedt.modernfix.common.mixin.feature.measure_time; import net.minecraft.server.packs.resources.ReloadableResourceManager; -import org.embeddedt.modernfix.core.config.ModernFixConfig; -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.ModifyArg; @Mixin(ReloadableResourceManager.class) public class SimpleReloadableResourceManagerMixin { - + // TODO maybe expose as a mixin config + private static final boolean ENABLE_DEBUG_RELOADER = Boolean.getBoolean("modernfix.debugReloader"); /** * @author embeddedt * @reason add ability to use this feature in modpacks */ @ModifyArg(method = "createReload", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/packs/resources/SimpleReloadInstance;create(Lnet/minecraft/server/packs/resources/ResourceManager;Ljava/util/List;Ljava/util/concurrent/Executor;Ljava/util/concurrent/Executor;Ljava/util/concurrent/CompletableFuture;Z)Lnet/minecraft/server/packs/resources/ReloadInstance;"), index = 5) private boolean enableDebugReloader(boolean bl) { - return bl || (ModernFixConfig.isLoaded() && ModernFixConfig.ENABLE_DEBUG_RELOADER.get()); + return bl || ENABLE_DEBUG_RELOADER; } } diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/cache_blockstate_cache_arrays/AbstractBlockStateCacheMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/cache_blockstate_cache_arrays/AbstractBlockStateCacheMixin.java similarity index 93% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/cache_blockstate_cache_arrays/AbstractBlockStateCacheMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/cache_blockstate_cache_arrays/AbstractBlockStateCacheMixin.java index 5ddea843..c82fa598 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/cache_blockstate_cache_arrays/AbstractBlockStateCacheMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/cache_blockstate_cache_arrays/AbstractBlockStateCacheMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.cache_blockstate_cache_arrays; +package org.embeddedt.modernfix.common.mixin.perf.cache_blockstate_cache_arrays; import net.minecraft.world.level.block.SupportType; import net.minecraft.core.Direction; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/cache_model_materials/BlockModelMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/cache_model_materials/BlockModelMixin.java similarity index 98% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/cache_model_materials/BlockModelMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/cache_model_materials/BlockModelMixin.java index 4796d40b..e9261426 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/cache_model_materials/BlockModelMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/cache_model_materials/BlockModelMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.cache_model_materials; +package org.embeddedt.modernfix.common.mixin.perf.cache_model_materials; import com.mojang.datafixers.util.Either; import net.minecraft.client.renderer.block.model.BlockModel; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/cache_model_materials/MultipartMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/cache_model_materials/MultipartMixin.java similarity index 93% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/cache_model_materials/MultipartMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/cache_model_materials/MultipartMixin.java index 51655b03..4d620db9 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/cache_model_materials/MultipartMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/cache_model_materials/MultipartMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.cache_model_materials; +package org.embeddedt.modernfix.common.mixin.perf.cache_model_materials; import net.minecraft.client.renderer.block.model.multipart.MultiPart; import net.minecraft.resources.ResourceLocation; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/cache_model_materials/VanillaModelMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/cache_model_materials/VanillaModelMixin.java similarity index 96% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/cache_model_materials/VanillaModelMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/cache_model_materials/VanillaModelMixin.java index 04594dd4..96c455fe 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/cache_model_materials/VanillaModelMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/cache_model_materials/VanillaModelMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.cache_model_materials; +package org.embeddedt.modernfix.common.mixin.perf.cache_model_materials; import com.mojang.datafixers.util.Pair; import net.minecraft.client.renderer.block.model.BlockModel; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/cache_strongholds/ChunkGeneratorMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/cache_strongholds/ChunkGeneratorMixin.java similarity index 95% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/cache_strongholds/ChunkGeneratorMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/cache_strongholds/ChunkGeneratorMixin.java index d8f9ab86..5ca80e83 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/cache_strongholds/ChunkGeneratorMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/cache_strongholds/ChunkGeneratorMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.cache_strongholds; +package org.embeddedt.modernfix.common.mixin.perf.cache_strongholds; import net.minecraft.Util; import net.minecraft.core.Holder; @@ -9,10 +9,10 @@ import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.RandomState; import net.minecraft.world.level.levelgen.structure.StructureSet; import net.minecraft.world.level.levelgen.structure.placement.ConcentricRingsStructurePlacement; -import net.minecraftforge.server.ServerLifecycleHooks; import org.embeddedt.modernfix.ModernFix; import org.embeddedt.modernfix.duck.IChunkGenerator; import org.embeddedt.modernfix.duck.IServerLevel; +import org.embeddedt.modernfix.platform.ModernFixPlatformHooks; import org.embeddedt.modernfix.world.StrongholdLocationCache; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/cache_strongholds/ServerLevelMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/cache_strongholds/ServerLevelMixin.java similarity index 98% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/cache_strongholds/ServerLevelMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/cache_strongholds/ServerLevelMixin.java index 3611cb62..ddc8a91b 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/cache_strongholds/ServerLevelMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/cache_strongholds/ServerLevelMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.cache_strongholds; +package org.embeddedt.modernfix.common.mixin.perf.cache_strongholds; import net.minecraft.core.Holder; import net.minecraft.resources.ResourceKey; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/cache_upgraded_structures/StructureManagerMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/cache_upgraded_structures/StructureManagerMixin.java similarity index 95% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/cache_upgraded_structures/StructureManagerMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/cache_upgraded_structures/StructureManagerMixin.java index 73a2268e..5b7aefb6 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/cache_upgraded_structures/StructureManagerMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/cache_upgraded_structures/StructureManagerMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.cache_upgraded_structures; +package org.embeddedt.modernfix.common.mixin.perf.cache_upgraded_structures; import com.mojang.datafixers.DataFixer; import net.minecraft.resources.ResourceLocation; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/compress_blockstate/BlockBehaviourMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/compress_blockstate/BlockBehaviourMixin.java similarity index 85% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/compress_blockstate/BlockBehaviourMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/compress_blockstate/BlockBehaviourMixin.java index 2ee283ed..2f307825 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/compress_blockstate/BlockBehaviourMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/compress_blockstate/BlockBehaviourMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.compress_blockstate; +package org.embeddedt.modernfix.common.mixin.perf.compress_blockstate; import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockState; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/compress_blockstate/BlockStateBaseMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/compress_blockstate/BlockStateBaseMixin.java similarity index 98% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/compress_blockstate/BlockStateBaseMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/compress_blockstate/BlockStateBaseMixin.java index c3eeabd6..630c0234 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/compress_blockstate/BlockStateBaseMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/compress_blockstate/BlockStateBaseMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.compress_blockstate; +package org.embeddedt.modernfix.common.mixin.perf.compress_blockstate; import com.google.common.collect.ImmutableMap; import com.mojang.serialization.MapCodec; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/dedicated_reload_executor/CreateWorldScreenMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dedicated_reload_executor/CreateWorldScreenMixin.java similarity index 94% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/dedicated_reload_executor/CreateWorldScreenMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dedicated_reload_executor/CreateWorldScreenMixin.java index a3229e70..d22efa49 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/dedicated_reload_executor/CreateWorldScreenMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dedicated_reload_executor/CreateWorldScreenMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.dedicated_reload_executor; +package org.embeddedt.modernfix.common.mixin.perf.dedicated_reload_executor; import net.minecraft.client.gui.screens.worldselection.CreateWorldScreen; import org.embeddedt.modernfix.ModernFix; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/dedicated_reload_executor/MinecraftMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dedicated_reload_executor/MinecraftMixin.java similarity index 91% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/dedicated_reload_executor/MinecraftMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dedicated_reload_executor/MinecraftMixin.java index 2fb870cc..6e071724 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/dedicated_reload_executor/MinecraftMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dedicated_reload_executor/MinecraftMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.dedicated_reload_executor; +package org.embeddedt.modernfix.common.mixin.perf.dedicated_reload_executor; import net.minecraft.client.Minecraft; import org.embeddedt.modernfix.ModernFix; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/dedicated_reload_executor/MinecraftServerMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dedicated_reload_executor/MinecraftServerMixin.java similarity index 91% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/dedicated_reload_executor/MinecraftServerMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dedicated_reload_executor/MinecraftServerMixin.java index 0bea8cf9..7d77a1ad 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/dedicated_reload_executor/MinecraftServerMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dedicated_reload_executor/MinecraftServerMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.dedicated_reload_executor; +package org.embeddedt.modernfix.common.mixin.perf.dedicated_reload_executor; import net.minecraft.server.MinecraftServer; import org.embeddedt.modernfix.ModernFix; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/dedicated_reload_executor/WorldOpenFlowsMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dedicated_reload_executor/WorldOpenFlowsMixin.java similarity index 92% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/dedicated_reload_executor/WorldOpenFlowsMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dedicated_reload_executor/WorldOpenFlowsMixin.java index 14c684d4..a1139d33 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/dedicated_reload_executor/WorldOpenFlowsMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dedicated_reload_executor/WorldOpenFlowsMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.dedicated_reload_executor; +package org.embeddedt.modernfix.common.mixin.perf.dedicated_reload_executor; import net.minecraft.client.gui.screens.worldselection.WorldOpenFlows; import org.embeddedt.modernfix.ModernFix; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/deduplicate_location/MixinResourceLocation.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/deduplicate_location/MixinResourceLocation.java similarity index 92% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/deduplicate_location/MixinResourceLocation.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/deduplicate_location/MixinResourceLocation.java index aff6436e..eb2c8cba 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/deduplicate_location/MixinResourceLocation.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/deduplicate_location/MixinResourceLocation.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.deduplicate_location; +package org.embeddedt.modernfix.common.mixin.perf.deduplicate_location; import net.minecraft.resources.ResourceLocation; import org.embeddedt.modernfix.dedup.IdentifierCaches; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_dfu/DataFixersMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_dfu/DataFixersMixin.java similarity index 94% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_dfu/DataFixersMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_dfu/DataFixersMixin.java index f8e48cfa..71aea5e0 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_dfu/DataFixersMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_dfu/DataFixersMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.dynamic_dfu; +package org.embeddedt.modernfix.common.mixin.perf.dynamic_dfu; import com.mojang.datafixers.DataFixer; import net.minecraft.util.datafix.DataFixers; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/BlockElementFaceDeserializerMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/BlockElementFaceDeserializerMixin.java similarity index 94% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/BlockElementFaceDeserializerMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/BlockElementFaceDeserializerMixin.java index 2d2c8214..2cd4a853 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/BlockElementFaceDeserializerMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/BlockElementFaceDeserializerMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.dynamic_resources; +package org.embeddedt.modernfix.common.mixin.perf.dynamic_resources; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonElement; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/BlockModelShaperMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/BlockModelShaperMixin.java similarity index 60% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/BlockModelShaperMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/BlockModelShaperMixin.java index 7a4efebf..6e4f35ba 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/BlockModelShaperMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/BlockModelShaperMixin.java @@ -1,31 +1,16 @@ -package org.embeddedt.modernfix.mixin.perf.dynamic_resources; +package org.embeddedt.modernfix.common.mixin.perf.dynamic_resources; -import com.mojang.datafixers.util.Pair; -import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import net.minecraft.Util; import net.minecraft.client.renderer.block.BlockModelShaper; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.client.resources.model.ModelManager; -import net.minecraft.client.resources.model.ModelResourceLocation; -import net.minecraft.core.Registry; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.properties.Property; import org.embeddedt.modernfix.annotation.ClientOnlyMixin; import org.embeddedt.modernfix.dynamicresources.ModelLocationCache; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ConcurrentHashMap; @Mixin(BlockModelShaper.class) @ClientOnlyMixin diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/ItemModelShaperMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/ItemModelShaperMixin.java new file mode 100644 index 00000000..7472760d --- /dev/null +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/ItemModelShaperMixin.java @@ -0,0 +1,70 @@ +package org.embeddedt.modernfix.common.mixin.perf.dynamic_resources; + +import net.minecraft.client.renderer.ItemModelShaper; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.client.resources.model.ModelManager; +import net.minecraft.client.resources.model.ModelResourceLocation; +import net.minecraft.world.item.Item; +import org.embeddedt.modernfix.dynamicresources.ModelLocationCache; +import org.spongepowered.asm.mixin.*; +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.HashMap; +import java.util.Map; + +@Mixin(ItemModelShaper.class) +public abstract class ItemModelShaperMixin { + + @Shadow public abstract ModelManager getModelManager(); + + private Map overrideLocationsVanilla; + + public ItemModelShaperMixin() { + super(); + } + + private static final ModelResourceLocation SENTINEL_VANILLA = new ModelResourceLocation("modernfix", "sentinel"); + + @Inject(method = "", at = @At("RETURN")) + private void replaceLocationMap(CallbackInfo ci) { + overrideLocationsVanilla = new HashMap<>(); + } + + @Unique + private ModelResourceLocation mfix$getLocation(Item item) { + ModelResourceLocation map = overrideLocationsVanilla.getOrDefault(item, SENTINEL_VANILLA); + if(map == SENTINEL_VANILLA) { + /* generate the appropriate location from our cache */ + map = ModelLocationCache.get(item); + } + return map; + } + + /** + * @reason Get the stored location for that item and meta, and get the model + * from that location from the model manager. + **/ + @Overwrite + public BakedModel getItemModel(Item item) { + ModelResourceLocation map = mfix$getLocation(item); + return map == null ? null : getModelManager().getModel(map); + } + + /** + * @reason Don't get all models during init (with dynamic loading, that would + * generate them all). Just store location instead. + **/ + @Overwrite + public void register(Item item, ModelResourceLocation location) { + overrideLocationsVanilla.put(item, location); + } + + /** + * @reason Disable cache rebuilding (with dynamic loading, that would generate + * all models). + **/ + @Overwrite + public void rebuildCache() {} +} diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/ItemRendererMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/ItemRendererMixin.java similarity index 93% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/ItemRendererMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/ItemRendererMixin.java index 27e4e5d5..79b2d1d3 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/ItemRendererMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/ItemRendererMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.dynamic_resources; +package org.embeddedt.modernfix.common.mixin.perf.dynamic_resources; import net.minecraft.client.renderer.ItemModelShaper; import net.minecraft.client.renderer.entity.ItemRenderer; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_structure_manager/StructureManagerMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_structure_manager/StructureManagerMixin.java similarity index 95% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_structure_manager/StructureManagerMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_structure_manager/StructureManagerMixin.java index d18df526..eb840c5b 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_structure_manager/StructureManagerMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_structure_manager/StructureManagerMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.dynamic_structure_manager; +package org.embeddedt.modernfix.common.mixin.perf.dynamic_structure_manager; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/faster_font_loading/LegacyUnicodeBitmapsProviderMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/faster_font_loading/LegacyUnicodeBitmapsProviderMixin.java similarity index 97% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/faster_font_loading/LegacyUnicodeBitmapsProviderMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/faster_font_loading/LegacyUnicodeBitmapsProviderMixin.java index 2da49308..e207de84 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/faster_font_loading/LegacyUnicodeBitmapsProviderMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/faster_font_loading/LegacyUnicodeBitmapsProviderMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.faster_font_loading; +package org.embeddedt.modernfix.common.mixin.perf.faster_font_loading; import com.mojang.blaze3d.platform.NativeImage; import net.minecraft.client.gui.font.providers.LegacyUnicodeBitmapsProvider; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/faster_texture_loading/TextureAtlasMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/faster_texture_loading/TextureAtlasMixin.java similarity index 89% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/faster_texture_loading/TextureAtlasMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/faster_texture_loading/TextureAtlasMixin.java index fe4f5a4f..4b3ae841 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/faster_texture_loading/TextureAtlasMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/faster_texture_loading/TextureAtlasMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.faster_texture_loading; +package org.embeddedt.modernfix.common.mixin.perf.faster_texture_loading; import com.mojang.blaze3d.platform.NativeImage; import com.mojang.datafixers.util.Pair; @@ -9,12 +9,10 @@ import net.minecraft.client.resources.metadata.animation.AnimationMetadataSectio import net.minecraft.resources.ResourceLocation; import net.minecraft.server.packs.resources.Resource; import net.minecraft.server.packs.resources.ResourceManager; -import net.minecraftforge.client.ForgeHooksClient; -import net.minecraftforge.fml.ModLoader; import org.apache.commons.io.IOUtils; -import org.apache.commons.lang3.tuple.Triple; import org.embeddedt.modernfix.ModernFix; import org.embeddedt.modernfix.annotation.ClientOnlyMixin; +import org.embeddedt.modernfix.platform.ModernFixPlatformHooks; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -44,7 +42,7 @@ public abstract class TextureAtlasMixin { */ @Redirect(method = "prepareToStitch", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/texture/TextureAtlas;getBasicSpriteInfos(Lnet/minecraft/server/packs/resources/ResourceManager;Ljava/util/Set;)Ljava/util/Collection;")) private Collection loadImages(TextureAtlas atlas, ResourceManager manager, Set imageLocations) { - usingFasterLoad = ModLoader.isLoadingStateValid(); + usingFasterLoad = ModernFixPlatformHooks.isLoadingNormally(); // bail if Forge is erroring to avoid AT crashes if(!usingFasterLoad) { return getBasicSpriteInfos(manager, imageLocations); @@ -103,10 +101,8 @@ public abstract class TextureAtlasMixin { } else { TextureAtlasSprite sprite = null; try { - sprite = ForgeHooksClient.loadTextureAtlasSprite((TextureAtlas)(Object)this, resourceManager, spriteInfo, pair.getFirst(), storageX, storageY, x, y, mipLevel, pair.getSecond()); - if(sprite == null) - sprite = new TextureAtlasSprite((TextureAtlas)(Object)this, spriteInfo, mipLevel, storageX, storageY, x, y, pair.getSecond()); - } catch(IOException | RuntimeException e) { + sprite = ModernFixPlatformHooks.loadTextureAtlasSprite((TextureAtlas)(Object)this, resourceManager, spriteInfo, pair.getFirst(), storageX, storageY, x, y, mipLevel, pair.getSecond()); + } catch(RuntimeException | IOException e) { ModernFix.LOGGER.error("Error loading texture {}: {}", spriteInfo.name(), e); } cir.setReturnValue(sprite); diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/faster_texture_stitching/StitcherMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/faster_texture_stitching/StitcherMixin.java similarity index 90% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/faster_texture_stitching/StitcherMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/faster_texture_stitching/StitcherMixin.java index a88830e3..88924e9d 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/faster_texture_stitching/StitcherMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/faster_texture_stitching/StitcherMixin.java @@ -1,21 +1,19 @@ -package org.embeddedt.modernfix.mixin.perf.faster_texture_stitching; +package org.embeddedt.modernfix.common.mixin.perf.faster_texture_stitching; import com.mojang.datafixers.util.Pair; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import net.minecraft.client.renderer.texture.Stitcher; -import net.minecraftforge.fml.ModLoader; import org.embeddedt.modernfix.ModernFix; import org.embeddedt.modernfix.annotation.ClientOnlyMixin; +import org.embeddedt.modernfix.platform.ModernFixPlatformHooks; import org.embeddedt.modernfix.textures.StbStitcher; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; 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; -import java.util.Arrays; import java.util.Comparator; import java.util.List; import java.util.Set; @@ -38,7 +36,7 @@ public class StitcherMixin { */ @Inject(method = "stitch", at = @At("HEAD"), cancellable = true) private void stitchFast(CallbackInfo ci) { - if(!ModLoader.isLoadingStateValid()) { + if(!ModernFixPlatformHooks.isLoadingNormally()) { ModernFix.LOGGER.error("Using vanilla stitcher implementation due to invalid loading state"); return; } @@ -59,7 +57,7 @@ public class StitcherMixin { */ @Inject(method = "gatherSprites", at = @At("HEAD"), cancellable = true) private void gatherSpritesFast(Stitcher.SpriteLoader spriteLoader, CallbackInfo ci) { - if(!ModLoader.isLoadingStateValid()) + if(!ModernFixPlatformHooks.isLoadingNormally()) return; ci.cancel(); for(StbStitcher.LoadableSpriteInfo info : loadableSpriteInfos) { diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/model_optimizations/BooleanPropertyMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/model_optimizations/BooleanPropertyMixin.java similarity index 91% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/model_optimizations/BooleanPropertyMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/model_optimizations/BooleanPropertyMixin.java index a29f6ba7..11d6bd3a 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/model_optimizations/BooleanPropertyMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/model_optimizations/BooleanPropertyMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.model_optimizations; +package org.embeddedt.modernfix.common.mixin.perf.model_optimizations; import com.google.common.collect.ImmutableSet; import net.minecraft.world.level.block.state.properties.BooleanProperty; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/model_optimizations/PropertyMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/model_optimizations/PropertyMixin.java similarity index 91% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/model_optimizations/PropertyMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/model_optimizations/PropertyMixin.java index 90c04d57..a443db3a 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/model_optimizations/PropertyMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/model_optimizations/PropertyMixin.java @@ -1,10 +1,9 @@ -package org.embeddedt.modernfix.mixin.perf.model_optimizations; +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.Inject; import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(Property.class) diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/model_optimizations/SelectorMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/model_optimizations/SelectorMixin.java similarity index 95% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/model_optimizations/SelectorMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/model_optimizations/SelectorMixin.java index dc0761aa..e4c818c7 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/model_optimizations/SelectorMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/model_optimizations/SelectorMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.model_optimizations; +package org.embeddedt.modernfix.common.mixin.perf.model_optimizations; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/model_optimizations/TransformationMatrixMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/model_optimizations/TransformationMatrixMixin.java similarity index 92% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/model_optimizations/TransformationMatrixMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/model_optimizations/TransformationMatrixMixin.java index 0c826e02..cbd70d11 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/model_optimizations/TransformationMatrixMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/model_optimizations/TransformationMatrixMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.model_optimizations; +package org.embeddedt.modernfix.common.mixin.perf.model_optimizations; import com.mojang.math.Matrix4f; import com.mojang.math.Transformation; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/nbt_memory_usage/CompoundTagMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/nbt_memory_usage/CompoundTagMixin.java similarity index 87% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/nbt_memory_usage/CompoundTagMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/nbt_memory_usage/CompoundTagMixin.java index 348a8f4b..3e87a8c0 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/nbt_memory_usage/CompoundTagMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/nbt_memory_usage/CompoundTagMixin.java @@ -1,15 +1,12 @@ -package org.embeddedt.modernfix.mixin.perf.nbt_memory_usage; +package org.embeddedt.modernfix.common.mixin.perf.nbt_memory_usage; -import com.google.common.collect.Maps; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import org.embeddedt.modernfix.util.CanonizingStringMap; import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.ModifyArg; import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import java.util.Map; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/reduce_blockstate_cache_rebuilds/BlockStateBaseMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/reduce_blockstate_cache_rebuilds/BlockStateBaseMixin.java similarity index 85% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/reduce_blockstate_cache_rebuilds/BlockStateBaseMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/reduce_blockstate_cache_rebuilds/BlockStateBaseMixin.java index 8d76abbb..76d9fadf 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/reduce_blockstate_cache_rebuilds/BlockStateBaseMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/reduce_blockstate_cache_rebuilds/BlockStateBaseMixin.java @@ -1,18 +1,13 @@ -package org.embeddedt.modernfix.mixin.perf.reduce_blockstate_cache_rebuilds; +package org.embeddedt.modernfix.common.mixin.perf.reduce_blockstate_cache_rebuilds; -import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockBehaviour; -import org.embeddedt.modernfix.ModernFix; import org.embeddedt.modernfix.duck.IBlockState; 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.CallbackInfo; -import java.util.concurrent.atomic.AtomicInteger; @Mixin(BlockBehaviour.BlockStateBase.class) public abstract class BlockStateBaseMixin implements IBlockState { diff --git a/src/main/java/org/embeddedt/modernfix/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 similarity index 87% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/reduce_blockstate_cache_rebuilds/BlocksMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/reduce_blockstate_cache_rebuilds/BlocksMixin.java index 12de7b98..c72bd661 100644 --- a/src/main/java/org/embeddedt/modernfix/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 @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.reduce_blockstate_cache_rebuilds; +package org.embeddedt.modernfix.common.mixin.perf.reduce_blockstate_cache_rebuilds; import net.minecraft.world.level.block.Blocks; import org.embeddedt.modernfix.blockstate.BlockStateCacheHandler; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/remove_biome_temperature_cache/BiomeMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/remove_biome_temperature_cache/BiomeMixin.java similarity index 88% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/remove_biome_temperature_cache/BiomeMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/remove_biome_temperature_cache/BiomeMixin.java index 36a1991d..03b45602 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/remove_biome_temperature_cache/BiomeMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/remove_biome_temperature_cache/BiomeMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.remove_biome_temperature_cache; +package org.embeddedt.modernfix.common.mixin.perf.remove_biome_temperature_cache; import net.minecraft.core.BlockPos; import net.minecraft.world.level.biome.Biome; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/remove_spawn_chunks/MinecraftServerMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/remove_spawn_chunks/MinecraftServerMixin.java similarity index 88% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/remove_spawn_chunks/MinecraftServerMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/remove_spawn_chunks/MinecraftServerMixin.java index ab053461..411766e5 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/remove_spawn_chunks/MinecraftServerMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/remove_spawn_chunks/MinecraftServerMixin.java @@ -1,10 +1,8 @@ -package org.embeddedt.modernfix.mixin.perf.remove_spawn_chunks; +package org.embeddedt.modernfix.common.mixin.perf.remove_spawn_chunks; import net.minecraft.server.MinecraftServer; -import net.minecraft.server.level.DistanceManager; import net.minecraft.server.level.ServerChunkCache; import net.minecraft.server.level.TicketType; -import net.minecraft.util.Unit; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.chunk.ChunkStatus; import org.spongepowered.asm.mixin.Mixin; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/remove_spawn_chunks/ServerChunkCacheAccessor.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/remove_spawn_chunks/ServerChunkCacheAccessor.java similarity index 83% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/remove_spawn_chunks/ServerChunkCacheAccessor.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/remove_spawn_chunks/ServerChunkCacheAccessor.java index 76ed3c26..1ae8cbaa 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/remove_spawn_chunks/ServerChunkCacheAccessor.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/remove_spawn_chunks/ServerChunkCacheAccessor.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.remove_spawn_chunks; +package org.embeddedt.modernfix.common.mixin.perf.remove_spawn_chunks; import net.minecraft.server.level.DistanceManager; import net.minecraft.server.level.ServerChunkCache; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/remove_spawn_chunks/ServerLevelMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/remove_spawn_chunks/ServerLevelMixin.java similarity index 94% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/remove_spawn_chunks/ServerLevelMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/remove_spawn_chunks/ServerLevelMixin.java index 7e61e732..f9b39b5f 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/remove_spawn_chunks/ServerLevelMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/remove_spawn_chunks/ServerLevelMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.remove_spawn_chunks; +package org.embeddedt.modernfix.common.mixin.perf.remove_spawn_chunks; import net.minecraft.server.level.ServerChunkCache; import net.minecraft.server.level.ServerLevel; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/state_definition_construct/StateDefinitionMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/state_definition_construct/StateDefinitionMixin.java similarity index 87% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/state_definition_construct/StateDefinitionMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/state_definition_construct/StateDefinitionMixin.java index dd6157c3..1d32168d 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/state_definition_construct/StateDefinitionMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/state_definition_construct/StateDefinitionMixin.java @@ -1,10 +1,10 @@ -package org.embeddedt.modernfix.mixin.perf.state_definition_construct; +package org.embeddedt.modernfix.common.mixin.perf.state_definition_construct; import com.google.common.collect.ImmutableSortedMap; -import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.StateHolder; import net.minecraft.world.level.block.state.properties.Property; +import org.embeddedt.modernfix.annotation.RequiresMod; import org.embeddedt.modernfix.blockstate.FakeStateMap; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -15,6 +15,7 @@ import org.spongepowered.asm.mixin.injection.ModifyVariable; import java.util.Map; @Mixin(StateDefinition.class) +@RequiresMod("ferritecore") public class StateDefinitionMixin> { @Shadow @Final private ImmutableSortedMap> propertiesByName; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/thread_priorities/IntegratedServerMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/thread_priorities/IntegratedServerMixin.java similarity index 81% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/thread_priorities/IntegratedServerMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/thread_priorities/IntegratedServerMixin.java index e64f6d76..9cfe6466 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/thread_priorities/IntegratedServerMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/thread_priorities/IntegratedServerMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.thread_priorities; +package org.embeddedt.modernfix.common.mixin.perf.thread_priorities; import net.minecraft.client.Minecraft; import net.minecraft.server.Services; @@ -7,9 +7,7 @@ import net.minecraft.server.packs.repository.PackRepository; import net.minecraft.client.server.IntegratedServer; import net.minecraft.server.level.progress.ChunkProgressListenerFactory; import net.minecraft.world.level.storage.LevelStorageSource; -import org.embeddedt.modernfix.ModernFix; import org.embeddedt.modernfix.annotation.ClientOnlyMixin; -import org.embeddedt.modernfix.core.config.ModernFixConfig; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -20,7 +18,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; public class IntegratedServerMixin { @Inject(method = "", at = @At("RETURN")) private void adjustServerPriority(Thread thread, Minecraft arg, LevelStorageSource.LevelStorageAccess arg2, PackRepository arg3, WorldStem arg4, Services arg5, ChunkProgressListenerFactory arg6, CallbackInfo ci) { - int pri = ModernFixConfig.INTEGRATED_SERVER_PRIORITY.get(); + int pri = 4; thread.setPriority(pri); } } diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/thread_priorities/UtilMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/thread_priorities/UtilMixin.java similarity index 85% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/thread_priorities/UtilMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/thread_priorities/UtilMixin.java index 986b965a..71c7cb30 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/thread_priorities/UtilMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/thread_priorities/UtilMixin.java @@ -1,8 +1,6 @@ -package org.embeddedt.modernfix.mixin.perf.thread_priorities; +package org.embeddedt.modernfix.common.mixin.perf.thread_priorities; import net.minecraft.Util; -import org.embeddedt.modernfix.ModernFix; -import org.embeddedt.modernfix.core.config.ModernFixConfig; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyArg; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/safety/BlockColorsMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/safety/BlockColorsMixin.java similarity index 81% rename from src/main/java/org/embeddedt/modernfix/mixin/safety/BlockColorsMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/safety/BlockColorsMixin.java index 5e6930a7..38e360fb 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/safety/BlockColorsMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/safety/BlockColorsMixin.java @@ -1,9 +1,6 @@ -package org.embeddedt.modernfix.mixin.safety; +package org.embeddedt.modernfix.common.mixin.safety; -import net.minecraft.world.level.block.Block; -import net.minecraft.client.Minecraft; import net.minecraft.client.color.block.BlockColors; -import net.minecraft.client.color.block.BlockColor; import org.embeddedt.modernfix.annotation.ClientOnlyMixin; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/safety/ItemColorsMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/safety/ItemColorsMixin.java similarity index 93% rename from src/main/java/org/embeddedt/modernfix/mixin/safety/ItemColorsMixin.java rename to common/src/main/java/org/embeddedt/modernfix/common/mixin/safety/ItemColorsMixin.java index cc921521..b213ecb3 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/safety/ItemColorsMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/safety/ItemColorsMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.safety; +package org.embeddedt.modernfix.common.mixin.safety; import net.minecraft.client.color.item.ItemColors; import org.embeddedt.modernfix.annotation.ClientOnlyMixin; diff --git a/common/src/main/java/org/embeddedt/modernfix/core/ModernFixMixinPlugin.java b/common/src/main/java/org/embeddedt/modernfix/core/ModernFixMixinPlugin.java new file mode 100644 index 00000000..f423bd1c --- /dev/null +++ b/common/src/main/java/org/embeddedt/modernfix/core/ModernFixMixinPlugin.java @@ -0,0 +1,128 @@ +package org.embeddedt.modernfix.core; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.embeddedt.modernfix.core.config.ModernFixEarlyConfig; +import org.embeddedt.modernfix.core.config.Option; +import org.embeddedt.modernfix.platform.ModernFixPlatformHooks; +import org.objectweb.asm.tree.*; +import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; +import org.spongepowered.asm.mixin.extensibility.IMixinInfo; + +import java.io.File; +import java.util.*; +import java.util.regex.Pattern; + +public class ModernFixMixinPlugin implements IMixinConfigPlugin { + private static final String MIXIN_PACKAGE_ROOT = "org.embeddedt.modernfix.mixin."; + + public final Logger logger = LogManager.getLogger("ModernFix"); + public ModernFixEarlyConfig config = null; + public static ModernFixMixinPlugin instance; + + public ModernFixMixinPlugin() { + boolean firstConfig = instance == null; + if(firstConfig) { + instance = this; + try { + config = ModernFixEarlyConfig.load(new File("./config/modernfix-mixins.properties")); + } catch (Exception e) { + throw new RuntimeException("Could not load configuration file for ModernFix", e); + } + + this.logger.info("Loaded configuration file for ModernFix: {} options available, {} override(s) found", + config.getOptionCount(), config.getOptionOverrideCount()); + + if(ModernFixEarlyConfig.OPTIFINE_PRESENT) + this.logger.fatal("OptiFine detected. Use of ModernFix with OptiFine is not supported due to its impact on launch time and breakage of Forge features."); + + try { + Class.forName("sun.misc.Unsafe").getDeclaredMethod("defineAnonymousClass", Class.class, byte[].class, Object[].class); + } catch(ReflectiveOperationException | NullPointerException e) { + this.logger.info("Applying Nashorn fix"); + Properties properties = System.getProperties(); + properties.setProperty("nashorn.args", properties.getProperty("nashorn.args", "") + " --anonymous-classes=false"); + } + + /* We abuse the constructor of a mixin plugin as a safe location to start modifying the classloader */ + ModernFixPlatformHooks.injectPlatformSpecificHacks(); + } + } + + + @Override + public void onLoad(String mixinPackage) { + + } + + @Override + public String getRefMapperConfig() { + return null; + } + + @Override + public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { + mixinClassName = ModernFixEarlyConfig.sanitize(mixinClassName); + if (!mixinClassName.startsWith(MIXIN_PACKAGE_ROOT)) { + this.logger.error("Expected mixin '{}' to start with package root '{}', treating as foreign and " + + "disabling!", mixinClassName, MIXIN_PACKAGE_ROOT); + + return false; + } + + String mixin = mixinClassName.substring(MIXIN_PACKAGE_ROOT.length()); + if(!instance.isOptionEnabled(mixin)) + return false; + String disabledBecauseMod = instance.config.getPermanentlyDisabledMixins().get(mixin); + return disabledBecauseMod == null; + } + + public boolean isOptionEnabled(String mixin) { + Option option = instance.config.getEffectiveOptionForMixin(mixin); + + if (option == null) { + this.logger.error("No rules matched mixin '{}', treating as foreign and disabling!", mixin); + + return false; + } + + if (option.isOverridden()) { + String source = "[unknown]"; + + if (option.isUserDefined()) { + source = "user configuration"; + } else if (option.isModDefined()) { + source = "mods [" + String.join(", ", option.getDefiningMods()) + "]"; + } + + if (option.isEnabled()) { + this.logger.warn("Force-enabling mixin '{}' as rule '{}' (added by {}) enables it", mixin, + option.getName(), source); + } else { + this.logger.warn("Force-disabling mixin '{}' as rule '{}' (added by {}) disables it and children", mixin, + option.getName(), source); + } + } + + return option.isEnabled(); + } + @Override + public void acceptTargets(Set myTargets, Set otherTargets) { + + } + + @Override + public List getMixins() { + return null; + } + + @Override + public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { + + } + + @Override + public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { + ModernFixPlatformHooks.applyASMTransformers(mixinClassName, targetClass); + } +} \ No newline at end of file diff --git a/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java b/common/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java similarity index 68% rename from src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java rename to common/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java index bae54135..d91e5fc5 100644 --- a/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java +++ b/common/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java @@ -1,31 +1,24 @@ package org.embeddedt.modernfix.core.config; import com.google.common.base.Splitter; +import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import com.google.gson.*; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.fml.loading.FMLLoader; -import net.minecraftforge.fml.loading.moddiscovery.ExplodedDirectoryLocator; -import net.minecraftforge.fml.loading.moddiscovery.MinecraftLocator; -import net.minecraftforge.fml.loading.moddiscovery.ModInfo; -import net.minecraftforge.forgespi.locating.IModLocator; -import net.minecraftforge.forgespi.locating.IModProvider; -import net.minecraftforge.forgespi.locating.IModFile; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.embeddedt.modernfix.ModernFix; +import org.embeddedt.modernfix.platform.ModernFixPlatformHooks; import org.objectweb.asm.ClassReader; import org.objectweb.asm.tree.AnnotationNode; import org.objectweb.asm.tree.ClassNode; -import org.objectweb.asm.tree.TypeAnnotationNode; import java.io.*; -import java.nio.file.Files; -import java.nio.file.Path; +import java.nio.charset.StandardCharsets; import java.util.*; +import java.util.regex.Pattern; import java.util.stream.Collectors; -import java.util.stream.Stream; public class ModernFixEarlyConfig { private static final Logger LOGGER = LogManager.getLogger("ModernFixConfig"); @@ -50,13 +43,19 @@ public class ModernFixEarlyConfig { if(modId.equals("optifine")) return OPTIFINE_PRESENT; else - return FMLLoader.getLoadingModList().getModFileById(modId) != null; + return ModernFixPlatformHooks.modPresent(modId); } private static final String MIXIN_DESC = "Lorg/spongepowered/asm/mixin/Mixin;"; private static final String MIXIN_CLIENT_ONLY_DESC = "Lorg/embeddedt/modernfix/annotation/ClientOnlyMixin;"; private static final String MIXIN_REQUIRES_MOD_DESC = "Lorg/embeddedt/modernfix/annotation/RequiresMod;"; + private static final Pattern PLATFORM_PREFIX = Pattern.compile("(forge|fabric|common)\\."); + + public static String sanitize(String mixinClassName) { + return PLATFORM_PREFIX.matcher(mixinClassName).replaceFirst(""); + } + private final Set mixinOptions = new ObjectOpenHashSet<>(); private final Map mixinsMissingMods = new Object2ObjectOpenHashMap<>(); @@ -65,73 +64,77 @@ public class ModernFixEarlyConfig { } private void scanForAndBuildMixinOptions() { - IModFile file = FMLLoader.getLoadingModList().getModFileById("modernfix").getFile(); - Path mixinFolder = file.findResource("org", "embeddedt", "modernfix", "mixin"); - try(Stream mixinFiles = Files.find(mixinFolder, Integer.MAX_VALUE, (p, a) -> true)) { - Splitter dotSplitter = Splitter.on('.'); - // filter via toString - mixinFiles - .filter(p -> { - Path fileName = p.getFileName(); - return fileName != null && fileName.toString().endsWith(".class"); - }) - .forEach(path -> { - try(InputStream stream = Files.newInputStream(path)) { - ClassReader reader = new ClassReader(stream); - ClassNode node = new ClassNode(); - reader.accept(node, ClassReader.SKIP_CODE | ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG); - if(node.invisibleAnnotations == null) - return; - boolean isMixin = false, isClientOnly = false, requiredModPresent = true; - String requiredModId = ""; - for(AnnotationNode annotation : node.invisibleAnnotations) { - if(Objects.equals(annotation.desc, MIXIN_DESC)) { - isMixin = true; - } else if(Objects.equals(annotation.desc, MIXIN_CLIENT_ONLY_DESC)) { - isClientOnly = true; - } else if(Objects.equals(annotation.desc, MIXIN_REQUIRES_MOD_DESC)) { - for(int i = 0; i < annotation.values.size(); i += 2) { - if(annotation.values.get(i).equals("value")) { - String modId = (String)annotation.values.get(i + 1); - if(modId != null) { - requiredModPresent = modPresent(modId); - requiredModId = modId; - } - break; - } - } + List configFiles = ImmutableList.of("modernfix-common.mixins.json", "modernfix-fabric.mixins.json", "modernfix-forge.mixins.json"); + List mixinPaths = new ArrayList<>(); + for(String configFile : configFiles) { + InputStream stream = ModernFixEarlyConfig.class.getClassLoader().getResourceAsStream(configFile); + if(stream == null) + continue; + try(Reader reader = new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8))) { + JsonObject configObject = (JsonObject)new JsonParser().parse(reader); + JsonArray mixinList = configObject.getAsJsonArray("mixins"); + String packageName = configObject.get("package").getAsString().replace('.', '/'); + for(JsonElement mixin : mixinList) { + mixinPaths.add(packageName + "/" + mixin.getAsString().replace('.', '/') + ".class"); + } + } catch(IOException | JsonParseException e) { + LOGGER.error("Error loading config " + configFile, e); + } + } + Splitter dotSplitter = Splitter.on('.'); + for(String mixinPath : mixinPaths) { + try(InputStream stream = ModernFixEarlyConfig.class.getClassLoader().getResourceAsStream(mixinPath)) { + ClassReader reader = new ClassReader(stream); + ClassNode node = new ClassNode(); + reader.accept(node, ClassReader.SKIP_CODE | ClassReader.SKIP_FRAMES | ClassReader.SKIP_DEBUG); + if(node.invisibleAnnotations == null) + return; + boolean isMixin = false, isClientOnly = false, requiredModPresent = true; + String requiredModId = ""; + for(AnnotationNode annotation : node.invisibleAnnotations) { + if(Objects.equals(annotation.desc, MIXIN_DESC)) { + isMixin = true; + } else if(Objects.equals(annotation.desc, MIXIN_CLIENT_ONLY_DESC)) { + isClientOnly = true; + } else if(Objects.equals(annotation.desc, MIXIN_REQUIRES_MOD_DESC)) { + for(int i = 0; i < annotation.values.size(); i += 2) { + if(annotation.values.get(i).equals("value")) { + String modId = (String)annotation.values.get(i + 1); + if(modId != null) { + requiredModPresent = modPresent(modId); + requiredModId = modId; } + break; } - if(isMixin) { - String mixinClassName = node.name.replace("org/embeddedt/modernfix/mixin/", "").replace('/', '.'); - if(!requiredModPresent) - mixinsMissingMods.put(mixinClassName, requiredModId); - else if(isClientOnly && FMLLoader.getDist() != Dist.CLIENT) - mixinsMissingMods.put(mixinClassName, "[not client]"); - List mixinOptionNames = dotSplitter.splitToList(mixinClassName); - StringBuilder optionBuilder = new StringBuilder(mixinClassName.length()); - optionBuilder.append("mixin"); - for(int i = 0; i < mixinOptionNames.size() - 1; i++) { - optionBuilder.append('.'); - optionBuilder.append(mixinOptionNames.get(i)); - mixinOptions.add(optionBuilder.toString()); - } - } - } catch(IOException e) { - ModernFix.LOGGER.error("Error scanning file " + path, e); } - }); - } catch(IOException e) { - ModernFix.LOGGER.error("Error scanning for mixins", e); + } + } + if(isMixin) { + String mixinClassName = sanitize(node.name.replace('/', '.')).replace("org.embeddedt.modernfix.mixin.", ""); + if(!requiredModPresent) + mixinsMissingMods.put(mixinClassName, requiredModId); + else if(isClientOnly && !ModernFixPlatformHooks.isClient()) + mixinsMissingMods.put(mixinClassName, "[not client]"); + List mixinOptionNames = dotSplitter.splitToList(mixinClassName); + StringBuilder optionBuilder = new StringBuilder(mixinClassName.length()); + optionBuilder.append("mixin"); + for(int i = 0; i < mixinOptionNames.size() - 1; i++) { + optionBuilder.append('.'); + optionBuilder.append(mixinOptionNames.get(i)); + mixinOptions.add(optionBuilder.toString()); + } + } + } catch(IOException e) { + ModernFix.LOGGER.error("Error scanning file " + mixinPath, e); + } } } private static final boolean shouldReplaceSearchTrees; - private static final boolean isDevEnv = !FMLLoader.isProduction() && FMLLoader.getLoadingModList().getModFileById("modernfix").getFile().getProvider() instanceof ExplodedDirectoryLocator;; + private static final boolean isDevEnv = ModernFixPlatformHooks.isDevEnv(); static { - Optional jeiMod = FMLLoader.getLoadingModList().getMods().stream().filter(mod -> mod.getModId().equals("jei")).findFirst(); - shouldReplaceSearchTrees = (jeiMod.isPresent() && jeiMod.get().getVersion().getMajorVersion() >= 10) || FMLLoader.getLoadingModList().getModFileById("roughlyenoughitems") != null; + shouldReplaceSearchTrees = modPresent("jei"); } private static final ImmutableMap DEFAULT_SETTING_OVERRIDES = ImmutableMap.builder() diff --git a/src/main/java/org/embeddedt/modernfix/core/config/Option.java b/common/src/main/java/org/embeddedt/modernfix/core/config/Option.java similarity index 100% rename from src/main/java/org/embeddedt/modernfix/core/config/Option.java rename to common/src/main/java/org/embeddedt/modernfix/core/config/Option.java diff --git a/src/main/java/org/embeddedt/modernfix/dedup/DeduplicationCache.java b/common/src/main/java/org/embeddedt/modernfix/dedup/DeduplicationCache.java similarity index 100% rename from src/main/java/org/embeddedt/modernfix/dedup/DeduplicationCache.java rename to common/src/main/java/org/embeddedt/modernfix/dedup/DeduplicationCache.java diff --git a/src/main/java/org/embeddedt/modernfix/dedup/IdentifierCaches.java b/common/src/main/java/org/embeddedt/modernfix/dedup/IdentifierCaches.java similarity index 100% rename from src/main/java/org/embeddedt/modernfix/dedup/IdentifierCaches.java rename to common/src/main/java/org/embeddedt/modernfix/dedup/IdentifierCaches.java diff --git a/src/main/java/org/embeddedt/modernfix/dfu/DFUBlaster.java b/common/src/main/java/org/embeddedt/modernfix/dfu/DFUBlaster.java similarity index 99% rename from src/main/java/org/embeddedt/modernfix/dfu/DFUBlaster.java rename to common/src/main/java/org/embeddedt/modernfix/dfu/DFUBlaster.java index 1083a9f7..b1d78509 100644 --- a/src/main/java/org/embeddedt/modernfix/dfu/DFUBlaster.java +++ b/common/src/main/java/org/embeddedt/modernfix/dfu/DFUBlaster.java @@ -12,7 +12,6 @@ import org.embeddedt.modernfix.ModernFix; import sun.misc.Unsafe; import java.lang.reflect.Field; -import java.util.Map; import java.util.Optional; import java.util.concurrent.TimeUnit; import java.util.function.IntFunction; diff --git a/src/main/java/org/embeddedt/modernfix/dfu/LazyDataFixer.java b/common/src/main/java/org/embeddedt/modernfix/dfu/LazyDataFixer.java similarity index 98% rename from src/main/java/org/embeddedt/modernfix/dfu/LazyDataFixer.java rename to common/src/main/java/org/embeddedt/modernfix/dfu/LazyDataFixer.java index dd9dfbdb..4284e4bc 100644 --- a/src/main/java/org/embeddedt/modernfix/dfu/LazyDataFixer.java +++ b/common/src/main/java/org/embeddedt/modernfix/dfu/LazyDataFixer.java @@ -1,7 +1,6 @@ package org.embeddedt.modernfix.dfu; import com.mojang.datafixers.DSL; -import com.mojang.datafixers.DataFix; import com.mojang.datafixers.DataFixUtils; import com.mojang.datafixers.DataFixer; import com.mojang.datafixers.schemas.Schema; diff --git a/src/main/java/org/embeddedt/modernfix/duck/IBlockState.java b/common/src/main/java/org/embeddedt/modernfix/duck/IBlockState.java similarity index 66% rename from src/main/java/org/embeddedt/modernfix/duck/IBlockState.java rename to common/src/main/java/org/embeddedt/modernfix/duck/IBlockState.java index 208a4c1a..d396f128 100644 --- a/src/main/java/org/embeddedt/modernfix/duck/IBlockState.java +++ b/common/src/main/java/org/embeddedt/modernfix/duck/IBlockState.java @@ -1,6 +1,5 @@ package org.embeddedt.modernfix.duck; -import org.embeddedt.modernfix.util.BakeReason; public interface IBlockState { void clearCache(); diff --git a/src/main/java/org/embeddedt/modernfix/duck/ICachedMaterialsModel.java b/common/src/main/java/org/embeddedt/modernfix/duck/ICachedMaterialsModel.java similarity index 100% rename from src/main/java/org/embeddedt/modernfix/duck/ICachedMaterialsModel.java rename to common/src/main/java/org/embeddedt/modernfix/duck/ICachedMaterialsModel.java diff --git a/src/main/java/org/embeddedt/modernfix/duck/IChunkGenerator.java b/common/src/main/java/org/embeddedt/modernfix/duck/IChunkGenerator.java similarity index 100% rename from src/main/java/org/embeddedt/modernfix/duck/IChunkGenerator.java rename to common/src/main/java/org/embeddedt/modernfix/duck/IChunkGenerator.java diff --git a/src/main/java/org/embeddedt/modernfix/duck/IClientNetHandler.java b/common/src/main/java/org/embeddedt/modernfix/duck/IClientNetHandler.java similarity index 100% rename from src/main/java/org/embeddedt/modernfix/duck/IClientNetHandler.java rename to common/src/main/java/org/embeddedt/modernfix/duck/IClientNetHandler.java diff --git a/src/main/java/org/embeddedt/modernfix/duck/IExtendedModelBakery.java b/common/src/main/java/org/embeddedt/modernfix/duck/IExtendedModelBakery.java similarity index 100% rename from src/main/java/org/embeddedt/modernfix/duck/IExtendedModelBakery.java rename to common/src/main/java/org/embeddedt/modernfix/duck/IExtendedModelBakery.java diff --git a/src/main/java/org/embeddedt/modernfix/duck/ILevelSave.java b/common/src/main/java/org/embeddedt/modernfix/duck/ILevelSave.java similarity index 100% rename from src/main/java/org/embeddedt/modernfix/duck/ILevelSave.java rename to common/src/main/java/org/embeddedt/modernfix/duck/ILevelSave.java diff --git a/src/main/java/org/embeddedt/modernfix/duck/IPaperChunkHolder.java b/common/src/main/java/org/embeddedt/modernfix/duck/IPaperChunkHolder.java similarity index 100% rename from src/main/java/org/embeddedt/modernfix/duck/IPaperChunkHolder.java rename to common/src/main/java/org/embeddedt/modernfix/duck/IPaperChunkHolder.java diff --git a/src/main/java/org/embeddedt/modernfix/duck/IServerLevel.java b/common/src/main/java/org/embeddedt/modernfix/duck/IServerLevel.java similarity index 100% rename from src/main/java/org/embeddedt/modernfix/duck/IServerLevel.java rename to common/src/main/java/org/embeddedt/modernfix/duck/IServerLevel.java diff --git a/src/main/java/org/embeddedt/modernfix/duck/reuse_datapacks/ICachingResourceClient.java b/common/src/main/java/org/embeddedt/modernfix/duck/reuse_datapacks/ICachingResourceClient.java similarity index 100% rename from src/main/java/org/embeddedt/modernfix/duck/reuse_datapacks/ICachingResourceClient.java rename to common/src/main/java/org/embeddedt/modernfix/duck/reuse_datapacks/ICachingResourceClient.java diff --git a/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicBakedModelProvider.java b/common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicBakedModelProvider.java similarity index 97% rename from src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicBakedModelProvider.java rename to common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicBakedModelProvider.java index 3b21d552..cb4f81e9 100644 --- a/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicBakedModelProvider.java +++ b/common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicBakedModelProvider.java @@ -2,7 +2,6 @@ package org.embeddedt.modernfix.dynamicresources; import com.mojang.math.Transformation; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.client.resources.model.BlockModelRotation; import net.minecraft.client.resources.model.BuiltInModel; @@ -11,7 +10,6 @@ import net.minecraft.resources.ResourceLocation; import org.apache.commons.lang3.tuple.Triple; import org.jetbrains.annotations.NotNull; -import javax.annotation.Nullable; import java.util.AbstractMap; import java.util.Collection; import java.util.Map; @@ -75,7 +73,6 @@ public class DynamicBakedModelProvider implements Map untrustedPacks, Set knownLocations, + Collection uncertainLocations, String filePrefix) { + if(untrustedPacks.size() > 0) { + /* Now make a fallback resource manager and use it on the remaining packs to see if they actually contain these files */ + FallbackResourceManager frm = new FallbackResourceManager(PackType.CLIENT_RESOURCES, "dummy"); + for (int i = untrustedPacks.size() - 1; i >= 0; i--) { + frm.push(untrustedPacks.get(i)); + } + for (ResourceLocation blockstate : uncertainLocations) { + if (knownLocations.contains(blockstate)) + continue; // don't check ones we know exist + ResourceLocation fileLocation = new ResourceLocation(blockstate.getNamespace(), filePrefix + blockstate.getPath() + ".json"); + Optional resource = frm.getResource(fileLocation); + if(resource.isPresent()) + knownLocations.add(blockstate); + } + } + } + + private static final int ERROR_THRESHOLD = 200; + + private static void logOrSuppressError(Object2IntOpenHashMap suppressionMap, String type, ResourceLocation location, Throwable e) { + int numErrors; + synchronized (suppressionMap) { + numErrors = suppressionMap.computeInt(location.getNamespace(), (k, oldVal) -> (oldVal == null ? 1 : oldVal + 1)); + } + if(numErrors <= ERROR_THRESHOLD) + ModernFix.LOGGER.error("Error reading {} {}: {}", type, location, e); + } + + public static void gatherModelMaterials(ResourceManager manager, Predicate isTrustedPack, + Set materialSet, Set blockStateFiles, + Set modelFiles, UnbakedModel missingModel, + Function modelDeserializer, + Function bakeryModelGetter) { + Stopwatch stopwatch = Stopwatch.createStarted(); + final Object2IntOpenHashMap blockstateErrors = new Object2IntOpenHashMap<>(); + /* + * First, gather all vanilla packs, and use listResources on them. This will allow us to (hopefully) avoid + * scanning most packs a lot. + */ + List allPackResources = new ArrayList<>(manager.listPacks().collect(Collectors.toList())); + Collections.reverse(allPackResources); + ObjectOpenHashSet allAvailableModels = new ObjectOpenHashSet<>(), allAvailableStates = new ObjectOpenHashSet<>(); + allPackResources.removeIf(pack -> { + if(isTrustedPack.test(pack)) { + for(String namespace : pack.getNamespaces(PackType.CLIENT_RESOURCES)) { + Collection allBlockstates = pack.getResources(PackType.CLIENT_RESOURCES, namespace, "blockstates", p -> p.getPath().endsWith(".json")); + for(ResourceLocation blockstate : allBlockstates) { + allAvailableStates.add(new ResourceLocation(blockstate.getNamespace(), blockstate.getPath().replace("blockstates/", "").replace(".json", ""))); + } + Collection allModels = pack.getResources(PackType.CLIENT_RESOURCES, namespace, "models", p -> p.getPath().endsWith(".json")); + for(ResourceLocation blockstate : allModels) { + allAvailableModels.add(new ResourceLocation(blockstate.getNamespace(), blockstate.getPath().replace("models/", "").replace(".json", ""))); + } + } + return true; + } + ModernFix.LOGGER.debug("Pack with class {} needs manual scan", pack.getClass().getName()); + return false; + }); + + gatherAdditionalViaManualScan(allPackResources, allAvailableStates, blockStateFiles, "blockstates/"); + // We now have a list of all blockstates known to exist. Delete anything that we don't have + blockStateFiles.retainAll(allAvailableStates); + allAvailableStates.clear(); + allAvailableStates.trim(); + + ConcurrentLinkedQueue> blockStateLoadedFiles = new ConcurrentLinkedQueue<>(); + List> blockStateData = new ArrayList<>(); + for(ResourceLocation blockstate : blockStateFiles) { + blockStateData.add(CompletableFuture.runAsync(() -> { + ResourceLocation fileLocation = new ResourceLocation(blockstate.getNamespace(), "blockstates/" + blockstate.getPath() + ".json"); + try { + List resources = manager.getResourceStack(fileLocation); + for(Resource resource : resources) { + JsonParser parser = new JsonParser(); + try(InputStream stream = resource.open()) { + blockStateLoadedFiles.add(Pair.of(blockstate, parser.parse(new InputStreamReader(stream, StandardCharsets.UTF_8)))); + } catch(JsonParseException e) { + logOrSuppressError(blockstateErrors, "blockstate", blockstate, e); + } + } + } catch(IOException e) { + logOrSuppressError(blockstateErrors, "blockstate", blockstate, e); + } + }, ModernFix.resourceReloadExecutor())); + } + blockStateFiles = null; + CompletableFuture.allOf(blockStateData.toArray(new CompletableFuture[0])).join(); + for(Pair pair : blockStateLoadedFiles) { + if(pair.getSecond() != null) { + try { + JsonObject obj = pair.getSecond().getAsJsonObject(); + if(obj.has("variants")) { + JsonObject eachVariant = obj.getAsJsonObject("variants"); + for(Map.Entry entry : eachVariant.entrySet()) { + JsonElement variantData = entry.getValue(); + List variantModels; + if(variantData.isJsonArray()) { + variantModels = new ArrayList<>(); + for(JsonElement model : variantData.getAsJsonArray()) { + variantModels.add(model.getAsJsonObject()); + } + } else + variantModels = Collections.singletonList(variantData.getAsJsonObject()); + for(JsonObject variant : variantModels) { + modelFiles.add(new ResourceLocation(variant.get("model").getAsString())); + } + } + + } else { + JsonArray multipartData = obj.get("multipart").getAsJsonArray(); + for(JsonElement element : multipartData) { + JsonObject self = element.getAsJsonObject(); + JsonElement apply = self.get("apply"); + List applyObjects; + if(apply.isJsonArray()) { + applyObjects = new ArrayList<>(); + for(JsonElement e : apply.getAsJsonArray()) { + applyObjects.add(e.getAsJsonObject()); + } + } else + applyObjects = Collections.singletonList(apply.getAsJsonObject()); + for(JsonObject applyEntry : applyObjects) { + modelFiles.add(new ResourceLocation(applyEntry.get("model").getAsString())); + } + } + + } + } catch(RuntimeException e) { + logOrSuppressError(blockstateErrors, "blockstate", pair.getFirst(), e); + } + + } + } + blockstateErrors.object2IntEntrySet().forEach(entry -> { + if(entry.getIntValue() > ERROR_THRESHOLD) { + ModernFix.LOGGER.error("Suppressed additional {} blockstate errors for domain {}", entry.getIntValue(), entry.getKey()); + } + }); + blockstateErrors.clear(); + blockStateData = null; + blockStateLoadedFiles.clear(); + + /* figure out which models we should actually load */ + gatherAdditionalViaManualScan(allPackResources, allAvailableModels, modelFiles, "models/"); + modelFiles.retainAll(allAvailableModels); + allAvailableModels.clear(); + allAvailableModels.trim(); + + Map basicModels = new HashMap<>(); + basicModels.put(ModelBakery.MISSING_MODEL_LOCATION, (BlockModel)missingModel); + basicModels.put(new ResourceLocation("builtin/generated"), GENERATION_MARKER); + basicModels.put(new ResourceLocation("builtin/entity"), BLOCK_ENTITY_MARKER); + Set> errorSet = Sets.newLinkedHashSet(); + while(modelFiles.size() > 0) { + List>> modelBytes = new ArrayList<>(); + for(ResourceLocation model : modelFiles) { + if(basicModels.containsKey(model)) + continue; + ResourceLocation fileLocation = new ResourceLocation(model.getNamespace(), "models/" + model.getPath() + ".json"); + modelBytes.add(CompletableFuture.supplyAsync(() -> { + Optional resource = manager.getResource(fileLocation); + try(InputStream stream = resource.orElseThrow().open()) { + JsonParser parser = new JsonParser(); + return Pair.of(model, parser.parse(new InputStreamReader(stream, StandardCharsets.UTF_8))); + } catch(IOException | NoSuchElementException | JsonParseException e) { + logOrSuppressError(blockstateErrors, "model", fileLocation, e); + return Pair.of(fileLocation, null); + } + }, ModernFix.resourceReloadExecutor())); + } + modelFiles.clear(); + CompletableFuture.allOf(modelBytes.toArray(new CompletableFuture[0])).join(); + UVController.useDummyUv.set(Boolean.TRUE); + for(CompletableFuture> future : modelBytes) { + Pair pair = future.join(); + try { + if(pair.getSecond() != null) { + + BlockModel model = modelDeserializer.apply(pair.getSecond()); + model.name = pair.getFirst().toString(); + modelFiles.addAll(model.getDependencies()); + basicModels.put(pair.getFirst(), model); + continue; + } + } catch(Throwable e) { + logOrSuppressError(blockstateErrors, "model", pair.getFirst(), e); + } + basicModels.put(pair.getFirst(), (BlockModel)missingModel); + } + UVController.useDummyUv.set(Boolean.FALSE); + } + blockstateErrors.object2IntEntrySet().forEach(entry -> { + if(entry.getIntValue() > ERROR_THRESHOLD) { + ModernFix.LOGGER.error("Suppressed additional {} model errors for domain {}", entry.getIntValue(), entry.getKey()); + } + }); + modelFiles = null; + Function modelGetter = loc -> { + UnbakedModel m = basicModels.get(loc); + /* fallback to vanilla loader if missing */ + return m != null ? m : bakeryModelGetter.apply(loc); + }; + for(BlockModel model : basicModels.values()) { + materialSet.addAll(model.getMaterials(modelGetter, errorSet)); + } + //errorSet.stream().filter(pair -> !pair.getSecond().equals(MISSING_MODEL_LOCATION_STRING)).forEach(pair -> LOGGER.warn("Unable to resolve texture reference: {} in {}", pair.getFirst(), pair.getSecond())); + stopwatch.stop(); + ModernFix.LOGGER.info("Resolving model textures took " + stopwatch); + } + + private static , V extends T> BlockState setPropertyGeneric(BlockState state, Property prop, Object o) { + return state.setValue(prop, (V)o); + } + + private static > T getValueHelper(Property property, String value) { + return property.getValue(value).orElse((T) null); + } + + private static final Splitter COMMA_SPLITTER = Splitter.on(','); + private static final Splitter EQUAL_SPLITTER = Splitter.on('=').limit(2); + + public static ImmutableList getBlockStatesForMRL(StateDefinition stateDefinition, ModelResourceLocation location) { + if(Objects.equals(location.getVariant(), "inventory")) + return ImmutableList.of(); + Set> fixedProperties = new HashSet<>(); + BlockState fixedState = stateDefinition.any(); + for(String s : COMMA_SPLITTER.split(location.getVariant())) { + Iterator iterator = EQUAL_SPLITTER.split(s).iterator(); + if (iterator.hasNext()) { + String s1 = iterator.next(); + Property property = stateDefinition.getProperty(s1); + if (property != null && iterator.hasNext()) { + String s2 = iterator.next(); + Object value = getValueHelper(property, s2); + if (value == null) { + throw new RuntimeException("Unknown value: '" + s2 + "' for blockstate property: '" + s1 + "' " + property.getPossibleValues()); + } + fixedState = setPropertyGeneric(fixedState, property, value); + fixedProperties.add(property); + } else if (!s1.isEmpty()) { + throw new RuntimeException("Unknown blockstate property: '" + s1 + "'"); + } + } + } + // generate all possible blockstates from the remaining properties + ArrayList> anyProperties = new ArrayList<>(stateDefinition.getProperties()); + anyProperties.removeAll(fixedProperties); + ArrayList finalList = new ArrayList<>(); + finalList.add(fixedState); + for(Property property : anyProperties) { + ArrayList newPermutations = new ArrayList<>(); + for(BlockState state : finalList) { + for(Comparable value : property.getPossibleValues()) { + newPermutations.add(setPropertyGeneric(state, property, value)); + } + } + finalList = newPermutations; + } + return ImmutableList.copyOf(finalList); + } +} diff --git a/src/main/java/org/embeddedt/modernfix/dynamicresources/ModelLocationCache.java b/common/src/main/java/org/embeddedt/modernfix/dynamicresources/ModelLocationCache.java similarity index 84% rename from src/main/java/org/embeddedt/modernfix/dynamicresources/ModelLocationCache.java rename to common/src/main/java/org/embeddedt/modernfix/dynamicresources/ModelLocationCache.java index 460a6da0..7370d58a 100644 --- a/src/main/java/org/embeddedt/modernfix/dynamicresources/ModelLocationCache.java +++ b/common/src/main/java/org/embeddedt/modernfix/dynamicresources/ModelLocationCache.java @@ -3,21 +3,12 @@ package org.embeddedt.modernfix.dynamicresources; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; -import com.google.common.collect.ImmutableMap; -import com.mojang.datafixers.util.Pair; -import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import net.minecraft.Util; import net.minecraft.client.renderer.block.BlockModelShaper; import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.core.Registry; import net.minecraft.world.item.Item; -import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Map; -import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; public class ModelLocationCache { diff --git a/src/main/java/org/embeddedt/modernfix/dynamicresources/UVController.java b/common/src/main/java/org/embeddedt/modernfix/dynamicresources/UVController.java similarity index 100% rename from src/main/java/org/embeddedt/modernfix/dynamicresources/UVController.java rename to common/src/main/java/org/embeddedt/modernfix/dynamicresources/UVController.java diff --git a/common/src/main/java/org/embeddedt/modernfix/entity/EntityDataIDSyncHandler.java b/common/src/main/java/org/embeddedt/modernfix/entity/EntityDataIDSyncHandler.java new file mode 100644 index 00000000..695076c8 --- /dev/null +++ b/common/src/main/java/org/embeddedt/modernfix/entity/EntityDataIDSyncHandler.java @@ -0,0 +1,57 @@ +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.sendPacket(targetPlayer, packet); + } + } +} diff --git a/src/main/java/org/embeddedt/modernfix/packet/EntityIDSyncPacket.java b/common/src/main/java/org/embeddedt/modernfix/packet/EntityIDSyncPacket.java similarity index 100% rename from src/main/java/org/embeddedt/modernfix/packet/EntityIDSyncPacket.java rename to common/src/main/java/org/embeddedt/modernfix/packet/EntityIDSyncPacket.java diff --git a/common/src/main/java/org/embeddedt/modernfix/platform/ModernFixPlatformHooks.java b/common/src/main/java/org/embeddedt/modernfix/platform/ModernFixPlatformHooks.java new file mode 100644 index 00000000..5526ce46 --- /dev/null +++ b/common/src/main/java/org/embeddedt/modernfix/platform/ModernFixPlatformHooks.java @@ -0,0 +1,81 @@ +package org.embeddedt.modernfix.platform; + +import com.mojang.blaze3d.platform.NativeImage; +import dev.architectury.injectables.annotations.ExpectPlatform; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.packs.resources.Resource; +import net.minecraft.server.packs.resources.ResourceManager; +import org.objectweb.asm.tree.ClassNode; + +import java.io.IOException; +import java.nio.file.Path; + +public class ModernFixPlatformHooks { + @ExpectPlatform + public static boolean isClient() { + throw new AssertionError(); + } + + @ExpectPlatform + public static boolean isDedicatedServer() { + throw new AssertionError(); + } + + @ExpectPlatform + public static String getVersionString() { + throw new AssertionError(); + } + + @ExpectPlatform + public static boolean modPresent(String modId) { + throw new AssertionError(); + } + + @ExpectPlatform + public static boolean isDevEnv() { + throw new AssertionError(); + } + + @ExpectPlatform + public static void injectPlatformSpecificHacks() { + throw new AssertionError(); + } + + @ExpectPlatform + public static void applyASMTransformers(String mixinClassName, ClassNode targetClass) { + throw new AssertionError(); + } + + @ExpectPlatform + public static MinecraftServer getCurrentServer() { + throw new AssertionError(); + } + + @ExpectPlatform + public static boolean isLoadingNormally() { + throw new AssertionError(); + } + + @ExpectPlatform + public static TextureAtlasSprite loadTextureAtlasSprite(TextureAtlas atlasTexture, + ResourceManager resourceManager, TextureAtlasSprite.Info textureInfo, + Resource resource, + int atlasWidth, int atlasHeight, + int spriteX, int spriteY, int mipmapLevel, + NativeImage image) throws IOException { + throw new AssertionError(); + } + + @ExpectPlatform + public static Path getGameDirectory() { + throw new AssertionError(); + } + + @ExpectPlatform + public static void sendPacket(ServerPlayer player, Object packet) { + throw new AssertionError(); + } +} diff --git a/src/main/java/org/embeddedt/modernfix/resources/CachedResourcePath.java b/common/src/main/java/org/embeddedt/modernfix/resources/CachedResourcePath.java similarity index 100% rename from src/main/java/org/embeddedt/modernfix/resources/CachedResourcePath.java rename to common/src/main/java/org/embeddedt/modernfix/resources/CachedResourcePath.java diff --git a/src/main/java/org/embeddedt/modernfix/resources/PackResourcesCacheEngine.java b/common/src/main/java/org/embeddedt/modernfix/resources/PackResourcesCacheEngine.java similarity index 98% rename from src/main/java/org/embeddedt/modernfix/resources/PackResourcesCacheEngine.java rename to common/src/main/java/org/embeddedt/modernfix/resources/PackResourcesCacheEngine.java index df52e592..dae520c2 100644 --- a/src/main/java/org/embeddedt/modernfix/resources/PackResourcesCacheEngine.java +++ b/common/src/main/java/org/embeddedt/modernfix/resources/PackResourcesCacheEngine.java @@ -2,8 +2,6 @@ package org.embeddedt.modernfix.resources; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import com.mojang.datafixers.util.Pair; -import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.packs.PackType; diff --git a/src/main/java/org/embeddedt/modernfix/screen/ModernFixConfigScreen.java b/common/src/main/java/org/embeddedt/modernfix/screen/ModernFixConfigScreen.java similarity index 93% rename from src/main/java/org/embeddedt/modernfix/screen/ModernFixConfigScreen.java rename to common/src/main/java/org/embeddedt/modernfix/screen/ModernFixConfigScreen.java index 7600fb27..cbe69377 100644 --- a/src/main/java/org/embeddedt/modernfix/screen/ModernFixConfigScreen.java +++ b/common/src/main/java/org/embeddedt/modernfix/screen/ModernFixConfigScreen.java @@ -6,15 +6,13 @@ import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.CommonComponents; import net.minecraft.network.chat.Component; -import javax.annotation.Nullable; - public class ModernFixConfigScreen extends Screen { private OptionList optionList; private Screen lastScreen; public boolean madeChanges = false; private Button doneButton; - public ModernFixConfigScreen(@Nullable Screen lastScreen) { + public ModernFixConfigScreen(Screen lastScreen) { super(Component.translatable("modernfix.config")); this.lastScreen = lastScreen; } diff --git a/src/main/java/org/embeddedt/modernfix/screen/OptionList.java b/common/src/main/java/org/embeddedt/modernfix/screen/OptionList.java similarity index 94% rename from src/main/java/org/embeddedt/modernfix/screen/OptionList.java rename to common/src/main/java/org/embeddedt/modernfix/screen/OptionList.java index 02c7a452..bb44ab29 100644 --- a/src/main/java/org/embeddedt/modernfix/screen/OptionList.java +++ b/common/src/main/java/org/embeddedt/modernfix/screen/OptionList.java @@ -3,12 +3,10 @@ package org.embeddedt.modernfix.screen; import com.google.common.collect.ImmutableList; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.ChatFormatting; -import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.components.ContainerObjectSelectionList; import net.minecraft.client.gui.components.events.GuiEventListener; -import net.minecraft.client.gui.components.toasts.SystemToast; import net.minecraft.client.gui.narration.NarratableEntry; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; @@ -20,7 +18,6 @@ import java.io.IOException; import java.util.Collections; import java.util.List; import java.util.Map; -import java.util.Optional; import java.util.stream.Collectors; public class OptionList extends ContainerObjectSelectionList { @@ -38,7 +35,7 @@ public class OptionList extends ContainerObjectSelectionList { this.mainScreen = arg; int maxW = 0; - Map optionMap = ModernFixMixinPlugin.config.getOptionMap(); + Map optionMap = ModernFixMixinPlugin.instance.config.getOptionMap(); List sortedKeys = optionMap.keySet().stream().filter(key -> !key.equals("mixin.core")).sorted().collect(Collectors.toList()); for(String key : sortedKeys) { Option option = optionMap.get(key); @@ -69,7 +66,7 @@ public class OptionList extends ContainerObjectSelectionList { this.toggleButton = new Button(0, 0, 95, 20, Component.literal(""), (arg) -> { this.option.setEnabled(!this.option.isEnabled(), !this.option.isUserDefined()); try { - ModernFixMixinPlugin.config.save(); + ModernFixMixinPlugin.instance.config.save(); if(!OptionList.this.mainScreen.madeChanges) { OptionList.this.mainScreen.madeChanges = true; } diff --git a/src/main/java/org/embeddedt/modernfix/searchtree/DummySearchTree.java b/common/src/main/java/org/embeddedt/modernfix/searchtree/DummySearchTree.java similarity index 100% rename from src/main/java/org/embeddedt/modernfix/searchtree/DummySearchTree.java rename to common/src/main/java/org/embeddedt/modernfix/searchtree/DummySearchTree.java diff --git a/src/main/java/org/embeddedt/modernfix/searchtree/REIBackedSearchTree.java b/common/src/main/java/org/embeddedt/modernfix/searchtree/REIBackedSearchTree.java similarity index 100% rename from src/main/java/org/embeddedt/modernfix/searchtree/REIBackedSearchTree.java rename to common/src/main/java/org/embeddedt/modernfix/searchtree/REIBackedSearchTree.java diff --git a/src/main/java/org/embeddedt/modernfix/structure/CachingStructureManager.java b/common/src/main/java/org/embeddedt/modernfix/structure/CachingStructureManager.java similarity index 90% rename from src/main/java/org/embeddedt/modernfix/structure/CachingStructureManager.java rename to common/src/main/java/org/embeddedt/modernfix/structure/CachingStructureManager.java index 8839a255..0bde2201 100644 --- a/src/main/java/org/embeddedt/modernfix/structure/CachingStructureManager.java +++ b/common/src/main/java/org/embeddedt/modernfix/structure/CachingStructureManager.java @@ -1,7 +1,6 @@ package org.embeddedt.modernfix.structure; import com.mojang.datafixers.DataFixer; -import cpw.mods.modlauncher.api.LamdbaExceptionUtils; import net.minecraft.SharedConstants; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtIo; @@ -9,16 +8,23 @@ import net.minecraft.nbt.NbtUtils; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.datafix.DataFixTypes; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; -import net.minecraftforge.fml.loading.FMLPaths; import org.embeddedt.modernfix.ModernFix; +import org.embeddedt.modernfix.platform.ModernFixPlatformHooks; import org.embeddedt.modernfix.util.FileUtil; import java.io.*; import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; public class CachingStructureManager { - private static ThreadLocal digestThreadLocal = ThreadLocal.withInitial(() -> LamdbaExceptionUtils.uncheck(() -> MessageDigest.getInstance("SHA-256"))); - private static final File STRUCTURE_CACHE_FOLDER = FileUtil.childFile(FMLPaths.GAMEDIR.get().resolve("modernfix").resolve("structureCacheV1").toFile()); + private static ThreadLocal digestThreadLocal = ThreadLocal.withInitial(() -> { + try { + return MessageDigest.getInstance("SHA-256"); + } catch(NoSuchAlgorithmException e) { + throw new RuntimeException(e); + } + }); + private static final File STRUCTURE_CACHE_FOLDER = FileUtil.childFile(ModernFixPlatformHooks.getGameDirectory().resolve("modernfix").resolve("structureCacheV1").toFile()); static { STRUCTURE_CACHE_FOLDER.mkdirs(); diff --git a/src/main/java/org/embeddedt/modernfix/textures/StbStitcher.java b/common/src/main/java/org/embeddedt/modernfix/textures/StbStitcher.java similarity index 99% rename from src/main/java/org/embeddedt/modernfix/textures/StbStitcher.java rename to common/src/main/java/org/embeddedt/modernfix/textures/StbStitcher.java index 60477c28..7ec0c498 100644 --- a/src/main/java/org/embeddedt/modernfix/textures/StbStitcher.java +++ b/common/src/main/java/org/embeddedt/modernfix/textures/StbStitcher.java @@ -16,7 +16,6 @@ import static java.lang.invoke.MethodHandles.*; import static java.lang.invoke.MethodType.*; import java.lang.invoke.MethodHandle; -import java.sql.Ref; import java.util.ArrayList; import java.util.List; import java.util.stream.Stream; diff --git a/src/main/java/org/embeddedt/modernfix/util/BakeReason.java b/common/src/main/java/org/embeddedt/modernfix/util/BakeReason.java similarity index 100% rename from src/main/java/org/embeddedt/modernfix/util/BakeReason.java rename to common/src/main/java/org/embeddedt/modernfix/util/BakeReason.java diff --git a/src/main/java/org/embeddedt/modernfix/util/CanonizingStringMap.java b/common/src/main/java/org/embeddedt/modernfix/util/CanonizingStringMap.java similarity index 100% rename from src/main/java/org/embeddedt/modernfix/util/CanonizingStringMap.java rename to common/src/main/java/org/embeddedt/modernfix/util/CanonizingStringMap.java diff --git a/src/main/java/org/embeddedt/modernfix/util/ClassInfoManager.java b/common/src/main/java/org/embeddedt/modernfix/util/ClassInfoManager.java similarity index 97% rename from src/main/java/org/embeddedt/modernfix/util/ClassInfoManager.java rename to common/src/main/java/org/embeddedt/modernfix/util/ClassInfoManager.java index 190993a0..7c9aba4d 100644 --- a/src/main/java/org/embeddedt/modernfix/util/ClassInfoManager.java +++ b/common/src/main/java/org/embeddedt/modernfix/util/ClassInfoManager.java @@ -1,10 +1,6 @@ package org.embeddedt.modernfix.util; import com.google.common.collect.ImmutableMap; -import cpw.mods.jarhandling.SecureJar; -import cpw.mods.jarhandling.impl.Jar; -import net.minecraftforge.fml.ModList; -import net.minecraftforge.forgespi.language.IModFileInfo; import org.embeddedt.modernfix.ModernFix; import org.embeddedt.modernfix.core.ModernFixMixinPlugin; import org.jetbrains.annotations.NotNull; @@ -41,6 +37,8 @@ public class ClassInfoManager { // Clear manifest entries int numManifestsCleared = 0; + // TODO port + /* for(IModFileInfo mod : ModList.get().getModFiles()) { Manifest manifest = mod.getFile().getSecureJar().moduleDataProvider().getManifest(); if(manifest.getEntries() instanceof HashMap entryMap) { @@ -56,6 +54,8 @@ public class ClassInfoManager { } } } + + */ if(numManifestsCleared > 0) ModernFix.LOGGER.info("Cleared {} manifest attributes", numManifestsCleared); @@ -68,6 +68,7 @@ public class ClassInfoManager { } private static void clearSecureJarStructs() throws Throwable { + /* // Clear Jar signing data Unsafe unsafe; Field f = Unsafe.class.getDeclaredField("theUnsafe"); @@ -91,6 +92,8 @@ public class ClassInfoManager { unsafe.putObject(secureJar, verifiedSignersOffset, EmptyCodeSignerTable.INSTANCE); } } + + */ } static class EmptyCodeSignerTable extends Hashtable { diff --git a/src/main/java/org/embeddedt/modernfix/util/DummyList.java b/common/src/main/java/org/embeddedt/modernfix/util/DummyList.java similarity index 100% rename from src/main/java/org/embeddedt/modernfix/util/DummyList.java rename to common/src/main/java/org/embeddedt/modernfix/util/DummyList.java diff --git a/src/main/java/org/embeddedt/modernfix/util/DummyServerConfiguration.java b/common/src/main/java/org/embeddedt/modernfix/util/DummyServerConfiguration.java similarity index 92% rename from src/main/java/org/embeddedt/modernfix/util/DummyServerConfiguration.java rename to common/src/main/java/org/embeddedt/modernfix/util/DummyServerConfiguration.java index 96e3fbf1..3a853a59 100644 --- a/src/main/java/org/embeddedt/modernfix/util/DummyServerConfiguration.java +++ b/common/src/main/java/org/embeddedt/modernfix/util/DummyServerConfiguration.java @@ -13,7 +13,6 @@ import net.minecraft.world.level.levelgen.WorldGenSettings; import net.minecraft.world.level.storage.WorldData; import net.minecraft.world.level.storage.ServerLevelData; -import javax.annotation.Nullable; import java.util.Set; public class DummyServerConfiguration implements WorldData { @@ -42,14 +41,13 @@ public class DummyServerConfiguration implements WorldData { } - @Nullable @Override public CompoundTag getCustomBossEvents() { return null; } @Override - public void setCustomBossEvents(@Nullable CompoundTag nbt) { + public void setCustomBossEvents(CompoundTag nbt) { } @@ -64,7 +62,7 @@ public class DummyServerConfiguration implements WorldData { } @Override - public CompoundTag createTag(RegistryAccess registries, @Nullable CompoundTag hostPlayerNBT) { + public CompoundTag createTag(RegistryAccess registries, CompoundTag hostPlayerNBT) { return null; } diff --git a/src/main/java/org/embeddedt/modernfix/util/FileUtil.java b/common/src/main/java/org/embeddedt/modernfix/util/FileUtil.java similarity index 97% rename from src/main/java/org/embeddedt/modernfix/util/FileUtil.java rename to common/src/main/java/org/embeddedt/modernfix/util/FileUtil.java index 41f2c4f5..62a61f9a 100644 --- a/src/main/java/org/embeddedt/modernfix/util/FileUtil.java +++ b/common/src/main/java/org/embeddedt/modernfix/util/FileUtil.java @@ -1,7 +1,6 @@ package org.embeddedt.modernfix.util; import java.io.File; -import java.util.regex.Pattern; public class FileUtil { public static File childFile(File file) { diff --git a/src/main/java/org/embeddedt/modernfix/util/ItemMesherMap.java b/common/src/main/java/org/embeddedt/modernfix/util/ItemMesherMap.java similarity index 62% rename from src/main/java/org/embeddedt/modernfix/util/ItemMesherMap.java rename to common/src/main/java/org/embeddedt/modernfix/util/ItemMesherMap.java index 94e1b2f2..b44c8f5d 100644 --- a/src/main/java/org/embeddedt/modernfix/util/ItemMesherMap.java +++ b/common/src/main/java/org/embeddedt/modernfix/util/ItemMesherMap.java @@ -1,9 +1,7 @@ package org.embeddedt.modernfix.util; import net.minecraft.client.resources.model.ModelResourceLocation; -import net.minecraft.core.Holder; -import net.minecraft.world.item.Item; -import net.minecraftforge.registries.ForgeRegistries; +import net.minecraft.core.Registry; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -12,16 +10,16 @@ import java.util.Map; import java.util.Set; import java.util.function.Function; -public class ItemMesherMap implements Map, ModelResourceLocation> { - private final Function getLocation; +public class ItemMesherMap implements Map { + private final Function getLocation; - public ItemMesherMap(Function getLocation) { + public ItemMesherMap(Function getLocation) { this.getLocation = getLocation; } @Override public int size() { - return ForgeRegistries.ITEMS.getValues().size(); + return Registry.ITEM.keySet().size(); } @Override @@ -41,12 +39,12 @@ public class ItemMesherMap implements Map, ModelResourceL @Override public ModelResourceLocation get(Object key) { - return getLocation.apply(((Holder.Reference)key).get()); + return getLocation.apply((K)key); } @Nullable @Override - public ModelResourceLocation put(Holder.Reference key, ModelResourceLocation value) { + public ModelResourceLocation put(K key, ModelResourceLocation value) { throw new UnsupportedOperationException(); } @@ -56,7 +54,7 @@ public class ItemMesherMap implements Map, ModelResourceL } @Override - public void putAll(@NotNull Map, ? extends ModelResourceLocation> m) { + public void putAll(@NotNull Map m) { throw new UnsupportedOperationException(); } @@ -67,7 +65,7 @@ public class ItemMesherMap implements Map, ModelResourceL @NotNull @Override - public Set> keySet() { + public Set keySet() { throw new UnsupportedOperationException(); } @@ -79,7 +77,7 @@ public class ItemMesherMap implements Map, ModelResourceL @NotNull @Override - public Set, ModelResourceLocation>> entrySet() { + public Set> entrySet() { throw new UnsupportedOperationException(); } } diff --git a/src/main/java/org/embeddedt/modernfix/util/NamedPreparableResourceListener.java b/common/src/main/java/org/embeddedt/modernfix/util/NamedPreparableResourceListener.java similarity index 100% rename from src/main/java/org/embeddedt/modernfix/util/NamedPreparableResourceListener.java rename to common/src/main/java/org/embeddedt/modernfix/util/NamedPreparableResourceListener.java diff --git a/src/main/java/org/embeddedt/modernfix/util/PackTypeHelper.java b/common/src/main/java/org/embeddedt/modernfix/util/PackTypeHelper.java similarity index 100% rename from src/main/java/org/embeddedt/modernfix/util/PackTypeHelper.java rename to common/src/main/java/org/embeddedt/modernfix/util/PackTypeHelper.java diff --git a/src/main/java/org/embeddedt/modernfix/world/IntegratedWatchdog.java b/common/src/main/java/org/embeddedt/modernfix/world/IntegratedWatchdog.java similarity index 98% rename from src/main/java/org/embeddedt/modernfix/world/IntegratedWatchdog.java rename to common/src/main/java/org/embeddedt/modernfix/world/IntegratedWatchdog.java index e7c9afd8..32a5707a 100644 --- a/src/main/java/org/embeddedt/modernfix/world/IntegratedWatchdog.java +++ b/common/src/main/java/org/embeddedt/modernfix/world/IntegratedWatchdog.java @@ -10,7 +10,6 @@ import java.lang.management.ManagementFactory; import java.lang.management.ThreadInfo; import java.lang.management.ThreadMXBean; import java.lang.ref.WeakReference; -import java.util.concurrent.TimeUnit; public class IntegratedWatchdog extends Thread { private static final Logger LOGGER = LogUtils.getLogger(); diff --git a/src/main/java/org/embeddedt/modernfix/world/StrongholdLocationCache.java b/common/src/main/java/org/embeddedt/modernfix/world/StrongholdLocationCache.java similarity index 100% rename from src/main/java/org/embeddedt/modernfix/world/StrongholdLocationCache.java rename to common/src/main/java/org/embeddedt/modernfix/world/StrongholdLocationCache.java diff --git a/src/main/resources/assets/modernfix/lang/en_us.json b/common/src/main/resources/assets/modernfix/lang/en_us.json similarity index 100% rename from src/main/resources/assets/modernfix/lang/en_us.json rename to common/src/main/resources/assets/modernfix/lang/en_us.json diff --git a/src/main/resources/assets/modernfix/lang/zh_cn.json b/common/src/main/resources/assets/modernfix/lang/zh_cn.json similarity index 100% rename from src/main/resources/assets/modernfix/lang/zh_cn.json rename to common/src/main/resources/assets/modernfix/lang/zh_cn.json diff --git a/src/main/resources/modernfix.mixins.json b/common/src/main/resources/modernfix-common.mixins.json similarity index 73% rename from src/main/resources/modernfix.mixins.json rename to common/src/main/resources/modernfix-common.mixins.json index bfdff1c6..912d7b5c 100644 --- a/src/main/resources/modernfix.mixins.json +++ b/common/src/main/resources/modernfix-common.mixins.json @@ -1,10 +1,9 @@ { "required": true, "minVersion": "0.8", - "package": "org.embeddedt.modernfix.mixin", + "package": "org.embeddedt.modernfix.common.mixin", "plugin": "org.embeddedt.modernfix.core.ModernFixMixinPlugin", "compatibilityLevel": "JAVA_17", - "refmap": "modernfix.refmap.json", "mixins": [ ${mixin_classes} ], diff --git a/common/src/main/resources/modernfix.accesswidener b/common/src/main/resources/modernfix.accesswidener new file mode 100644 index 00000000..3271b04e --- /dev/null +++ b/common/src/main/resources/modernfix.accesswidener @@ -0,0 +1,40 @@ +accessWidener v2 named + +accessible class net/minecraft/client/renderer/RenderType$CompositeRenderType +accessible method net/minecraft/client/renderer/RenderType$CompositeRenderType (Ljava/lang/String;Lcom/mojang/blaze3d/vertex/VertexFormat;IIZZLnet/minecraft/client/renderer/RenderType$CompositeState;)V +accessible method net/minecraft/nbt/CompoundTag (Ljava/util/Map;)V + +accessible class net/minecraft/client/Minecraft$ExperimentalDialogType +accessible class net/minecraft/world/level/block/state/BlockBehaviour$BlockStateBase$Cache +accessible class net/minecraft/server/level/ServerChunkCache$MainThreadExecutor +accessible field net/minecraft/world/level/block/state/BlockBehaviour properties Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties; +accessible class net/minecraft/client/renderer/block/model/BlockElementFace$Deserializer +accessible class net/minecraft/client/renderer/texture/Stitcher$Holder +accessible field net/minecraft/client/renderer/texture/Stitcher$Holder width I +accessible field net/minecraft/client/renderer/texture/Stitcher$Holder height I +accessible field net/minecraft/network/syncher/EntityDataAccessor id I +mutable field net/minecraft/network/syncher/EntityDataAccessor id I +accessible field net/minecraft/world/level/block/state/BlockBehaviour$Properties isAir Z +accessible field net/minecraft/world/level/block/state/BlockBehaviour$Properties material Lnet/minecraft/world/level/material/Material; +accessible field net/minecraft/world/level/block/state/BlockBehaviour$Properties destroyTime F +accessible field net/minecraft/world/level/block/state/BlockBehaviour$Properties requiresCorrectToolForDrops Z +accessible field net/minecraft/world/level/block/state/BlockBehaviour$Properties canOcclude Z +accessible field net/minecraft/world/level/block/state/BlockBehaviour$Properties isRedstoneConductor Lnet/minecraft/world/level/block/state/BlockBehaviour$StatePredicate; +accessible field net/minecraft/world/level/block/state/BlockBehaviour$Properties isSuffocating Lnet/minecraft/world/level/block/state/BlockBehaviour$StatePredicate; +accessible field net/minecraft/world/level/block/state/BlockBehaviour$Properties isViewBlocking Lnet/minecraft/world/level/block/state/BlockBehaviour$StatePredicate; +accessible field net/minecraft/world/level/block/state/BlockBehaviour$Properties hasPostProcess Lnet/minecraft/world/level/block/state/BlockBehaviour$StatePredicate; +accessible field net/minecraft/world/level/block/state/BlockBehaviour$Properties emissiveRendering Lnet/minecraft/world/level/block/state/BlockBehaviour$StatePredicate; +accessible class net/minecraft/client/resources/model/ModelBakery$BlockStateDefinitionException +accessible field net/minecraft/network/syncher/SynchedEntityData itemsById Lit/unimi/dsi/fastutil/ints/Int2ObjectMap; +accessible field net/minecraft/network/syncher/SynchedEntityData ENTITY_ID_POOL Lit/unimi/dsi/fastutil/objects/Object2IntMap; +accessible field net/minecraft/network/syncher/SynchedEntityData lock Ljava/util/concurrent/locks/ReadWriteLock; +accessible method net/minecraft/Util makeExecutor (Ljava/lang/String;)Ljava/util/concurrent/ExecutorService; +accessible field net/minecraft/server/level/ChunkMap updatingChunkMap Lit/unimi/dsi/fastutil/longs/Long2ObjectLinkedOpenHashMap; +accessible field net/minecraft/server/level/ChunkMap visibleChunkMap Lit/unimi/dsi/fastutil/longs/Long2ObjectLinkedOpenHashMap; +accessible field net/minecraft/server/level/ChunkMap pendingUnloads Lit/unimi/dsi/fastutil/longs/Long2ObjectLinkedOpenHashMap; +accessible field net/minecraft/client/Minecraft reserve [B +accessible method net/minecraft/resources/ResourceKey (Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;)V +accessible method net/minecraft/client/renderer/texture/TextureAtlasSprite (Lnet/minecraft/client/renderer/texture/TextureAtlas;Lnet/minecraft/client/renderer/texture/TextureAtlasSprite$Info;IIIIILcom/mojang/blaze3d/platform/NativeImage;)V +accessible field net/minecraft/client/renderer/block/model/BlockModel GSON Lcom/google/gson/Gson; +accessible class net/minecraft/server/level/ChunkMap$DistanceManager +accessible method net/minecraft/client/gui/screens/worldselection/WorldGenSettingsComponent updateSettings (Lnet/minecraft/client/gui/screens/worldselection/WorldCreationContext;)V \ No newline at end of file diff --git a/src/main/resources/pack.mcmeta b/common/src/main/resources/pack.mcmeta similarity index 100% rename from src/main/resources/pack.mcmeta rename to common/src/main/resources/pack.mcmeta diff --git a/fabric/build.gradle b/fabric/build.gradle new file mode 100644 index 00000000..a4784f91 --- /dev/null +++ b/fabric/build.gradle @@ -0,0 +1,113 @@ +plugins { + id "com.github.johnrengelman.shadow" version "7.1.2" +} + +apply plugin: 'com.matthewprenger.cursegradle' +apply plugin: 'com.modrinth.minotaur' + +architectury { + platformSetupLoomIde() + fabric() +} + +loom { + accessWidenerPath = project(":common").loom.accessWidenerPath +} + +configurations { + common + shadowCommon // Don't use shadow from the shadow plugin since it *excludes* files. + compileClasspath.extendsFrom common + runtimeClasspath.extendsFrom common + developmentFabric.extendsFrom common + + modIncludeImplementation + + include.extendsFrom modIncludeImplementation + modImplementation.extendsFrom modIncludeImplementation +} + +dependencies { + modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" + modIncludeImplementation(fabricApi.module("fabric-lifecycle-events-v1", rootProject.fabric_api_version)) { exclude group: 'net.fabricmc', module: 'fabric-loader' } + modIncludeImplementation(fabricApi.module("fabric-screen-api-v1", rootProject.fabric_api_version)) { exclude group: 'net.fabricmc', module: 'fabric-loader' } + // Remove the next line if you don't want to depend on the API + // modApi "me.shedaniel:architectury-fabric:${rootProject.architectury_version}" + + common(project(path: ":common", configuration: "namedElements")) { transitive false } + shadowCommon(project(path: ":common", configuration: "transformProductionFabric")) { transitive false } +} + +processResources { + inputs.property "version", project.version + + filesMatching("fabric.mod.json") { + expand "version": project.version + } +} + +shadowJar { + exclude "architectury.common.json" + + configurations = [project.configurations.shadowCommon] + classifier "dev-shadow" +} + +remapJar { + injectAccessWidener = true + input.set shadowJar.archiveFile + dependsOn shadowJar + classifier null +} + +jar { + classifier "dev" +} + +components.java { + withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) { + skip() + } +} + +publishing { + publications { + mavenFabric(MavenPublication) { + artifactId = rootProject.archives_base_name + "-" + project.name + from components.java + } + } + + // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. + repositories { + // Add repositories to publish to here. + } +} + +curseforge { + if (System.getenv("CURSEFORGE_TOKEN") != null) { + apiKey = System.getenv("CURSEFORGE_TOKEN") + project { + id = "790626" + changelog = file('../CHANGELOG.md') + changelogType = "markdown" + releaseType = "release" + addGameVersion "Fabric" + addGameVersion minecraft_version + mainArtifact remapJar + } + } +} + +modrinth { + token = System.getenv("MODRINTH_TOKEN") + projectId = "modernfix" // This can be the project ID or the slug. Either will work! + versionType = "release" // This is the default -- can also be `beta` or `alpha` + uploadFile = remapJar + gameVersions = [minecraft_version] + loaders = ["fabric"] + changelog.set(provider { file("../CHANGELOG.md").getText('UTF-8') }) +} + +tasks.curseforge.dependsOn(rootProject.generateChangelog) +tasks.modrinth.dependsOn(rootProject.generateChangelog) \ No newline at end of file diff --git a/fabric/src/main/java/org/embeddedt/modernfix/ModernFixClientFabric.java b/fabric/src/main/java/org/embeddedt/modernfix/ModernFixClientFabric.java new file mode 100644 index 00000000..a73a29a2 --- /dev/null +++ b/fabric/src/main/java/org/embeddedt/modernfix/ModernFixClientFabric.java @@ -0,0 +1,21 @@ +package org.embeddedt.modernfix; + +import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; +import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; +import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; + +public class ModernFixClientFabric implements ClientModInitializer { + public static ModernFixClient commonMod; + + @Override + public void onInitializeClient() { + commonMod = new ModernFixClient(); + + ClientTickEvents.END_CLIENT_TICK.register((mc) -> commonMod.onRenderTickEnd()); + ScreenEvents.AFTER_INIT.register((client, screen, scaledWidth, scaledHeight) -> commonMod.onScreenOpening(screen)); + ServerLifecycleEvents.SERVER_STARTED.register(server -> { + commonMod.onServerStarted(server); + }); + } +} diff --git a/fabric/src/main/java/org/embeddedt/modernfix/ModernFixFabric.java b/fabric/src/main/java/org/embeddedt/modernfix/ModernFixFabric.java new file mode 100644 index 00000000..10be5040 --- /dev/null +++ b/fabric/src/main/java/org/embeddedt/modernfix/ModernFixFabric.java @@ -0,0 +1,29 @@ +package org.embeddedt.modernfix; + +import net.fabricmc.api.ModInitializer; +import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; +import net.minecraft.server.MinecraftServer; + +public class ModernFixFabric implements ModInitializer { + private ModernFix commonMod; + public static MinecraftServer theServer; + @Override + public void onInitialize() { + commonMod = new ModernFix(); + + ServerLifecycleEvents.SERVER_STARTING.register(server -> { + theServer = server; + }); + ServerLifecycleEvents.SERVER_STARTED.register(server -> { + commonMod.onServerStarted(); + }); + ServerLifecycleEvents.SERVER_STOPPED.register(server -> { + commonMod.onServerDead(server); + theServer = null; + }); + + // TODO: implement entity ID desync + } + + +} diff --git a/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/core/ClientPlayNetHandlerMixin.java b/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/core/ClientPlayNetHandlerMixin.java new file mode 100644 index 00000000..cd825dcf --- /dev/null +++ b/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/core/ClientPlayNetHandlerMixin.java @@ -0,0 +1,21 @@ +package org.embeddedt.modernfix.fabric.mixin.core; + +import net.minecraft.client.multiplayer.ClientPacketListener; +import org.embeddedt.modernfix.ModernFixClientFabric; +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(value = ClientPacketListener.class, priority = 1500) +public class ClientPlayNetHandlerMixin { + @Inject(method = "handleUpdateRecipes", at = @At("RETURN")) + private void signalRecipes(CallbackInfo ci) { + ModernFixClientFabric.commonMod.onRecipesUpdated(); + } + + @Inject(method = "handleUpdateTags", at = @At("RETURN")) + private void signalTags(CallbackInfo ci) { + ModernFixClientFabric.commonMod.onTagsUpdated(); + } +} diff --git a/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/feature/branding/GuiMixin.java b/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/feature/branding/GuiMixin.java new file mode 100644 index 00000000..61264955 --- /dev/null +++ b/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/feature/branding/GuiMixin.java @@ -0,0 +1,18 @@ +package org.embeddedt.modernfix.fabric.mixin.feature.branding; + +import net.minecraft.client.gui.components.DebugScreenOverlay; +import org.embeddedt.modernfix.ModernFixClientFabric; +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.List; + +@Mixin(DebugScreenOverlay.class) +public class GuiMixin { + @Inject(method = "getGameInformation", at = @At("RETURN")) + private void addModernFix(CallbackInfoReturnable> cir) { + cir.getReturnValue().add(ModernFixClientFabric.commonMod.brandingString); + } +} diff --git a/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/feature/measure_time/MinecraftMixin_Fabric.java b/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/feature/measure_time/MinecraftMixin_Fabric.java new file mode 100644 index 00000000..caf6bf49 --- /dev/null +++ b/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/feature/measure_time/MinecraftMixin_Fabric.java @@ -0,0 +1,18 @@ +package org.embeddedt.modernfix.fabric.mixin.feature.measure_time; + +import net.minecraft.client.Minecraft; +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(Minecraft.class) +@ClientOnlyMixin +public class MinecraftMixin_Fabric { + @Inject(method = "doLoadLevel", at = @At("HEAD")) + private void recordWorldLoadStart(CallbackInfo ci) { + ModernFixClient.worldLoadStartTime = System.nanoTime(); + } +} diff --git a/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/ModelBakeryMixin.java b/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/ModelBakeryMixin.java new file mode 100644 index 00000000..24ef19c5 --- /dev/null +++ b/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/ModelBakeryMixin.java @@ -0,0 +1,331 @@ +package org.embeddedt.modernfix.fabric.mixin.perf.dynamic_resources; + +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.RemovalNotification; +import com.google.common.collect.ImmutableList; +import com.google.gson.JsonElement; +import com.mojang.math.Transformation; +import net.minecraft.client.renderer.block.model.BlockModel; +import net.minecraft.client.renderer.block.model.ItemModelGenerator; +import net.minecraft.client.renderer.texture.AtlasSet; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.renderer.texture.TextureManager; +import net.minecraft.client.resources.ClientPackSource; +import net.minecraft.client.resources.model.*; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.FilePackResources; +import net.minecraft.server.packs.FolderPackResources; +import net.minecraft.server.packs.PackResources; +import net.minecraft.server.packs.VanillaPackResources; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.util.profiling.ProfilerFiller; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.Property; +import org.apache.commons.lang3.tuple.Triple; +import org.embeddedt.modernfix.ModernFix; +import org.embeddedt.modernfix.annotation.ClientOnlyMixin; +import org.embeddedt.modernfix.duck.IExtendedModelBakery; +import org.embeddedt.modernfix.dynamicresources.DynamicBakedModelProvider; +import org.embeddedt.modernfix.dynamicresources.ModelBakeryHelpers; +import org.jetbrains.annotations.Nullable; +import org.slf4j.Logger; +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.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.io.IOException; +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.function.BiConsumer; +import java.util.function.Function; + +/* high priority so that our injectors are added before other mods' */ +@Mixin(value = ModelBakery.class, priority = 600) +@ClientOnlyMixin +public abstract class ModelBakeryMixin implements IExtendedModelBakery { + + private static final boolean debugDynamicModelLoading = Boolean.getBoolean("modernfix.debugDynamicModelLoading"); + + @Shadow @Final @Mutable public Map unbakedCache; + + @Shadow @Final public static ModelResourceLocation MISSING_MODEL_LOCATION; + + @Shadow protected abstract BlockModel loadBlockModel(ResourceLocation location) throws IOException; + + @Shadow @Final protected ResourceManager resourceManager; + @Shadow private AtlasSet atlasSet; + @Shadow @Final private Set loadingStack; + + @Shadow protected abstract void loadModel(ResourceLocation blockstateLocation) throws Exception; + + @Shadow @Final private static Logger LOGGER; + + @Shadow @Final @Mutable + private Map bakedTopLevelModels; + + @Shadow @Final @Mutable private Map, BakedModel> bakedCache; + + @Shadow @Final public static BlockModel GENERATION_MARKER; + + @Shadow @Final private static ItemModelGenerator ITEM_MODEL_GENERATOR; + + @Shadow public abstract UnbakedModel getModel(ResourceLocation modelLocation); + + @Shadow @Nullable public abstract BakedModel bake(ResourceLocation location, ModelState transform); + + private Cache, BakedModel> loadedBakedModels; + private Cache loadedModels; + + private HashMap smallLoadingCache = new HashMap<>(); + + @Redirect(method = "", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/profiling/ProfilerFiller;push(Ljava/lang/String;)V", ordinal = 0)) + private void replaceTopLevelBakedModels(ProfilerFiller filler, String s) { + this.loadedBakedModels = CacheBuilder.newBuilder() + .expireAfterAccess(3, TimeUnit.MINUTES) + .maximumSize(1000) + .concurrencyLevel(8) + .removalListener(this::onModelRemoved) + .softValues() + .build(); + this.loadedModels = CacheBuilder.newBuilder() + .expireAfterAccess(3, TimeUnit.MINUTES) + .maximumSize(1000) + .concurrencyLevel(8) + .removalListener(this::onModelRemoved) + .softValues() + .build(); + this.bakedCache = loadedBakedModels.asMap(); + this.unbakedCache = loadedModels.asMap(); + this.bakedTopLevelModels = new DynamicBakedModelProvider((ModelBakery)(Object)this, bakedCache); + filler.push(s); + } + + private void onModelRemoved(RemovalNotification notification) { + if(!debugDynamicModelLoading) + return; + Object k = notification.getKey(); + if(k == null) + return; + ResourceLocation rl; + boolean baked = false; + if(k instanceof ResourceLocation) { + rl = (ResourceLocation)k; + } else { + rl = ((Triple)k).getLeft(); + baked = true; + } + ModernFix.LOGGER.warn("Evicted {} model {}", baked ? "baked" : "unbaked", rl); + } + + private UnbakedModel missingModel; + + private Set blockStateFiles; + private Set modelFiles; + + @Redirect(method = "", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/resources/model/ModelBakery;loadBlockModel(Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/client/renderer/block/model/BlockModel;", ordinal = 0)) + private BlockModel captureMissingModel(ModelBakery bakery, ResourceLocation location) throws IOException { + this.missingModel = this.loadBlockModel(location); + this.blockStateFiles = new HashSet<>(); + this.modelFiles = new HashSet<>(); + return (BlockModel)this.missingModel; + } + + /** + * @author embeddedt + * @reason don't actually load the model. instead, keep track of if we need to load a blockstate or a model, + * and save the info into the two lists + */ + @Inject(method = "loadTopLevel", at = @At("HEAD"), cancellable = true) + private void addTopLevelFile(ModelResourceLocation location, CallbackInfo ci) { + ci.cancel(); + if(Objects.equals(location.getVariant(), "inventory")) { + modelFiles.add(new ResourceLocation(location.getNamespace(), "item/" + location.getPath())); + } else { + blockStateFiles.add(new ResourceLocation(location.getNamespace(), location.getPath())); + } + } + + @Redirect(method = "", at = @At(value = "INVOKE", target = "Ljava/util/Set;addAll(Ljava/util/Collection;)Z", ordinal = 0)) + private boolean gatherModelTextures(Set materialSet, Collection collection) { + materialSet.addAll(collection); + gatherModelMaterials(materialSet); + return true; + } + + @Redirect(method = "", at = @At(value = "INVOKE", target = "Ljava/util/Map;forEach(Ljava/util/function/BiConsumer;)V", ordinal = 0)) + private void fetchStaticDefinitions(Map> map, BiConsumer> func) { + map.forEach((loc, def) -> blockStateFiles.add(loc)); + } + + @Redirect(method = "", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/state/StateDefinition;getPossibleStates()Lcom/google/common/collect/ImmutableList;", ordinal = 0)) + private ImmutableList fetchBlocks(StateDefinition def) { + blockStateFiles.add(Registry.BLOCK.getKey(def.any().getBlock())); + return ImmutableList.of(); + } + + private boolean trustedResourcePack(PackResources pack) { + return pack instanceof VanillaPackResources || + pack instanceof ClientPackSource || + pack instanceof FolderPackResources || + pack instanceof FilePackResources; + } + + /** + * Load all blockstate JSONs and model files, collect textures. + */ + private void gatherModelMaterials(Set materialSet) { + Function modelDeserializer = model -> BlockModel.GSON.fromJson(model, BlockModel.class); + ModelBakeryHelpers.gatherModelMaterials(this.resourceManager, this::trustedResourcePack, materialSet, blockStateFiles, + modelFiles, missingModel, modelDeserializer, this::getModel); + loadedModels.invalidateAll(); + loadedModels.put(MISSING_MODEL_LOCATION, missingModel); + } + + @Inject(method = "uploadTextures", at = @At(value = "FIELD", target = "Lnet/minecraft/client/resources/model/ModelBakery;topLevelModels:Ljava/util/Map;", ordinal = 0), cancellable = true) + private void skipBake(TextureManager resourceManager, ProfilerFiller profiler, CallbackInfoReturnable cir) { + profiler.pop(); + // ensure missing model is a permanent override + this.bakedTopLevelModels.put(MISSING_MODEL_LOCATION, this.bake(MISSING_MODEL_LOCATION, BlockModelRotation.X0_Y0)); + cir.setReturnValue(atlasSet); + } + + /** + * Use the already loaded missing model instead of the cache entry (which will probably get evicted). + */ + @Redirect(method = "loadModel", at = @At(value = "INVOKE", target = "Ljava/util/Map;get(Ljava/lang/Object;)Ljava/lang/Object;", ordinal = 1)) + private Object getMissingModel(Map map, Object rl) { + if(rl == MISSING_MODEL_LOCATION && map == unbakedCache) + return missingModel; + return unbakedCache.get(rl); + } + + @Inject(method = "cacheAndQueueDependencies", at = @At("RETURN")) + private void addToSmallLoadingCache(ResourceLocation location, UnbakedModel model, CallbackInfo ci) { + smallLoadingCache.put(location, model); + } + + + /** + * @author embeddedt + * @reason synchronize + */ + @Inject(method = "getModel", at = @At("HEAD"), cancellable = true) + public void getOrLoadModelDynamic(ResourceLocation modelLocation, CallbackInfoReturnable cir) { + if(modelLocation.equals(MISSING_MODEL_LOCATION)) { + cir.setReturnValue(missingModel); + return; + } + UnbakedModel existing = this.unbakedCache.get(modelLocation); + if (existing != null) { + cir.setReturnValue(existing); + } else { + synchronized(this) { + if (this.loadingStack.contains(modelLocation)) { + throw new IllegalStateException("Circular reference while loading " + modelLocation); + } else { + this.loadingStack.add(modelLocation); + UnbakedModel iunbakedmodel = missingModel; + + while(!this.loadingStack.isEmpty()) { + ResourceLocation resourcelocation = this.loadingStack.iterator().next(); + + try { + existing = this.unbakedCache.get(resourcelocation); + if (existing == null) { + if(debugDynamicModelLoading) + LOGGER.info("Loading {}", resourcelocation); + this.loadModel(resourcelocation); + } else + smallLoadingCache.put(resourcelocation, existing); + } catch (ModelBakery.BlockStateDefinitionException var9) { + LOGGER.warn(var9.getMessage()); + this.unbakedCache.put(resourcelocation, iunbakedmodel); + smallLoadingCache.put(resourcelocation, iunbakedmodel); + } catch (Exception var10) { + LOGGER.warn("Unable to load model: '{}' referenced from: {}: {}", resourcelocation, modelLocation, var10); + this.unbakedCache.put(resourcelocation, iunbakedmodel); + smallLoadingCache.put(resourcelocation, iunbakedmodel); + } finally { + this.loadingStack.remove(resourcelocation); + } + } + + // We have to get the result from the temporary cache used for a model load + // As in pathological cases (e.g. Pedestals on 1.19) unbakedCache can lose + // the model immediately + UnbakedModel result = smallLoadingCache.getOrDefault(modelLocation, iunbakedmodel); + // We are done with loading, so clear this cache to allow GC of any unneeded models + smallLoadingCache.clear(); + cir.setReturnValue(result); + } + } + } + } + + private , V extends T> BlockState setPropertyGeneric(BlockState state, Property prop, Object o) { + return state.setValue(prop, (V)o); + } + @Redirect(method = "loadModel", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/state/StateDefinition;getPossibleStates()Lcom/google/common/collect/ImmutableList;")) + private ImmutableList loadOnlyRelevantBlockState(StateDefinition stateDefinition, ResourceLocation location) { + return ModelBakeryHelpers.getBlockStatesForMRL(stateDefinition, (ModelResourceLocation)location); + } + + @Override + public ImmutableList getBlockStatesForMRL(StateDefinition stateDefinition, ModelResourceLocation location) { + return loadOnlyRelevantBlockState(stateDefinition, location); + } + + private BakedModel bakedMissingModel = null; + + @Inject(method = "bake", at = @At("HEAD"), cancellable = true) + public void getOrLoadBakedModelDynamic(ResourceLocation arg, ModelState arg2, CallbackInfoReturnable cir) { + Function textureGetter = mat -> this.atlasSet.getSprite(mat); + Triple triple = Triple.of(arg, arg2.getRotation(), arg2.isUvLocked()); + BakedModel existing = this.bakedCache.get(triple); + if (existing != null) { + cir.setReturnValue(existing); + } else if (this.atlasSet == null) { + throw new IllegalStateException("bake called too early"); + } else { + synchronized (this) { + if(debugDynamicModelLoading) + LOGGER.info("Baking {}", arg); + UnbakedModel iunbakedmodel = this.getModel(arg); + iunbakedmodel.getMaterials(this::getModel, new HashSet<>()); + if(iunbakedmodel == missingModel && debugDynamicModelLoading) + LOGGER.warn("Model {} not present", arg); + BakedModel ibakedmodel = null; + if (iunbakedmodel instanceof BlockModel) { + BlockModel blockmodel = (BlockModel)iunbakedmodel; + if (blockmodel.getRootModel() == GENERATION_MARKER) { + ibakedmodel = ITEM_MODEL_GENERATOR.generateBlockModel(textureGetter, blockmodel).bake((ModelBakery)(Object)this, blockmodel, this.atlasSet::getSprite, arg2, arg, false); + } + } + if(ibakedmodel == null) { + if(iunbakedmodel == missingModel) { + // use a shared baked missing model + if(bakedMissingModel == null) { + bakedMissingModel = iunbakedmodel.bake((ModelBakery) (Object) this, textureGetter, arg2, arg); + ((DynamicBakedModelProvider)this.bakedTopLevelModels).setMissingModel(bakedMissingModel); + } + ibakedmodel = bakedMissingModel; + } else + ibakedmodel = iunbakedmodel.bake((ModelBakery) (Object) this, textureGetter, arg2, arg); + } + // TODO event + this.bakedCache.put(triple, ibakedmodel); + cir.setReturnValue(ibakedmodel); + } + } + } +} diff --git a/fabric/src/main/java/org/embeddedt/modernfix/platform/fabric/ModernFixPlatformHooksImpl.java b/fabric/src/main/java/org/embeddedt/modernfix/platform/fabric/ModernFixPlatformHooksImpl.java new file mode 100644 index 00000000..cf174819 --- /dev/null +++ b/fabric/src/main/java/org/embeddedt/modernfix/platform/fabric/ModernFixPlatformHooksImpl.java @@ -0,0 +1,77 @@ +package org.embeddedt.modernfix.platform.fabric; + +import com.mojang.blaze3d.platform.NativeImage; +import net.fabricmc.api.EnvType; +import net.fabricmc.loader.api.FabricLoader; +import net.fabricmc.loader.api.ModContainer; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.packs.resources.Resource; +import net.minecraft.server.packs.resources.ResourceManager; +import org.embeddedt.modernfix.ModernFixFabric; +import org.objectweb.asm.tree.*; + +import java.nio.file.Path; +import java.util.*; + +public class ModernFixPlatformHooksImpl { + public static boolean isClient() { + return FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT; + } + + public static boolean isDedicatedServer() { + return FabricLoader.getInstance().getEnvironmentType() == EnvType.SERVER; + } + + private static String verString; + + public static String getVersionString() { + if(verString == null) { + ModContainer mfModContainer = FabricLoader.getInstance().getModContainer("modernfix").get(); + verString = mfModContainer.getMetadata().getVersion().getFriendlyString(); + } + return verString; + } + + public static boolean modPresent(String modId) { + return FabricLoader.getInstance().getModContainer(modId).isPresent(); + } + + public static boolean isDevEnv() { + return FabricLoader.getInstance().isDevelopmentEnvironment(); + } + + public static MinecraftServer getCurrentServer() { + return ModernFixFabric.theServer; + } + + public static boolean isLoadingNormally() { + return true; + } + + public static TextureAtlasSprite loadTextureAtlasSprite(TextureAtlas atlasTexture, + ResourceManager resourceManager, TextureAtlasSprite.Info textureInfo, + Resource resource, + int atlasWidth, int atlasHeight, + int spriteX, int spriteY, int mipmapLevel, + NativeImage image) { + return new TextureAtlasSprite(atlasTexture, textureInfo, mipmapLevel, atlasWidth, atlasHeight, spriteX, spriteY, image); + } + + public static Path getGameDirectory() { + return FabricLoader.getInstance().getGameDir(); + } + + public static void sendPacket(ServerPlayer player, Object packet) { + //PacketHandler.INSTANCE.send(PacketDistributor.PLAYER.with(() -> player), packet); + } + + public static void injectPlatformSpecificHacks() { + } + + public static void applyASMTransformers(String mixinClassName, ClassNode targetClass) { + + } +} diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json new file mode 100644 index 00000000..79f1703f --- /dev/null +++ b/fabric/src/main/resources/fabric.mod.json @@ -0,0 +1,30 @@ +{ + "schemaVersion": 1, + "id": "modernfix", + "version": "${version}", + "name": "ModernFix", + "description": "Optimization mod", + "authors": [ + "embeddedt" + ], + "contact": { + }, + "license": "LGPL-3.0", + "icon": "assets/modernfix/icon.png", + "environment": "*", + "entrypoints": { + "main": [ + "org.embeddedt.modernfix.ModernFixFabric" + ], + "client": [ + "org.embeddedt.modernfix.ModernFixClientFabric" + ] + }, + "mixins": [ + "modernfix-fabric.mixins.json", + "modernfix-common.mixins.json" + ], + "depends": { + "minecraft": ">=1.16.5" + } +} \ No newline at end of file diff --git a/fabric/src/main/resources/modernfix-fabric.mixins.json b/fabric/src/main/resources/modernfix-fabric.mixins.json new file mode 100644 index 00000000..c6246634 --- /dev/null +++ b/fabric/src/main/resources/modernfix-fabric.mixins.json @@ -0,0 +1,13 @@ +{ + "required": true, + "package": "org.embeddedt.modernfix.fabric.mixin", + "plugin": "org.embeddedt.modernfix.core.ModernFixMixinPlugin", + "compatibilityLevel": "JAVA_8", + "minVersion": "0.8", + "mixins": [ +${mixin_classes} + ], + "injectors": { + "defaultRequire": 1 + } +} \ No newline at end of file diff --git a/forge/build.gradle b/forge/build.gradle new file mode 100644 index 00000000..2e84454c --- /dev/null +++ b/forge/build.gradle @@ -0,0 +1,144 @@ +plugins { + id "com.github.johnrengelman.shadow" version "7.1.2" +} + +apply plugin: 'com.matthewprenger.cursegradle' +apply plugin: 'com.modrinth.minotaur' + +architectury { + platformSetupLoomIde() + forge() +} + +loom { + accessWidenerPath = project(":common").loom.accessWidenerPath + + forge { + convertAccessWideners = true + extraAccessWideners.add loom.accessWidenerPath.get().asFile.name + + mixinConfig "modernfix-common.mixins.json" + mixinConfig "modernfix-forge.mixins.json" + } + mixin.defaultRefmapName = "modernfix.refmap.json" +} + +configurations { + common + shadowCommon // Don't use shadow from the shadow plugin since it *excludes* files. + compileClasspath.extendsFrom common + runtimeClasspath.extendsFrom common + developmentForge.extendsFrom common +} + +dependencies { + forge "net.minecraftforge:forge:${rootProject.forge_version}" + // Remove the next line if you don't want to depend on the API + // modApi "me.shedaniel:architectury-forge:${rootProject.architectury_version}" + + modCompileOnly("curse.maven:refinedstorage-243076:${refined_storage_version}") + + // compile against the JEI API but do not include it at runtime + modCompileOnly("mezz.jei:jei-${minecraft_version}-forge:${jei_version}") + + modCompileOnly("mezz.jei:jei-${minecraft_version}-forge:${jei_version}") + + modCompileOnly("curse.maven:jeresources-240630:3951643") + modCompileOnly "me.shedaniel:RoughlyEnoughItems-forge:${rei_version}" + modCompileOnly("dev.latvian.mods:kubejs-forge:${kubejs_version}") + modRuntimeOnly("curse.maven:ferritecore-429235:4117906") + modCompileOnly("team.chisel.ctm:CTM:${ctm_version}") + + modCompileOnly("curse.maven:supermartijncore-454372:4455391") + modCompileOnly("appeng:appliedenergistics2-forge:12.9.4") + modCompileOnly("vazkii.patchouli:Patchouli:1.19.2-77") + + common(project(path: ":common", configuration: "namedElements")) { transitive false } + shadowCommon(project(path: ":common", configuration: "transformProductionForge")) { transitive = false } +} + +processResources { + inputs.property "version", project.version + + filesMatching("META-INF/mods.toml") { + expand "version": project.version + } +} + +shadowJar { + exclude "fabric.mod.json" + exclude "architectury.common.json" + + configurations = [project.configurations.shadowCommon] + classifier "dev-shadow" +} + +remapJar { + input.set shadowJar.archiveFile + dependsOn shadowJar + classifier null +} + +jar { + classifier "dev" + manifest { + attributes([ + "Specification-Title" : "modernfix", + "Operative-Class" : "org.embeddedt.modernfix.agent.Agent", + //"Specification-Vendor": "modernfix authors", + "Specification-Version" : "1", // We are version 1 of ourselves + "Implementation-Title" : project.name, + "Implementation-Version" : project.jar.archiveVersion, + //"Implementation-Vendor": "modernfix authors", + "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") + ]) + } +} + +components.java { + withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) { + skip() + } +} + +publishing { + publications { + mavenForge(MavenPublication) { + artifactId = rootProject.archives_base_name + "-" + project.name + from components.java + } + } + + // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. + repositories { + // Add repositories to publish to here. + } +} + +curseforge { + if (System.getenv("CURSEFORGE_TOKEN") != null) { + apiKey = System.getenv("CURSEFORGE_TOKEN") + project { + id = "790626" + changelog = file('../CHANGELOG.md') + changelogType = "markdown" + releaseType = "release" + addGameVersion "Forge" + addGameVersion minecraft_version + mainArtifact remapJar + } + } +} + +modrinth { + token = System.getenv("MODRINTH_TOKEN") + projectId = "modernfix" // This can be the project ID or the slug. Either will work! + versionType = "release" // This is the default -- can also be `beta` or `alpha` + uploadFile = remapJar + gameVersions = [minecraft_version] + loaders = ["forge"] + changelog.set(provider { file("../CHANGELOG.md").getText('UTF-8') }) +} + +tasks.curseforge.dependsOn(rootProject.generateChangelog) +tasks.modrinth.dependsOn(rootProject.generateChangelog) diff --git a/forge/gradle.properties b/forge/gradle.properties new file mode 100644 index 00000000..32f842a6 --- /dev/null +++ b/forge/gradle.properties @@ -0,0 +1 @@ +loom.platform=forge \ No newline at end of file diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/ModernFixConfig.java b/forge/src/main/java/org/embeddedt/modernfix/forge/ModernFixConfig.java new file mode 100644 index 00000000..268344a9 --- /dev/null +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/ModernFixConfig.java @@ -0,0 +1,39 @@ +package org.embeddedt.modernfix.forge; + +import com.google.common.collect.ImmutableList; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.common.ForgeConfigSpec; + +import java.util.List; +import java.util.Set; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +public class ModernFixConfig { + private static final ForgeConfigSpec.Builder COMMON_BUILDER = new ForgeConfigSpec.Builder(); + public static ForgeConfigSpec COMMON_CONFIG; + + public static ForgeConfigSpec.ConfigValue> BLACKLIST_ASYNC_JEI_PLUGINS; + + private static Set jeiPluginBlacklist; + + static { + Predicate locationValidator = o -> o instanceof String && ((String)o).contains(":"); + BLACKLIST_ASYNC_JEI_PLUGINS = COMMON_BUILDER + .comment("These JEI plugins will be loaded on the main thread") + .defineList("blacklist_async_jei_plugins", ImmutableList.of( + "jepb:jei_plugin" + ), locationValidator); + } + + static { + COMMON_CONFIG = COMMON_BUILDER.build(); + } + + public static Set getJeiPluginBlacklist() { + if(jeiPluginBlacklist == null) { + jeiPluginBlacklist = BLACKLIST_ASYNC_JEI_PLUGINS.get().stream().map(ResourceLocation::new).collect(Collectors.toSet()); + } + return jeiPluginBlacklist; + } +} diff --git a/src/main/java/org/embeddedt/modernfix/classloading/FastAccessTransformerList.java b/forge/src/main/java/org/embeddedt/modernfix/forge/classloading/FastAccessTransformerList.java similarity index 98% rename from src/main/java/org/embeddedt/modernfix/classloading/FastAccessTransformerList.java rename to forge/src/main/java/org/embeddedt/modernfix/forge/classloading/FastAccessTransformerList.java index 8fff0638..420f12e7 100644 --- a/src/main/java/org/embeddedt/modernfix/classloading/FastAccessTransformerList.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/classloading/FastAccessTransformerList.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.classloading; +package org.embeddedt.modernfix.forge.classloading; import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; import net.minecraftforge.accesstransformer.AccessTransformer; diff --git a/src/main/java/org/embeddedt/modernfix/classloading/ModFileScanDataDeduplicator.java b/forge/src/main/java/org/embeddedt/modernfix/forge/classloading/ModFileScanDataDeduplicator.java similarity index 98% rename from src/main/java/org/embeddedt/modernfix/classloading/ModFileScanDataDeduplicator.java rename to forge/src/main/java/org/embeddedt/modernfix/forge/classloading/ModFileScanDataDeduplicator.java index 5ea71cb7..61f0ad81 100644 --- a/src/main/java/org/embeddedt/modernfix/classloading/ModFileScanDataDeduplicator.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/classloading/ModFileScanDataDeduplicator.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.classloading; +package org.embeddedt.modernfix.forge.classloading; import com.google.common.collect.Interner; import com.google.common.collect.Interners; diff --git a/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicModelBakeEvent.java b/forge/src/main/java/org/embeddedt/modernfix/forge/dynamicresources/DynamicModelBakeEvent.java similarity index 93% rename from src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicModelBakeEvent.java rename to forge/src/main/java/org/embeddedt/modernfix/forge/dynamicresources/DynamicModelBakeEvent.java index 96f67954..01f6679e 100644 --- a/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicModelBakeEvent.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/dynamicresources/DynamicModelBakeEvent.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.dynamicresources; +package org.embeddedt.modernfix.forge.dynamicresources; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.client.resources.model.ModelBakery; @@ -6,7 +6,6 @@ import net.minecraft.client.resources.model.ModelManager; import net.minecraft.client.resources.model.UnbakedModel; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.eventbus.api.Event; -import net.minecraftforge.fml.event.IModBusEvent; /** * Fired when a model is baked dynamically. Intended to be used as a replacement for ModelBakeEvent diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/init/ModernFixClientForge.java b/forge/src/main/java/org/embeddedt/modernfix/forge/init/ModernFixClientForge.java new file mode 100644 index 00000000..9c93e505 --- /dev/null +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/init/ModernFixClientForge.java @@ -0,0 +1,99 @@ +package org.embeddedt.modernfix.forge.init; + +import com.mojang.blaze3d.platform.InputConstants; +import net.minecraft.client.KeyMapping; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.components.DebugScreenOverlay; +import net.minecraftforge.client.ConfigScreenHandler; +import net.minecraftforge.client.event.CustomizeGuiOverlayEvent; +import net.minecraftforge.client.event.RecipesUpdatedEvent; +import net.minecraftforge.client.event.RegisterKeyMappingsEvent; +import net.minecraftforge.client.event.ScreenEvent; +import net.minecraftforge.client.gui.overlay.ForgeGui; +import net.minecraftforge.client.settings.KeyConflictContext; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.TagsUpdatedEvent; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.event.level.LevelEvent; +import net.minecraftforge.event.server.ServerStartedEvent; +import net.minecraftforge.eventbus.api.EventPriority; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.ModLoadingContext; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.util.ObfuscationReflectionHelper; +import org.embeddedt.modernfix.ModernFixClient; +import org.embeddedt.modernfix.screen.ModernFixConfigScreen; + +public class ModernFixClientForge { + private static ModernFixClient commonMod; + + public ModernFixClientForge() { + commonMod = new ModernFixClient(); + FMLJavaModLoadingContext.get().getModEventBus().addListener(this::keyBindRegister); + ModLoadingContext.get().registerExtensionPoint( + ConfigScreenHandler.ConfigScreenFactory.class, + () -> new ConfigScreenHandler.ConfigScreenFactory((mc, screen) -> new ModernFixConfigScreen(screen)) + ); + } + + private KeyMapping configKey; + + private void keyBindRegister(RegisterKeyMappingsEvent event) { + configKey = new KeyMapping("key.modernfix.config", KeyConflictContext.UNIVERSAL, InputConstants.UNKNOWN, "key.modernfix"); + event.register(configKey); + } + + @SubscribeEvent + public void onConfigKey(TickEvent.ClientTickEvent event) { + if(event.phase == TickEvent.Phase.START && configKey.consumeClick()) { + Minecraft.getInstance().setScreen(new ModernFixConfigScreen(Minecraft.getInstance().screen)); + } + } + + @SubscribeEvent(priority = EventPriority.HIGHEST) + public void onRenderOverlay(CustomizeGuiOverlayEvent.DebugText event) { + if(commonMod.brandingString != null && Minecraft.getInstance().options.renderDebug) { + event.getLeft().add(""); + event.getLeft().add(commonMod.brandingString); + } + } + + @SubscribeEvent + public void onDisconnect(LevelEvent.Unload event) { + if(event.getLevel().isClientSide()) { + DebugScreenOverlay overlay = ObfuscationReflectionHelper.getPrivateValue(ForgeGui.class, (ForgeGui)Minecraft.getInstance().gui, "debugOverlay"); + if(overlay != null) { + Minecraft.getInstance().tell(overlay::clearChunkCache); + } + } + } + + @SubscribeEvent + public void onServerStarting(ServerStartedEvent event) { + commonMod.onServerStarted(event.getServer()); + } + + @SubscribeEvent(priority = EventPriority.LOWEST) + public void onRenderTickEnd(TickEvent.RenderTickEvent event) { + if(event.phase == TickEvent.Phase.END) + commonMod.onRenderTickEnd(); + } + + @SubscribeEvent(priority = EventPriority.LOWEST) + public void onRecipes(RecipesUpdatedEvent e) { + commonMod.onRecipesUpdated(); + } + + @SubscribeEvent(priority = EventPriority.LOWEST) + public void onTags(TagsUpdatedEvent e) { + commonMod.onTagsUpdated(); + } + + @SubscribeEvent(priority = EventPriority.LOWEST) + public void onScreen(ScreenEvent.Init.Pre event) { + if(event.isCanceled()) + return; + commonMod.onScreenOpening(event.getScreen()); + } +} 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 new file mode 100644 index 00000000..b5544d8e --- /dev/null +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/init/ModernFixForge.java @@ -0,0 +1,102 @@ +package org.embeddedt.modernfix.forge.init; + +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.server.ServerStartedEvent; +import net.minecraftforge.event.server.ServerStoppedEvent; +import net.minecraftforge.eventbus.api.EventPriority; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.*; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.config.ModConfig; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.fml.event.lifecycle.FMLLoadCompleteEvent; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.loading.FMLConfig; +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.embeddedt.modernfix.ModernFix; +import org.embeddedt.modernfix.ModernFixClient; +import org.embeddedt.modernfix.forge.classloading.ModFileScanDataDeduplicator; +import org.embeddedt.modernfix.forge.ModernFixConfig; +import org.embeddedt.modernfix.entity.EntityDataIDSyncHandler; +import org.embeddedt.modernfix.forge.packet.PacketHandler; +import org.embeddedt.modernfix.forge.registry.ObjectHolderClearer; + +@Mod(ModernFix.MODID) +public class ModernFixForge { + private static ModernFix commonMod; + + public ModernFixForge() { + commonMod = new ModernFix(); + // Register ourselves for server and other game events we are interested in + MinecraftForge.EVENT_BUS.register(this); + FMLJavaModLoadingContext.get().getModEventBus().addListener(this::commonSetup); + FMLJavaModLoadingContext.get().getModEventBus().addListener(this::onLoadComplete); + FMLJavaModLoadingContext.get().getModEventBus().addListener(this::registerItems); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> MinecraftForge.EVENT_BUS.register(new ModernFixClientForge())); + ModLoadingContext.get().registerExtensionPoint(IExtensionPoint.DisplayTest.class, () -> new IExtensionPoint.DisplayTest(() -> NetworkConstants.IGNORESERVERONLY, (a, b) -> true)); + ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, ModernFixConfig.COMMON_CONFIG); + PacketHandler.register(); + ModFileScanDataDeduplicator.deduplicate(); + } + + @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 -> { + Item.Properties props = new Item.Properties(); + for(int i = 0; i < 1000000; i++) { + helper.register(new ResourceLocation("modernfix", "item_" + i), new Item(props)); + } + }); + } + } + + private static boolean dfuModPresent() { + if(FMLConfig.isOptimizedDFUDisabled()) + return true; + for(String modId : new String[] { "lazydfu", "datafixerslayer" }) { + if(ModList.get().isLoaded(modId)) + return true; + } + return !FMLLoader.isProduction(); + } + + @SubscribeEvent + public void commonSetup(FMLCommonSetupEvent event) { + if(!dfuModPresent()) { + event.enqueueWork(() -> { + ModLoader.get().addWarning(new ModLoadingWarning(ModLoadingContext.get().getActiveContainer().getModInfo(), ModLoadingStage.COMMON_SETUP, "modernfix.no_lazydfu")); + }); + } + ObjectHolderClearer.clearThrowables(); + } + @SubscribeEvent(priority = EventPriority.LOWEST) + public void onServerDead(ServerStoppedEvent event) { + commonMod.onServerDead(event.getServer()); + } + @SubscribeEvent(priority = EventPriority.LOWEST) + public void onLoadComplete(FMLLoadCompleteEvent event) { + commonMod.onLoadComplete(); + } + @SubscribeEvent(priority = EventPriority.LOWEST) + public void onServerStarted(ServerStartedEvent event) { + commonMod.onServerStarted(); + } +} diff --git a/src/main/java/org/embeddedt/modernfix/load/ModWorkManagerQueue.java b/forge/src/main/java/org/embeddedt/modernfix/forge/load/ModWorkManagerQueue.java similarity index 94% rename from src/main/java/org/embeddedt/modernfix/load/ModWorkManagerQueue.java rename to forge/src/main/java/org/embeddedt/modernfix/forge/load/ModWorkManagerQueue.java index 0ed1e2fe..213e768a 100644 --- a/src/main/java/org/embeddedt/modernfix/load/ModWorkManagerQueue.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/load/ModWorkManagerQueue.java @@ -1,12 +1,10 @@ -package org.embeddedt.modernfix.load; +package org.embeddedt.modernfix.forge.load; import net.minecraftforge.fml.ModWorkManager; import net.minecraftforge.fml.util.ObfuscationReflectionHelper; import java.util.concurrent.ConcurrentLinkedDeque; import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.LockSupport; public class ModWorkManagerQueue extends ConcurrentLinkedDeque { diff --git a/src/main/java/org/embeddedt/modernfix/mixin/core/BootstrapMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/core/BootstrapMixin.java similarity index 87% rename from src/main/java/org/embeddedt/modernfix/mixin/core/BootstrapMixin.java rename to forge/src/main/java/org/embeddedt/modernfix/forge/mixin/core/BootstrapMixin.java index 9e6dcac0..428145b7 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/core/BootstrapMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/core/BootstrapMixin.java @@ -1,8 +1,8 @@ -package org.embeddedt.modernfix.mixin.core; +package org.embeddedt.modernfix.forge.mixin.core; import net.minecraft.server.Bootstrap; -import org.embeddedt.modernfix.load.ModWorkManagerQueue; import org.slf4j.Logger; +import org.embeddedt.modernfix.forge.load.ModWorkManagerQueue; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/devenv/GameDataMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/devenv/GameDataMixin.java similarity index 91% rename from src/main/java/org/embeddedt/modernfix/mixin/devenv/GameDataMixin.java rename to forge/src/main/java/org/embeddedt/modernfix/forge/mixin/devenv/GameDataMixin.java index 34f531a3..c9ab0be9 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/devenv/GameDataMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/devenv/GameDataMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.devenv; +package org.embeddedt.modernfix.forge.mixin.devenv; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.registries.ForgeRegistry; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/feature/branding/BrandingControlMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/feature/branding/BrandingControlMixin.java similarity index 93% rename from src/main/java/org/embeddedt/modernfix/mixin/feature/branding/BrandingControlMixin.java rename to forge/src/main/java/org/embeddedt/modernfix/forge/mixin/feature/branding/BrandingControlMixin.java index 129e5629..195b2c34 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/feature/branding/BrandingControlMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/feature/branding/BrandingControlMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.feature.branding; +package org.embeddedt.modernfix.forge.mixin.feature.branding; import com.google.common.collect.ImmutableList; import net.minecraftforge.internal.BrandingControl; @@ -10,7 +10,6 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.LocalCapture; -import java.util.List; import java.util.Optional; @Mixin(value = BrandingControl.class, remap = false, priority = 1100) diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/feature/measure_time/MinecraftMixin_Forge.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/feature/measure_time/MinecraftMixin_Forge.java new file mode 100644 index 00000000..62eecc35 --- /dev/null +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/feature/measure_time/MinecraftMixin_Forge.java @@ -0,0 +1,19 @@ +package org.embeddedt.modernfix.forge.mixin.feature.measure_time; + +import net.minecraft.client.Minecraft; +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(Minecraft.class) +@ClientOnlyMixin +public class MinecraftMixin_Forge { + @Inject(method = "doWorldLoad", at = @At("HEAD"), remap = false) + private void recordWorldLoadStart(CallbackInfo ci) { + ModernFixClient.worldLoadStartTime = System.nanoTime(); + } +} + diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/blast_search_trees/IngredientFilterInvoker.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/blast_search_trees/IngredientFilterInvoker.java similarity index 85% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/blast_search_trees/IngredientFilterInvoker.java rename to forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/blast_search_trees/IngredientFilterInvoker.java index ca5cd2af..ef67771c 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/blast_search_trees/IngredientFilterInvoker.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/blast_search_trees/IngredientFilterInvoker.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.blast_search_trees; +package org.embeddedt.modernfix.forge.mixin.perf.blast_search_trees; import mezz.jei.api.ingredients.ITypedIngredient; import mezz.jei.gui.ingredients.IngredientFilter; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/blast_search_trees/MinecraftMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/blast_search_trees/MinecraftMixin.java similarity index 94% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/blast_search_trees/MinecraftMixin.java rename to forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/blast_search_trees/MinecraftMixin.java index 4663df6d..598b8268 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/blast_search_trees/MinecraftMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/blast_search_trees/MinecraftMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.blast_search_trees; +package org.embeddedt.modernfix.forge.mixin.perf.blast_search_trees; import net.minecraft.client.Minecraft; import net.minecraft.client.searchtree.SearchRegistry; @@ -8,8 +8,8 @@ import net.minecraftforge.forgespi.language.IModFileInfo; import org.embeddedt.modernfix.ModernFix; import org.embeddedt.modernfix.annotation.ClientOnlyMixin; import org.embeddedt.modernfix.searchtree.DummySearchTree; -import org.embeddedt.modernfix.searchtree.JEIBackedSearchTree; import org.embeddedt.modernfix.searchtree.REIBackedSearchTree; +import org.embeddedt.modernfix.forge.searchtree.JEIBackedSearchTree; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/datapack_reload_exceptions/LootTableManagerMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/datapack_reload_exceptions/LootTableManagerMixin.java similarity index 91% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/datapack_reload_exceptions/LootTableManagerMixin.java rename to forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/datapack_reload_exceptions/LootTableManagerMixin.java index fae68135..293b2022 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/datapack_reload_exceptions/LootTableManagerMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/datapack_reload_exceptions/LootTableManagerMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.datapack_reload_exceptions; +package org.embeddedt.modernfix.forge.mixin.perf.datapack_reload_exceptions; import net.minecraft.world.level.storage.loot.LootTables; import org.slf4j.Logger; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/datapack_reload_exceptions/RecipeManagerMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/datapack_reload_exceptions/RecipeManagerMixin.java similarity index 90% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/datapack_reload_exceptions/RecipeManagerMixin.java rename to forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/datapack_reload_exceptions/RecipeManagerMixin.java index e0bbd844..7453ed34 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/datapack_reload_exceptions/RecipeManagerMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/datapack_reload_exceptions/RecipeManagerMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.datapack_reload_exceptions; +package org.embeddedt.modernfix.forge.mixin.perf.datapack_reload_exceptions; import net.minecraft.world.item.crafting.RecipeManager; import org.slf4j.Logger; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/ItemModelShaperMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ItemModelMesherForgeMixin.java similarity index 80% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/ItemModelShaperMixin.java rename to forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ItemModelMesherForgeMixin.java index 465f83f0..481411f6 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/ItemModelShaperMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ItemModelMesherForgeMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.dynamic_resources; +package org.embeddedt.modernfix.forge.mixin.perf.dynamic_resources; import net.minecraft.client.renderer.ItemModelShaper; import net.minecraft.client.resources.model.BakedModel; @@ -11,26 +11,22 @@ import net.minecraftforge.registries.ForgeRegistries; import org.embeddedt.modernfix.annotation.ClientOnlyMixin; import org.embeddedt.modernfix.dynamicresources.ModelLocationCache; import org.embeddedt.modernfix.util.ItemMesherMap; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.*; 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.Collection; import java.util.HashMap; import java.util.Map; -import java.util.Set; @Mixin(ForgeItemModelShaper.class) @ClientOnlyMixin -public abstract class ItemModelShaperMixin extends ItemModelShaper { +public abstract class ItemModelMesherForgeMixin extends ItemModelShaper { @Shadow @Final @Mutable private Map, ModelResourceLocation> locations; private Map, ModelResourceLocation> overrideLocations; - public ItemModelShaperMixin(ModelManager arg) { + public ItemModelMesherForgeMixin(ModelManager arg) { super(arg); } @@ -40,14 +36,15 @@ public abstract class ItemModelShaperMixin extends ItemModelShaper { private void replaceLocationMap(CallbackInfo ci) { overrideLocations = new HashMap<>(); // need to replace this map because mods query locations through it - locations = new ItemMesherMap(this::getLocation); + locations = new ItemMesherMap<>(this::mfix$getLocationForge); } - private ModelResourceLocation getLocation(Item item) { - ModelResourceLocation map = overrideLocations.getOrDefault(ForgeRegistries.ITEMS.getDelegateOrThrow(item), SENTINEL); + @Unique + private ModelResourceLocation mfix$getLocationForge(Holder.Reference item) { + ModelResourceLocation map = overrideLocations.getOrDefault(item, SENTINEL); if(map == SENTINEL) { /* generate the appropriate location from our cache */ - map = ModelLocationCache.get(item); + map = ModelLocationCache.get(item.get()); } return map; } @@ -59,7 +56,7 @@ public abstract class ItemModelShaperMixin extends ItemModelShaper { @Overwrite @Override public BakedModel getItemModel(Item item) { - ModelResourceLocation map = getLocation(item); + ModelResourceLocation map = mfix$getLocationForge(ForgeRegistries.ITEMS.getDelegateOrThrow(item)); return map == null ? null : getModelManager().getModel(map); } diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/ModelBakeryMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ModelBakeryMixin.java similarity index 51% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/ModelBakeryMixin.java rename to forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ModelBakeryMixin.java index ec577010..216641ac 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/ModelBakeryMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ModelBakeryMixin.java @@ -1,35 +1,26 @@ -package org.embeddedt.modernfix.mixin.perf.dynamic_resources; +package org.embeddedt.modernfix.forge.mixin.perf.dynamic_resources; -import com.google.common.base.Splitter; -import com.google.common.base.Stopwatch; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.google.common.cache.RemovalNotification; import com.google.common.collect.ImmutableList; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; -import com.google.gson.*; -import com.mojang.datafixers.util.Pair; +import com.google.gson.JsonElement; import com.mojang.math.Transformation; -import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; -import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; -import net.minecraft.Util; import net.minecraft.client.color.block.BlockColors; import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.client.renderer.block.model.ItemModelGenerator; import net.minecraft.client.renderer.texture.AtlasSet; -import net.minecraft.client.renderer.texture.TextureAtlas; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.texture.TextureManager; import net.minecraft.client.resources.ClientPackSource; import net.minecraft.client.resources.model.*; import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.packs.*; -import net.minecraft.server.packs.resources.FallbackResourceManager; -import net.minecraft.server.packs.resources.Resource; +import net.minecraft.server.packs.FilePackResources; +import net.minecraft.server.packs.FolderPackResources; +import net.minecraft.server.packs.PackResources; +import net.minecraft.server.packs.VanillaPackResources; import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.util.profiling.ProfilerFiller; -import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; @@ -46,10 +37,15 @@ import org.apache.commons.lang3.tuple.Triple; import org.embeddedt.modernfix.ModernFix; import org.embeddedt.modernfix.annotation.ClientOnlyMixin; import org.embeddedt.modernfix.duck.IExtendedModelBakery; -import org.embeddedt.modernfix.dynamicresources.*; +import org.embeddedt.modernfix.dynamicresources.DynamicBakedModelProvider; +import org.embeddedt.modernfix.forge.dynamicresources.DynamicModelBakeEvent; +import org.embeddedt.modernfix.dynamicresources.ModelBakeryHelpers; import org.objectweb.asm.Opcodes; import org.slf4j.Logger; -import org.spongepowered.asm.mixin.*; +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.Redirect; @@ -58,18 +54,10 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import javax.annotation.Nullable; import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; import java.util.*; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.TimeUnit; import java.util.function.BiConsumer; -import java.util.function.BiFunction; import java.util.function.Function; -import java.util.stream.Collectors; -import java.util.stream.Stream; /* high priority so that our injectors are added before other mods' */ @Mixin(value = ModelBakery.class, priority = 600) @@ -84,22 +72,12 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery { @Shadow protected abstract BlockModel loadBlockModel(ResourceLocation location) throws IOException; - @Shadow @Final protected static Set UNREFERENCED_TEXTURES; - @Shadow private Map> atlasPreparations; @Shadow @Final protected ResourceManager resourceManager; @Shadow @Nullable private AtlasSet atlasSet; @Shadow @Final private Set loadingStack; @Shadow protected abstract void loadModel(ResourceLocation blockstateLocation) throws Exception; - @Shadow @Final private static Logger LOGGER; - - @Shadow @Final private static Splitter COMMA_SPLITTER; - @Shadow @Final private static Splitter EQUAL_SPLITTER; - @Shadow @Nullable static > T getValueHelper(Property property, String value) { - throw new AssertionError(); - } - @Shadow @Final @Mutable private Map bakedTopLevelModels; @@ -109,14 +87,13 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery { @Shadow @Final private static ItemModelGenerator ITEM_MODEL_GENERATOR; - @Shadow @Final public static BlockModel BLOCK_ENTITY_MARKER; - @Shadow public abstract UnbakedModel getModel(ResourceLocation modelLocation); @Shadow @Final @Mutable private BlockColors blockColors; @Shadow @Nullable public abstract BakedModel bake(ResourceLocation arg, ModelState arg2, Function sprites); + @Shadow @Final private static Logger LOGGER; private Cache, BakedModel> loadedBakedModels; private Cache loadedModels; @@ -207,17 +184,6 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery { return ImmutableList.of(); } - private static final int ERROR_THRESHOLD = 200; - - private void logOrSuppressError(Object2IntOpenHashMap suppressionMap, String type, ResourceLocation location, Throwable e) { - int numErrors; - synchronized (suppressionMap) { - numErrors = suppressionMap.computeInt(location.getNamespace(), (k, oldVal) -> (oldVal == null ? 1 : oldVal + 1)); - } - if(numErrors <= ERROR_THRESHOLD) - ModernFix.LOGGER.error("Error reading {} {}: {}", type, location, e); - } - private boolean trustedResourcePack(PackResources pack) { return pack instanceof VanillaPackResources || pack instanceof PathPackResources || @@ -227,210 +193,16 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery { pack instanceof FilePackResources; } - private void gatherAdditionalViaManualScan(List untrustedPacks, Set knownLocations, - Collection uncertainLocations, String filePrefix) { - if(untrustedPacks.size() > 0) { - /* Now make a fallback resource manager and use it on the remaining packs to see if they actually contain these files */ - FallbackResourceManager frm = new FallbackResourceManager(PackType.CLIENT_RESOURCES, "dummy"); - for (int i = untrustedPacks.size() - 1; i >= 0; i--) { - frm.push(untrustedPacks.get(i)); - } - for (ResourceLocation blockstate : uncertainLocations) { - if (knownLocations.contains(blockstate)) - continue; // don't check ones we know exist - ResourceLocation fileLocation = new ResourceLocation(blockstate.getNamespace(), filePrefix + blockstate.getPath() + ".json"); - Optional resource = frm.getResource(fileLocation); - if(resource.isPresent()) - knownLocations.add(blockstate); - } - } - } /** * Load all blockstate JSONs and model files, collect textures. */ private void gatherModelMaterials(Set materialSet) { - Stopwatch stopwatch = Stopwatch.createStarted(); - final Object2IntOpenHashMap blockstateErrors = new Object2IntOpenHashMap<>(); - /* - * First, gather all vanilla packs, and use listResources on them. This will allow us to (hopefully) avoid - * scanning most packs a lot. - */ - List allPackResources = new ArrayList<>(this.resourceManager.listPacks().collect(Collectors.toList())); - Collections.reverse(allPackResources); - ObjectOpenHashSet allAvailableModels = new ObjectOpenHashSet<>(), allAvailableStates = new ObjectOpenHashSet<>(); - allPackResources.removeIf(pack -> { - if(trustedResourcePack(pack)) { - for(String namespace : pack.getNamespaces(PackType.CLIENT_RESOURCES)) { - Collection allBlockstates = pack.getResources(PackType.CLIENT_RESOURCES, namespace, "blockstates", p -> p.getPath().endsWith(".json")); - for(ResourceLocation blockstate : allBlockstates) { - allAvailableStates.add(new ResourceLocation(blockstate.getNamespace(), blockstate.getPath().replace("blockstates/", "").replace(".json", ""))); - } - Collection allModels = pack.getResources(PackType.CLIENT_RESOURCES, namespace, "models", p -> p.getPath().endsWith(".json")); - for(ResourceLocation blockstate : allModels) { - allAvailableModels.add(new ResourceLocation(blockstate.getNamespace(), blockstate.getPath().replace("models/", "").replace(".json", ""))); - } - } - return true; - } - ModernFix.LOGGER.debug("Pack with class {} needs manual scan", pack.getClass().getName()); - return false; - }); - - gatherAdditionalViaManualScan(allPackResources, allAvailableStates, blockStateFiles, "blockstates/"); - // We now have a list of all blockstates known to exist. Delete anything that we don't have - blockStateFiles.retainAll(allAvailableStates); - allAvailableStates.clear(); - allAvailableStates.trim(); - - ConcurrentLinkedQueue> blockStateLoadedFiles = new ConcurrentLinkedQueue<>(); - List> blockStateData = new ArrayList<>(); - for(ResourceLocation blockstate : blockStateFiles) { - blockStateData.add(CompletableFuture.runAsync(() -> { - ResourceLocation fileLocation = new ResourceLocation(blockstate.getNamespace(), "blockstates/" + blockstate.getPath() + ".json"); - try { - List resources = this.resourceManager.getResourceStack(fileLocation); - for(Resource resource : resources) { - JsonParser parser = new JsonParser(); - try(InputStream stream = resource.open()) { - blockStateLoadedFiles.add(Pair.of(blockstate, parser.parse(new InputStreamReader(stream, StandardCharsets.UTF_8)))); - } catch(JsonParseException e) { - logOrSuppressError(blockstateErrors, "blockstate", blockstate, e); - } - } - } catch(IOException e) { - logOrSuppressError(blockstateErrors, "blockstate", blockstate, e); - } - }, ModernFix.resourceReloadExecutor())); - } - blockStateFiles = null; - CompletableFuture.allOf(blockStateData.toArray(new CompletableFuture[0])).join(); - for(Pair pair : blockStateLoadedFiles) { - if(pair.getSecond() != null) { - try { - JsonObject obj = pair.getSecond().getAsJsonObject(); - if(obj.has("variants")) { - JsonObject eachVariant = obj.getAsJsonObject("variants"); - for(Map.Entry entry : eachVariant.entrySet()) { - JsonElement variantData = entry.getValue(); - List variantModels; - if(variantData.isJsonArray()) { - variantModels = new ArrayList<>(); - for(JsonElement model : variantData.getAsJsonArray()) { - variantModels.add(model.getAsJsonObject()); - } - } else - variantModels = Collections.singletonList(variantData.getAsJsonObject()); - for(JsonObject variant : variantModels) { - modelFiles.add(new ResourceLocation(variant.get("model").getAsString())); - } - } - - } else { - JsonArray multipartData = obj.get("multipart").getAsJsonArray(); - for(JsonElement element : multipartData) { - JsonObject self = element.getAsJsonObject(); - JsonElement apply = self.get("apply"); - List applyObjects; - if(apply.isJsonArray()) { - applyObjects = new ArrayList<>(); - for(JsonElement e : apply.getAsJsonArray()) { - applyObjects.add(e.getAsJsonObject()); - } - } else - applyObjects = Collections.singletonList(apply.getAsJsonObject()); - for(JsonObject applyEntry : applyObjects) { - modelFiles.add(new ResourceLocation(applyEntry.get("model").getAsString())); - } - } - - } - } catch(RuntimeException e) { - logOrSuppressError(blockstateErrors, "blockstate", pair.getFirst(), e); - } - - } - } - blockstateErrors.object2IntEntrySet().forEach(entry -> { - if(entry.getIntValue() > ERROR_THRESHOLD) { - ModernFix.LOGGER.error("Suppressed additional {} blockstate errors for domain {}", entry.getIntValue(), entry.getKey()); - } - }); - blockstateErrors.clear(); - blockStateData = null; - blockStateLoadedFiles.clear(); - - /* figure out which models we should actually load */ - gatherAdditionalViaManualScan(allPackResources, allAvailableModels, modelFiles, "models/"); - modelFiles.retainAll(allAvailableModels); - allAvailableModels.clear(); - allAvailableModels.trim(); - - Map basicModels = new HashMap<>(); - basicModels.put(MISSING_MODEL_LOCATION, (BlockModel)missingModel); - basicModels.put(new ResourceLocation("builtin/generated"), GENERATION_MARKER); - basicModels.put(new ResourceLocation("builtin/entity"), BLOCK_ENTITY_MARKER); - Set> errorSet = Sets.newLinkedHashSet(); - while(modelFiles.size() > 0) { - List>> modelBytes = new ArrayList<>(); - for(ResourceLocation model : modelFiles) { - if(basicModels.containsKey(model)) - continue; - ResourceLocation fileLocation = new ResourceLocation(model.getNamespace(), "models/" + model.getPath() + ".json"); - modelBytes.add(CompletableFuture.supplyAsync(() -> { - Optional resource = this.resourceManager.getResource(fileLocation); - if(resource.isPresent()) { - try(InputStream stream = resource.get().open()) { - JsonParser parser = new JsonParser(); - return Pair.of(model, parser.parse(new InputStreamReader(stream, StandardCharsets.UTF_8))); - } catch(IOException | JsonParseException e) { - logOrSuppressError(blockstateErrors, "model", fileLocation, e); - } - } - return Pair.of(fileLocation, null); - }, ModernFix.resourceReloadExecutor())); - } - modelFiles.clear(); - CompletableFuture.allOf(modelBytes.toArray(new CompletableFuture[0])).join(); - UVController.useDummyUv.set(Boolean.TRUE); - for(CompletableFuture> future : modelBytes) { - Pair pair = future.join(); - try { - if(pair.getSecond() != null) { - - BlockModel model = ExtendedBlockModelDeserializer.INSTANCE.fromJson(pair.getSecond(), BlockModel.class); - model.name = pair.getFirst().toString(); - modelFiles.addAll(model.getDependencies()); - basicModels.put(pair.getFirst(), model); - continue; - } - } catch(Throwable e) { - logOrSuppressError(blockstateErrors, "model", pair.getFirst(), e); - } - basicModels.put(pair.getFirst(), (BlockModel)missingModel); - } - UVController.useDummyUv.set(Boolean.FALSE); - } - blockstateErrors.object2IntEntrySet().forEach(entry -> { - if(entry.getIntValue() > ERROR_THRESHOLD) { - ModernFix.LOGGER.error("Suppressed additional {} model errors for domain {}", entry.getIntValue(), entry.getKey()); - } - }); - modelFiles = null; - Function modelGetter = loc -> { - UnbakedModel m = basicModels.get(loc); - /* fallback to vanilla loader if missing */ - return m != null ? m : this.getModel(loc); - }; - for(BlockModel model : basicModels.values()) { - materialSet.addAll(model.getMaterials(modelGetter, errorSet)); - } - /* discard whatever garbage was just produced */ + Function modelDeserializer = model -> ExtendedBlockModelDeserializer.INSTANCE.fromJson(model, BlockModel.class); + ModelBakeryHelpers.gatherModelMaterials(this.resourceManager, this::trustedResourcePack, materialSet, blockStateFiles, + modelFiles, missingModel, modelDeserializer, this::getModel); loadedModels.invalidateAll(); loadedModels.put(MISSING_MODEL_LOCATION, missingModel); - //errorSet.stream().filter(pair -> !pair.getSecond().equals(MISSING_MODEL_LOCATION_STRING)).forEach(pair -> LOGGER.warn("Unable to resolve texture reference: {} in {}", pair.getFirst(), pair.getSecond())); - stopwatch.stop(); - ModernFix.LOGGER.info("Resolving model textures took " + stopwatch); } @Inject(method = "uploadTextures", at = @At(value = "FIELD", target = "Lnet/minecraft/client/resources/model/ModelBakery;topLevelModels:Ljava/util/Map;", ordinal = 0), cancellable = true) @@ -519,44 +291,7 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery { } @Redirect(method = "loadModel", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/state/StateDefinition;getPossibleStates()Lcom/google/common/collect/ImmutableList;")) private ImmutableList loadOnlyRelevantBlockState(StateDefinition stateDefinition, ResourceLocation location) { - ModelResourceLocation mrl = (ModelResourceLocation)location; - if(Objects.equals(mrl.getVariant(), "inventory")) - return ImmutableList.of(); - Set> fixedProperties = new HashSet<>(); - BlockState fixedState = stateDefinition.any(); - for(String s : COMMA_SPLITTER.split(mrl.getVariant())) { - Iterator iterator = EQUAL_SPLITTER.split(s).iterator(); - if (iterator.hasNext()) { - String s1 = iterator.next(); - Property property = stateDefinition.getProperty(s1); - if (property != null && iterator.hasNext()) { - String s2 = iterator.next(); - Object value = getValueHelper(property, s2); - if (value == null) { - throw new RuntimeException("Unknown value: '" + s2 + "' for blockstate property: '" + s1 + "' " + property.getPossibleValues()); - } - fixedState = setPropertyGeneric(fixedState, property, value); - fixedProperties.add(property); - } else if (!s1.isEmpty()) { - throw new RuntimeException("Unknown blockstate property: '" + s1 + "'"); - } - } - } - // generate all possible blockstates from the remaining properties - ArrayList> anyProperties = new ArrayList<>(stateDefinition.getProperties()); - anyProperties.removeAll(fixedProperties); - ArrayList finalList = new ArrayList<>(); - finalList.add(fixedState); - for(Property property : anyProperties) { - ArrayList newPermutations = new ArrayList<>(); - for(BlockState state : finalList) { - for(Comparable value : property.getPossibleValues()) { - newPermutations.add(setPropertyGeneric(state, property, value)); - } - } - finalList = newPermutations; - } - return ImmutableList.copyOf(finalList); + return ModelBakeryHelpers.getBlockStatesForMRL(stateDefinition, (ModelResourceLocation)location); } @Override diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/ae2/RegistrationMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ae2/RegistrationMixin.java similarity index 91% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/ae2/RegistrationMixin.java rename to forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ae2/RegistrationMixin.java index 2095d7f0..a3954573 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/ae2/RegistrationMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ae2/RegistrationMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.dynamic_resources.ae2; +package org.embeddedt.modernfix.forge.mixin.perf.dynamic_resources.ae2; import appeng.core.AppEng; import appeng.init.client.InitAutoRotatingModel; @@ -7,8 +7,8 @@ import net.minecraft.client.resources.model.ModelBakery; import net.minecraftforge.common.MinecraftForge; import org.embeddedt.modernfix.annotation.ClientOnlyMixin; import org.embeddedt.modernfix.annotation.RequiresMod; -import org.embeddedt.modernfix.dynamicresources.DynamicModelBakeEvent; import org.spongepowered.asm.mixin.Final; +import org.embeddedt.modernfix.forge.dynamicresources.DynamicModelBakeEvent; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/ctm/CTMPackReloadListenerMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ctm/CTMPackReloadListenerMixin.java similarity index 93% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/ctm/CTMPackReloadListenerMixin.java rename to forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ctm/CTMPackReloadListenerMixin.java index 4c782d58..44fa59fc 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/ctm/CTMPackReloadListenerMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ctm/CTMPackReloadListenerMixin.java @@ -1,10 +1,8 @@ -package org.embeddedt.modernfix.mixin.perf.dynamic_resources.ctm; +package org.embeddedt.modernfix.forge.mixin.perf.dynamic_resources.ctm; import com.google.common.collect.ImmutableList; -import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import net.minecraft.client.renderer.ItemBlockRenderTypes; import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.block.BlockModelShaper; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.client.resources.model.MultiPartBakedModel; @@ -17,13 +15,12 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.client.ChunkRenderTypeSet; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.eventbus.api.EventPriority; -import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.registries.ForgeRegistries; import org.embeddedt.modernfix.ModernFix; import org.embeddedt.modernfix.annotation.ClientOnlyMixin; import org.embeddedt.modernfix.annotation.RequiresMod; import org.embeddedt.modernfix.duck.IExtendedModelBakery; -import org.embeddedt.modernfix.dynamicresources.DynamicModelBakeEvent; +import org.embeddedt.modernfix.forge.dynamicresources.DynamicModelBakeEvent; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/ctm/TextureMetadataHandlerMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ctm/TextureMetadataHandlerMixin.java similarity index 93% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/ctm/TextureMetadataHandlerMixin.java rename to forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ctm/TextureMetadataHandlerMixin.java index 14850994..d932d9c8 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/ctm/TextureMetadataHandlerMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ctm/TextureMetadataHandlerMixin.java @@ -1,18 +1,15 @@ -package org.embeddedt.modernfix.mixin.perf.dynamic_resources.ctm; +package org.embeddedt.modernfix.forge.mixin.perf.dynamic_resources.ctm; import com.mojang.datafixers.util.Pair; -import it.unimi.dsi.fastutil.objects.Object2BooleanMap; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.client.resources.model.Material; import net.minecraft.client.resources.model.ModelBakery; import net.minecraft.client.resources.model.UnbakedModel; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.SubscribeEvent; import org.embeddedt.modernfix.annotation.ClientOnlyMixin; import org.embeddedt.modernfix.annotation.RequiresMod; -import org.embeddedt.modernfix.dynamicresources.DynamicModelBakeEvent; -import org.spongepowered.asm.mixin.Final; +import org.embeddedt.modernfix.forge.dynamicresources.DynamicModelBakeEvent; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/rs/ClientSetupMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/rs/ClientSetupMixin.java similarity index 91% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/rs/ClientSetupMixin.java rename to forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/rs/ClientSetupMixin.java index a11e6842..d6704ce2 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/rs/ClientSetupMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/rs/ClientSetupMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.dynamic_resources.rs; +package org.embeddedt.modernfix.forge.mixin.perf.dynamic_resources.rs; import com.refinedmods.refinedstorage.render.BakedModelOverrideRegistry; import com.refinedmods.refinedstorage.setup.ClientSetup; @@ -7,7 +7,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraftforge.common.MinecraftForge; import org.embeddedt.modernfix.annotation.ClientOnlyMixin; import org.embeddedt.modernfix.annotation.RequiresMod; -import org.embeddedt.modernfix.dynamicresources.DynamicModelBakeEvent; +import org.embeddedt.modernfix.forge.dynamicresources.DynamicModelBakeEvent; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/supermartijncore/ClientRegistrationHandlerMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/supermartijncore/ClientRegistrationHandlerMixin.java similarity index 92% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/supermartijncore/ClientRegistrationHandlerMixin.java rename to forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/supermartijncore/ClientRegistrationHandlerMixin.java index 2a1e53a3..682484f1 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/supermartijncore/ClientRegistrationHandlerMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/supermartijncore/ClientRegistrationHandlerMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.dynamic_resources.supermartijncore; +package org.embeddedt.modernfix.forge.mixin.perf.dynamic_resources.supermartijncore; import com.supermartijn642.core.registry.ClientRegistrationHandler; import com.supermartijn642.core.util.Pair; @@ -7,10 +7,9 @@ import net.minecraft.client.resources.model.BakedModel; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import org.embeddedt.modernfix.annotation.ClientOnlyMixin; import org.embeddedt.modernfix.annotation.RequiresMod; -import org.embeddedt.modernfix.dynamicresources.DynamicModelBakeEvent; +import org.embeddedt.modernfix.forge.dynamicresources.DynamicModelBakeEvent; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/fast_forge_dummies/NamespacedHolderHelperMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/fast_forge_dummies/NamespacedHolderHelperMixin.java similarity index 96% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/fast_forge_dummies/NamespacedHolderHelperMixin.java rename to forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/fast_forge_dummies/NamespacedHolderHelperMixin.java index 0da4a052..60ad98b6 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/fast_forge_dummies/NamespacedHolderHelperMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/fast_forge_dummies/NamespacedHolderHelperMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.fast_forge_dummies; +package org.embeddedt.modernfix.forge.mixin.perf.fast_forge_dummies; import net.minecraft.core.Holder; import net.minecraft.core.Registry; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/fast_registry_validation/ForgeRegistryMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/fast_registry_validation/ForgeRegistryMixin.java similarity index 97% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/fast_registry_validation/ForgeRegistryMixin.java rename to forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/fast_registry_validation/ForgeRegistryMixin.java index 81398380..a115c024 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/fast_registry_validation/ForgeRegistryMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/fast_registry_validation/ForgeRegistryMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.fast_registry_validation; +package org.embeddedt.modernfix.forge.mixin.perf.fast_registry_validation; import net.minecraftforge.fml.util.ObfuscationReflectionHelper; import net.minecraftforge.registries.ForgeRegistry; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/fast_registry_validation/ResourceKeyMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/fast_registry_validation/ResourceKeyMixin.java similarity index 94% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/fast_registry_validation/ResourceKeyMixin.java rename to forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/fast_registry_validation/ResourceKeyMixin.java index 804dce98..0c62d3fe 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/fast_registry_validation/ResourceKeyMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/fast_registry_validation/ResourceKeyMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.fast_registry_validation; +package org.embeddedt.modernfix.forge.mixin.perf.fast_registry_validation; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import net.minecraft.resources.ResourceKey; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/kubejs/RecipeEventJSMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/kubejs/RecipeEventJSMixin.java similarity index 97% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/kubejs/RecipeEventJSMixin.java rename to forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/kubejs/RecipeEventJSMixin.java index 9d64a4cd..1848edb6 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/kubejs/RecipeEventJSMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/kubejs/RecipeEventJSMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.kubejs; +package org.embeddedt.modernfix.forge.mixin.perf.kubejs; import dev.latvian.mods.kubejs.recipe.RecipesEventJS; import org.embeddedt.modernfix.ModernFix; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/model_optimizations/OBJLoaderMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/model_optimizations/OBJLoaderMixin.java similarity index 95% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/model_optimizations/OBJLoaderMixin.java rename to forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/model_optimizations/OBJLoaderMixin.java index 59307457..623ddb6f 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/model_optimizations/OBJLoaderMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/model_optimizations/OBJLoaderMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.model_optimizations; +package org.embeddedt.modernfix.forge.mixin.perf.model_optimizations; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.client.model.obj.ObjLoader; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/patchouli_deduplicate_books/ClientBookRegistryMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/patchouli_deduplicate_books/ClientBookRegistryMixin.java similarity index 97% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/patchouli_deduplicate_books/ClientBookRegistryMixin.java rename to forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/patchouli_deduplicate_books/ClientBookRegistryMixin.java index afd6061b..f98c6f46 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/patchouli_deduplicate_books/ClientBookRegistryMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/patchouli_deduplicate_books/ClientBookRegistryMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.patchouli_deduplicate_books; +package org.embeddedt.modernfix.forge.mixin.perf.patchouli_deduplicate_books; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; diff --git a/src/main/java/org/embeddedt/modernfix/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 similarity index 93% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/reduce_blockstate_cache_rebuilds/BlockCallbacksMixin.java rename to forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/reduce_blockstate_cache_rebuilds/BlockCallbacksMixin.java index df586c9f..85c718d3 100644 --- a/src/main/java/org/embeddedt/modernfix/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 @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.reduce_blockstate_cache_rebuilds; +package org.embeddedt.modernfix.forge.mixin.perf.reduce_blockstate_cache_rebuilds; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; diff --git a/src/main/java/org/embeddedt/modernfix/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 similarity index 96% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/reduce_blockstate_cache_rebuilds/GameDataMixin.java rename to forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/reduce_blockstate_cache_rebuilds/GameDataMixin.java index 3df6d6ba..1bf49444 100644 --- a/src/main/java/org/embeddedt/modernfix/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 @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.reduce_blockstate_cache_rebuilds; +package org.embeddedt.modernfix.forge.mixin.perf.reduce_blockstate_cache_rebuilds; import com.google.common.collect.Multimap; import net.minecraft.resources.ResourceLocation; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/modern_resourcepacks/PathPackResourcesMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/resourcepacks/ModFileResourcePackMixin.java similarity index 78% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/modern_resourcepacks/PathPackResourcesMixin.java rename to forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/resourcepacks/ModFileResourcePackMixin.java index b5a7302e..944cb2f4 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/modern_resourcepacks/PathPackResourcesMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/resourcepacks/ModFileResourcePackMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.modern_resourcepacks; +package org.embeddedt.modernfix.forge.mixin.perf.resourcepacks; import net.minecraft.server.packs.PackType; import net.minecraft.resources.ResourceLocation; @@ -13,7 +13,7 @@ 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.nio.file.Path; +import java.nio.file.*; import java.util.*; import java.util.function.Predicate; @@ -23,8 +23,7 @@ import java.util.function.Predicate; * and 1.18. */ @Mixin(PathPackResources.class) -public abstract class PathPackResourcesMixin { - +public abstract class ModFileResourcePackMixin { @Shadow protected abstract Path resolve(String... paths); @Shadow @NotNull @@ -47,10 +46,8 @@ public abstract class PathPackResourcesMixin { @Inject(method = "getNamespaces", at = @At("HEAD"), cancellable = true) private void useCacheForNamespaces(PackType type, CallbackInfoReturnable> cir) { - if(!PackTypeHelper.isVanillaPackType(type)) - return; - if(this.cacheEngine != null) { - Set namespaces = this.cacheEngine.getNamespaces(type); + if(cacheEngine != null) { + Set namespaces = cacheEngine.getNamespaces(type); if(namespaces != null) cir.setReturnValue(namespaces); } @@ -58,8 +55,8 @@ public abstract class PathPackResourcesMixin { @Inject(method = "hasResource(Ljava/lang/String;)Z", at = @At(value = "HEAD"), cancellable = true) private void useCacheForExistence(String path, CallbackInfoReturnable cir) { - this.generateResourceCache(); - cir.setReturnValue(this.cacheEngine.hasResource(path)); + if(cacheEngine != null) + cir.setReturnValue(this.cacheEngine.hasResource(path)); } /** @@ -67,9 +64,9 @@ public abstract class PathPackResourcesMixin { * @reason Use cached listing of mod resources */ @Inject(method = "getResources", at = @At("HEAD"), cancellable = true) - public void getResources(PackType type, String resourceNamespace, String pathIn, Predicate filter, CallbackInfoReturnable> cir) + private void fastGetResources(PackType type, String resourceNamespace, String pathIn, Predicate filter, CallbackInfoReturnable> cir) { - if(!PackTypeHelper.isVanillaPackType(type)) + if(!PackTypeHelper.isVanillaPackType(type) || this.cacheEngine == null) return; this.generateResourceCache(); cir.setReturnValue(this.cacheEngine.getResources(type, resourceNamespace, pathIn, Integer.MAX_VALUE, filter)); diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/modern_resourcepacks/ResourceCacheManagerMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/resourcepacks/ResourceCacheManagerMixin.java similarity index 89% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/modern_resourcepacks/ResourceCacheManagerMixin.java rename to forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/resourcepacks/ResourceCacheManagerMixin.java index cd05ba6a..aa38bc79 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/modern_resourcepacks/ResourceCacheManagerMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/resourcepacks/ResourceCacheManagerMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.modern_resourcepacks; +package org.embeddedt.modernfix.forge.mixin.perf.resourcepacks; import net.minecraftforge.resource.ResourceCacheManager; import org.spongepowered.asm.mixin.Mixin; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/modern_resourcepacks/VanillaPackResourcesMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/resourcepacks/VanillaPackMixin.java similarity index 96% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/modern_resourcepacks/VanillaPackResourcesMixin.java rename to forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/resourcepacks/VanillaPackMixin.java index 4509240b..9e7e3382 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/modern_resourcepacks/VanillaPackResourcesMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/resourcepacks/VanillaPackMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.modern_resourcepacks; +package org.embeddedt.modernfix.forge.mixin.perf.resourcepacks; import com.google.common.base.Joiner; import com.google.common.cache.CacheBuilder; @@ -22,7 +22,6 @@ import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.nio.file.*; @@ -31,7 +30,7 @@ import java.util.concurrent.ExecutionException; import java.util.stream.Stream; @Mixin(VanillaPackResources.class) -public class VanillaPackResourcesMixin { +public class VanillaPackMixin { @Shadow @Final private static Map ROOT_DIR_BY_TYPE; private static LoadingCache, List> pathStreamLoadingCache = CacheBuilder.newBuilder() .build(FileWalker.INSTANCE); diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/rewrite_registry/ForgeRegistryMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/rewrite_registry/ForgeRegistryMixin.java similarity index 94% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/rewrite_registry/ForgeRegistryMixin.java rename to forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/rewrite_registry/ForgeRegistryMixin.java index a47b7c5f..69a30123 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/rewrite_registry/ForgeRegistryMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/rewrite_registry/ForgeRegistryMixin.java @@ -1,11 +1,11 @@ -package org.embeddedt.modernfix.mixin.perf.rewrite_registry; +package org.embeddedt.modernfix.forge.mixin.perf.rewrite_registry; import com.google.common.collect.BiMap; import net.minecraft.core.Registry; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.registries.ForgeRegistry; -import org.embeddedt.modernfix.registry.FastForgeRegistry; +import org.embeddedt.modernfix.forge.registry.FastForgeRegistry; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mutable; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/rewrite_registry/ForgeRegistrySnapshotMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/rewrite_registry/ForgeRegistrySnapshotMixin.java similarity index 94% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/rewrite_registry/ForgeRegistrySnapshotMixin.java rename to forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/rewrite_registry/ForgeRegistrySnapshotMixin.java index 87fb4de7..8421e5cf 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/rewrite_registry/ForgeRegistrySnapshotMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/rewrite_registry/ForgeRegistrySnapshotMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.rewrite_registry; +package org.embeddedt.modernfix.forge.mixin.perf.rewrite_registry; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/skip_first_datapack_reload/CreateWorldScreenMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/skip_first_datapack_reload/CreateWorldScreenMixin.java similarity index 98% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/skip_first_datapack_reload/CreateWorldScreenMixin.java rename to forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/skip_first_datapack_reload/CreateWorldScreenMixin.java index 2c6371ee..835e0d99 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/skip_first_datapack_reload/CreateWorldScreenMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/skip_first_datapack_reload/CreateWorldScreenMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.skip_first_datapack_reload; +package org.embeddedt.modernfix.forge.mixin.perf.skip_first_datapack_reload; import com.google.common.collect.ImmutableList; import com.mojang.datafixers.util.Pair; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/tag_id_caching/TagEntryMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/tag_id_caching/TagEntryMixin.java similarity index 93% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/tag_id_caching/TagEntryMixin.java rename to forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/tag_id_caching/TagEntryMixin.java index 82ffcda6..ac21c7a0 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/tag_id_caching/TagEntryMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/tag_id_caching/TagEntryMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.tag_id_caching; +package org.embeddedt.modernfix.forge.mixin.perf.tag_id_caching; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.TagEntry; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/tag_id_caching/TagOrElementLocationMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/tag_id_caching/TagOrElementLocationMixin.java similarity index 92% rename from src/main/java/org/embeddedt/modernfix/mixin/perf/tag_id_caching/TagOrElementLocationMixin.java rename to forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/tag_id_caching/TagOrElementLocationMixin.java index 6b3e1d55..5d91aa4c 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/tag_id_caching/TagOrElementLocationMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/tag_id_caching/TagOrElementLocationMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin.perf.tag_id_caching; +package org.embeddedt.modernfix.forge.mixin.perf.tag_id_caching; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.ExtraCodecs; diff --git a/src/main/java/org/embeddedt/modernfix/packet/PacketHandler.java b/forge/src/main/java/org/embeddedt/modernfix/forge/packet/PacketHandler.java similarity index 77% rename from src/main/java/org/embeddedt/modernfix/packet/PacketHandler.java rename to forge/src/main/java/org/embeddedt/modernfix/forge/packet/PacketHandler.java index db0a33ed..e556618a 100644 --- a/src/main/java/org/embeddedt/modernfix/packet/PacketHandler.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/packet/PacketHandler.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.packet; +package org.embeddedt.modernfix.forge.packet; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.network.NetworkEvent; @@ -8,6 +8,7 @@ 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.packet.EntityIDSyncPacket; import java.util.function.Supplier; @@ -26,6 +27,9 @@ public class PacketHandler { } private static void handleSyncPacket(EntityIDSyncPacket packet, Supplier contextSupplier) { - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> ModernFixClient.handleEntityIDSync(packet, contextSupplier)); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { + contextSupplier.get().enqueueWork(() -> ModernFixClient.handleEntityIDSync(packet)); + contextSupplier.get().setPacketHandled(true); + }); } } diff --git a/src/main/java/org/embeddedt/modernfix/registry/FastForgeRegistry.java b/forge/src/main/java/org/embeddedt/modernfix/forge/registry/FastForgeRegistry.java similarity index 99% rename from src/main/java/org/embeddedt/modernfix/registry/FastForgeRegistry.java rename to forge/src/main/java/org/embeddedt/modernfix/forge/registry/FastForgeRegistry.java index 67be3c21..3e7dd484 100644 --- a/src/main/java/org/embeddedt/modernfix/registry/FastForgeRegistry.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/registry/FastForgeRegistry.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.registry; +package org.embeddedt.modernfix.forge.registry; import com.google.common.collect.BiMap; import com.google.common.collect.Iterators; @@ -14,7 +14,6 @@ import java.util.*; import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.function.Function; -import java.util.stream.Collectors; public class FastForgeRegistry { private final BiMap ids; diff --git a/src/main/java/org/embeddedt/modernfix/registry/ObjectHolderClearer.java b/forge/src/main/java/org/embeddedt/modernfix/forge/registry/ObjectHolderClearer.java similarity index 96% rename from src/main/java/org/embeddedt/modernfix/registry/ObjectHolderClearer.java rename to forge/src/main/java/org/embeddedt/modernfix/forge/registry/ObjectHolderClearer.java index ca1eee0d..4f2a9059 100644 --- a/src/main/java/org/embeddedt/modernfix/registry/ObjectHolderClearer.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/registry/ObjectHolderClearer.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.registry; +package org.embeddedt.modernfix.forge.registry; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.fml.util.ObfuscationReflectionHelper; @@ -7,7 +7,6 @@ import org.embeddedt.modernfix.ModernFix; import java.lang.reflect.Field; import java.util.HashMap; -import java.util.List; import java.util.Set; import java.util.function.Consumer; import java.util.function.Predicate; diff --git a/src/main/java/org/embeddedt/modernfix/duck/rs/IFluidExternalStorageCache.java b/forge/src/main/java/org/embeddedt/modernfix/forge/rs/IFluidExternalStorageCache.java similarity index 78% rename from src/main/java/org/embeddedt/modernfix/duck/rs/IFluidExternalStorageCache.java rename to forge/src/main/java/org/embeddedt/modernfix/forge/rs/IFluidExternalStorageCache.java index 87031bb2..4b7f192a 100644 --- a/src/main/java/org/embeddedt/modernfix/duck/rs/IFluidExternalStorageCache.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/rs/IFluidExternalStorageCache.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.duck.rs; +package org.embeddedt.modernfix.forge.rs; import net.minecraftforge.fluids.capability.IFluidHandler; diff --git a/src/main/java/org/embeddedt/modernfix/duck/rs/IItemExternalStorageCache.java b/forge/src/main/java/org/embeddedt/modernfix/forge/rs/IItemExternalStorageCache.java similarity index 76% rename from src/main/java/org/embeddedt/modernfix/duck/rs/IItemExternalStorageCache.java rename to forge/src/main/java/org/embeddedt/modernfix/forge/rs/IItemExternalStorageCache.java index 133646a2..4d5555d5 100644 --- a/src/main/java/org/embeddedt/modernfix/duck/rs/IItemExternalStorageCache.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/rs/IItemExternalStorageCache.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.duck.rs; +package org.embeddedt.modernfix.forge.rs; import net.minecraftforge.items.IItemHandler; diff --git a/src/main/java/org/embeddedt/modernfix/searchtree/JEIBackedSearchTree.java b/forge/src/main/java/org/embeddedt/modernfix/forge/searchtree/JEIBackedSearchTree.java similarity index 92% rename from src/main/java/org/embeddedt/modernfix/searchtree/JEIBackedSearchTree.java rename to forge/src/main/java/org/embeddedt/modernfix/forge/searchtree/JEIBackedSearchTree.java index 31bf7f37..9f3779ff 100644 --- a/src/main/java/org/embeddedt/modernfix/searchtree/JEIBackedSearchTree.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/searchtree/JEIBackedSearchTree.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.searchtree; +package org.embeddedt.modernfix.forge.searchtree; import mezz.jei.api.ingredients.ITypedIngredient; import mezz.jei.common.Internal; @@ -7,7 +7,8 @@ import mezz.jei.gui.ingredients.IngredientFilterApi; import mezz.jei.library.runtime.JeiRuntime; import net.minecraft.world.item.ItemStack; import org.embeddedt.modernfix.ModernFix; -import org.embeddedt.modernfix.mixin.perf.blast_search_trees.IngredientFilterInvoker; +import org.embeddedt.modernfix.forge.mixin.perf.blast_search_trees.IngredientFilterInvoker; +import org.embeddedt.modernfix.searchtree.DummySearchTree; import java.lang.reflect.Field; import java.util.ArrayList; diff --git a/src/main/java/org/embeddedt/modernfix/searchtree/JEIRuntimeCapturer.java b/forge/src/main/java/org/embeddedt/modernfix/forge/searchtree/JEIRuntimeCapturer.java similarity index 94% rename from src/main/java/org/embeddedt/modernfix/searchtree/JEIRuntimeCapturer.java rename to forge/src/main/java/org/embeddedt/modernfix/forge/searchtree/JEIRuntimeCapturer.java index 8e3f2412..1763afa0 100644 --- a/src/main/java/org/embeddedt/modernfix/searchtree/JEIRuntimeCapturer.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/searchtree/JEIRuntimeCapturer.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.searchtree; +package org.embeddedt.modernfix.forge.searchtree; import mezz.jei.api.IModPlugin; import mezz.jei.api.JeiPlugin; diff --git a/src/main/java/org/embeddedt/modernfix/util/ModUtil.java b/forge/src/main/java/org/embeddedt/modernfix/forge/util/ModUtil.java similarity index 98% rename from src/main/java/org/embeddedt/modernfix/util/ModUtil.java rename to forge/src/main/java/org/embeddedt/modernfix/forge/util/ModUtil.java index be77b525..3089fc51 100644 --- a/src/main/java/org/embeddedt/modernfix/util/ModUtil.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/util/ModUtil.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.util; +package org.embeddedt.modernfix.forge.util; import net.minecraftforge.eventbus.EventBus; import net.minecraftforge.eventbus.api.EventListenerHelper; diff --git a/forge/src/main/java/org/embeddedt/modernfix/platform/forge/ModernFixPlatformHooksImpl.java b/forge/src/main/java/org/embeddedt/modernfix/platform/forge/ModernFixPlatformHooksImpl.java new file mode 100644 index 00000000..15a17134 --- /dev/null +++ b/forge/src/main/java/org/embeddedt/modernfix/platform/forge/ModernFixPlatformHooksImpl.java @@ -0,0 +1,178 @@ +package org.embeddedt.modernfix.platform.forge; + +import com.google.common.io.Resources; +import com.mojang.blaze3d.platform.NativeImage; +import cpw.mods.modlauncher.*; +import cpw.mods.modlauncher.api.INameMappingService; +import cpw.mods.modlauncher.api.LamdbaExceptionUtils; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.packs.resources.Resource; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.ForgeHooksClient; +import net.minecraftforge.fml.ModLoader; +import net.minecraftforge.fml.loading.FMLLoader; +import net.minecraftforge.fml.loading.FMLPaths; +import net.minecraftforge.fml.loading.LoadingModList; +import net.minecraftforge.fml.loading.moddiscovery.ExplodedDirectoryLocator; +import net.minecraftforge.fml.util.ObfuscationReflectionHelper; +import net.minecraftforge.network.PacketDistributor; +import net.minecraftforge.server.ServerLifecycleHooks; +import org.embeddedt.modernfix.forge.classloading.FastAccessTransformerList; +import org.embeddedt.modernfix.core.ModernFixMixinPlugin; +import org.embeddedt.modernfix.dfu.DFUBlaster; +import org.embeddedt.modernfix.forge.packet.PacketHandler; +import org.embeddedt.modernfix.util.DummyList; +import org.objectweb.asm.Opcodes; +import org.objectweb.asm.tree.*; +import org.spongepowered.asm.mixin.injection.struct.InjectorGroupInfo; + +import java.io.IOException; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.nio.file.Path; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class ModernFixPlatformHooksImpl { + public static boolean isClient() { + return FMLLoader.getDist() == Dist.CLIENT; + } + + public static boolean isDedicatedServer() { + return FMLLoader.getDist().isDedicatedServer(); + } + + private static String verString; + + public static String getVersionString() { + if(verString == null) { + verString = LoadingModList.get().getModFileById("modernfix").getMods().get(0).getVersion().toString(); + } + return verString; + } + + public static boolean modPresent(String modId) { + return FMLLoader.getLoadingModList().getModFileById(modId) != null; + } + + public static boolean isDevEnv() { + return !FMLLoader.isProduction() && FMLLoader.getLoadingModList().getModFileById("modernfix").getFile().getProvider() instanceof ExplodedDirectoryLocator; + } + + public static MinecraftServer getCurrentServer() { + return ServerLifecycleHooks.getCurrentServer(); + } + + public static boolean isLoadingNormally() { + return ModLoader.isLoadingStateValid(); + } + + + public static TextureAtlasSprite loadTextureAtlasSprite(TextureAtlas atlasTexture, + ResourceManager resourceManager, TextureAtlasSprite.Info textureInfo, + Resource resource, + int atlasWidth, int atlasHeight, + int spriteX, int spriteY, int mipmapLevel, + NativeImage image) throws IOException { + TextureAtlasSprite tas = ForgeHooksClient.loadTextureAtlasSprite(atlasTexture, resourceManager, textureInfo, resource, atlasWidth, atlasHeight, spriteX, spriteY, mipmapLevel, image); + if(tas == null) { + tas = TASConstructor.construct(atlasTexture, resourceManager, textureInfo, resource, atlasWidth, atlasHeight, spriteX, spriteY, mipmapLevel, image); + } + return tas; + } + + static class TASConstructor { + private static final MethodHandle textureAtlasSpriteConstruct; + static { + try { + Constructor constructor = TextureAtlasSprite.class.getDeclaredConstructors()[0]; + constructor.setAccessible(true); + textureAtlasSpriteConstruct = MethodHandles.lookup().unreflectConstructor(constructor); + } catch(IllegalAccessException e) { + throw new RuntimeException(e); + } + } + + static TextureAtlasSprite construct(TextureAtlas atlasTexture, + ResourceManager resourceManager, TextureAtlasSprite.Info textureInfo, + Resource resource, + int atlasWidth, int atlasHeight, + int spriteX, int spriteY, int mipmapLevel, + NativeImage image) { + try { + return (TextureAtlasSprite)textureAtlasSpriteConstruct.invokeExact(atlasTexture, textureInfo, mipmapLevel, atlasWidth, atlasHeight, spriteX, spriteY, image); + } catch(Throwable e) { + throw new AssertionError("MethodHandle failed", e); + } + } + } + + public static Path getGameDirectory() { + return FMLPaths.GAMEDIR.get(); + } + + public static void sendPacket(ServerPlayer player, Object packet) { + PacketHandler.INSTANCE.send(PacketDistributor.PLAYER.with(() -> player), packet); + } + + public static void injectPlatformSpecificHacks() { + FastAccessTransformerList.attemptReplace(); + DFUBlaster.blastMaps(); + + /* https://github.com/FabricMC/Mixin/pull/99 */ + try { + Field groupMembersField = InjectorGroupInfo.class.getDeclaredField("members"); + groupMembersField.setAccessible(true); + Field noGroupField = InjectorGroupInfo.Map.class.getDeclaredField("NO_GROUP"); + noGroupField.setAccessible(true); + InjectorGroupInfo noGroup = (InjectorGroupInfo)noGroupField.get(null); + groupMembersField.set(noGroup, new DummyList<>()); + } catch(RuntimeException | ReflectiveOperationException e) { + ModernFixMixinPlugin.instance.logger.error("Failed to patch mixin memory leak", e); + } + } + + public static void applyASMTransformers(String mixinClassName, ClassNode targetClass) { + if(mixinClassName.equals("org.embeddedt.modernfix.common.compress_blockstate.perf.mixin.BlockStateBaseMixin")) { + // Delete unused fields off BlockStateBase + Set fieldsToDelete = Stream.of( + "field_235702_f_", // isAir + "field_235703_g_", // material + "field_235705_i_", // destroySpeed + "field_235706_j_", // requiresCorrectToolForDrops + "field_235707_k_", // canOcclude + "field_235708_l_", // isRedstoneConductor + "field_235709_m_", // isSuffocating + "field_235710_n_", // isViewBlocking + "field_235711_o_", // hasPostProcess + "field_235712_p_" // emissiveRendering + ).map(name -> ObfuscationReflectionHelper.remapName(INameMappingService.Domain.FIELD, name)).collect(Collectors.toSet()); + targetClass.fields.removeIf(field -> { + if(fieldsToDelete.contains(field.name)) { + return true; + } + return false; + }); + for(MethodNode m : targetClass.methods) { + if(m.name.equals("")) { + ListIterator iter = m.instructions.iterator(); + while(iter.hasNext()) { + AbstractInsnNode node = iter.next(); + if(node.getOpcode() == Opcodes.PUTFIELD) { + if(fieldsToDelete.contains(((FieldInsnNode)node).name)) { + iter.remove(); + } + } + } + } + } + } + } +} diff --git a/src/main/resources/META-INF/mods.toml b/forge/src/main/resources/META-INF/mods.toml similarity index 89% rename from src/main/resources/META-INF/mods.toml rename to forge/src/main/resources/META-INF/mods.toml index f895414c..5023fe2d 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/forge/src/main/resources/META-INF/mods.toml @@ -16,10 +16,7 @@ license = "GNU LGPL 3.0" [[mods]] #mandatory # The modid of the mod modId = "modernfix" #mandatory -# The version number of the mod - there's a few well known ${} variables useable here or just hardcode it -# ${file.jarVersion} will substitute the value of the Implementation-Version as read from the mod's JAR file metadata -# see the associated build.gradle script for how to populate this completely automatically during a build -version = "${file.jarVersion}" #mandatory +version = "${version}" #mandatory # A display name for the mod displayName = "ModernFix" #mandatory # A URL to query for updates for this mod. See the JSON update specification diff --git a/forge/src/main/resources/modernfix-forge.mixins.json b/forge/src/main/resources/modernfix-forge.mixins.json new file mode 100644 index 00000000..cd76ed5b --- /dev/null +++ b/forge/src/main/resources/modernfix-forge.mixins.json @@ -0,0 +1,13 @@ +{ + "required": true, + "package": "org.embeddedt.modernfix.forge.mixin", + "plugin": "org.embeddedt.modernfix.core.ModernFixMixinPlugin", + "compatibilityLevel": "JAVA_8", + "minVersion": "0.8", + "mixins": [ +${mixin_classes} + ], + "injectors": { + "defaultRequire": 1 + } +} \ No newline at end of file diff --git a/forge/src/main/resources/pack.mcmeta b/forge/src/main/resources/pack.mcmeta new file mode 100644 index 00000000..b9e3938c --- /dev/null +++ b/forge/src/main/resources/pack.mcmeta @@ -0,0 +1,6 @@ +{ + "pack": { + "description": "ModernFix", + "pack_format": 6 + } +} diff --git a/gradle.properties b/gradle.properties index fd60c215..f1565053 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,14 +1,9 @@ # Done to increase the memory available to gradle. -org.gradle.jvmargs=-Xmx1G - -# tell architectury loom that this project is a forge project. -# this will enable us to use the "forge" dependency. -# using archloom without this is possible and will give you a -# "standard" loom installation with some extra features. -loom.platform=forge +org.gradle.jvmargs=-Xmx2G mod_id=modernfix minecraft_version=1.19.2 +enabled_platforms=fabric,forge forge_version=1.19.2-43.2.0 parchment_version=2022.11.27 refined_storage_version=4392788 @@ -16,3 +11,7 @@ jei_version=11.6.0.1011 rei_version=9.1.591 ctm_version=1.19.2-1.1.7+11 kubejs_version=1902.6.0-build.142 +rhino_version=1902.2.2-build.268 + +fabric_loader_version=0.14.18 +fabric_api_version=0.76.0+1.19.2 diff --git a/settings.gradle b/settings.gradle index 7bd03562..8a77caf9 100644 --- a/settings.gradle +++ b/settings.gradle @@ -7,4 +7,8 @@ pluginManagement { } } +include("common") +include("fabric") +include("forge") + rootProject.name = 'modernfix' diff --git a/src/main/java/org/embeddedt/modernfix/ModernFix.java b/src/main/java/org/embeddedt/modernfix/ModernFix.java deleted file mode 100644 index 1a8942d0..00000000 --- a/src/main/java/org/embeddedt/modernfix/ModernFix.java +++ /dev/null @@ -1,181 +0,0 @@ -package org.embeddedt.modernfix; - -import it.unimi.dsi.fastutil.longs.Long2ObjectMap; -import net.minecraft.Util; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ChunkHolder; -import net.minecraft.server.level.ChunkMap; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.item.Item; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.server.ServerStartedEvent; -import net.minecraftforge.event.server.ServerStoppedEvent; -import net.minecraftforge.eventbus.api.EventPriority; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.*; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.config.ModConfig; -import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; -import net.minecraftforge.fml.event.lifecycle.FMLLoadCompleteEvent; -import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; -import net.minecraftforge.fml.loading.FMLConfig; -import net.minecraftforge.fml.loading.FMLLoader; -import net.minecraftforge.fml.util.ObfuscationReflectionHelper; -import net.minecraftforge.network.NetworkConstants; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegisterEvent; -import org.apache.commons.lang3.tuple.Pair; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.embeddedt.modernfix.classloading.ModFileScanDataDeduplicator; -import org.embeddedt.modernfix.core.ModernFixMixinPlugin; -import org.embeddedt.modernfix.core.config.ModernFixConfig; -import org.embeddedt.modernfix.entity.EntityDataIDSyncHandler; -import org.embeddedt.modernfix.packet.PacketHandler; -import org.embeddedt.modernfix.registry.ObjectHolderClearer; -import org.embeddedt.modernfix.util.ClassInfoManager; - -import java.lang.management.ManagementFactory; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.concurrent.*; -import java.util.function.BooleanSupplier; - -// The value here should match an entry in the META-INF/mods.toml file -@Mod(ModernFix.MODID) -public class ModernFix { - - // Directly reference a log4j logger. - public static final Logger LOGGER = LogManager.getLogger("ModernFix"); - - public static final String MODID = "modernfix"; - - public static ModernFix INSTANCE; - - // Used to skip computing the blockstate caches twice - public static boolean runningFirstInjection = false; - - public static CountDownLatch worldLoadSemaphore = null; - - private static ExecutorService resourceReloadService = null; - - static { - try { - if(ModernFixMixinPlugin.instance.isOptionEnabled("perf.dedicated_reload_executor.ReloadExecutor")) { - Method makeExecutorMethod = ObfuscationReflectionHelper.findMethod(Util.class, "m_137477_", String.class); - resourceReloadService = (ExecutorService)makeExecutorMethod.invoke(null, "ResourceReload"); - } else { - resourceReloadService = Util.backgroundExecutor(); - } - } catch(RuntimeException | ReflectiveOperationException e) { - LOGGER.error("Could not create resource reload executor", e); - resourceReloadService = Util.backgroundExecutor(); - } - } - - public static ExecutorService resourceReloadExecutor() { - return resourceReloadService; - } - - /** - * Simple mechanism used to delay some background processes until the client is actually in-game, to reduce - * launch time. - */ - public static void waitForWorldLoad(BooleanSupplier exitEarly) { - CountDownLatch latch = worldLoadSemaphore; - if(latch != null) { - try { - while(!latch.await(100, TimeUnit.MILLISECONDS)) { - if(exitEarly.getAsBoolean()) - return; - } - } catch(InterruptedException e) { - Thread.currentThread().interrupt(); - } - } - } - - - public ModernFix() { - INSTANCE = this; - // Register ourselves for server and other game events we are interested in - MinecraftForge.EVENT_BUS.register(this); - FMLJavaModLoadingContext.get().getModEventBus().addListener(this::commonSetup); - FMLJavaModLoadingContext.get().getModEventBus().addListener(this::onLoadComplete); - FMLJavaModLoadingContext.get().getModEventBus().addListener(this::registerItems); - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> MinecraftForge.EVENT_BUS.register(new ModernFixClient())); - ModLoadingContext.get().registerExtensionPoint(IExtensionPoint.DisplayTest.class, () -> new IExtensionPoint.DisplayTest(() -> NetworkConstants.IGNORESERVERONLY, (a, b) -> true)); - ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, ModernFixConfig.COMMON_CONFIG); - - MinecraftForge.EVENT_BUS.register(EntityDataIDSyncHandler.class); - PacketHandler.register(); - ModFileScanDataDeduplicator.deduplicate(); - } - - private void registerItems(RegisterEvent event) { - if(Boolean.getBoolean("modernfix.largeRegistryTest")) { - event.register(ForgeRegistries.Keys.ITEMS, helper -> { - Item.Properties props = new Item.Properties(); - for(int i = 0; i < 1000000; i++) { - helper.register(new ResourceLocation("modernfix", "item_" + i), new Item(props)); - } - }); - } - } - - private static boolean dfuModPresent() { - if(FMLConfig.isOptimizedDFUDisabled()) - return true; - for(String modId : new String[] { "lazydfu", "datafixerslayer" }) { - if(ModList.get().isLoaded(modId)) - return true; - } - return !FMLLoader.isProduction(); - } - - @SubscribeEvent - public void commonSetup(FMLCommonSetupEvent event) { - if(!dfuModPresent()) { - event.enqueueWork(() -> { - ModLoader.get().addWarning(new ModLoadingWarning(ModLoadingContext.get().getActiveContainer().getModInfo(), ModLoadingStage.COMMON_SETUP, "modernfix.no_lazydfu")); - }); - } - ObjectHolderClearer.clearThrowables(); - } - - @SubscribeEvent - public void onServerStarted(ServerStartedEvent event) { - if(FMLLoader.getDist() == Dist.DEDICATED_SERVER) { - float gameStartTime = ManagementFactory.getRuntimeMXBean().getUptime() / 1000f; - ModernFix.LOGGER.warn("Dedicated server took " + gameStartTime + " seconds to load"); - } - ClassInfoManager.clear(); - } - - @SubscribeEvent(priority = EventPriority.LOWEST) - public void onLoadComplete(FMLLoadCompleteEvent event) { - ClassInfoManager.clear(); - } - - @SubscribeEvent(priority = EventPriority.LOWEST) - public void onServerDead(ServerStoppedEvent event) { - /* Clear as much data from the integrated server as possible, in case a mod holds on to it */ - try { - Field updatingMapField = ObfuscationReflectionHelper.findField(ChunkMap.class, "f_140129_"); - Field visibleMapField = ObfuscationReflectionHelper.findField(ChunkMap.class, "f_140130_"); - Field pendingUnloadsField = ObfuscationReflectionHelper.findField(ChunkMap.class, "f_140131_"); - for(ServerLevel level : event.getServer().getAllLevels()) { - ChunkMap chunkMap = level.getChunkSource().chunkMap; - Long2ObjectMap map = (Long2ObjectMap)updatingMapField.get(chunkMap); - map.clear(); - map = (Long2ObjectMap)visibleMapField.get(chunkMap); - map.clear(); - map = (Long2ObjectMap)pendingUnloadsField.get(chunkMap); - map.clear(); - } - } catch(RuntimeException | IllegalAccessException e) { - ModernFix.LOGGER.error("Couldn't clear chunk data", e); - } - } -} diff --git a/src/main/java/org/embeddedt/modernfix/ModernFixClient.java b/src/main/java/org/embeddedt/modernfix/ModernFixClient.java deleted file mode 100644 index c35e7c9a..00000000 --- a/src/main/java/org/embeddedt/modernfix/ModernFixClient.java +++ /dev/null @@ -1,259 +0,0 @@ -package org.embeddedt.modernfix; - -import com.mojang.blaze3d.platform.InputConstants; -import com.mojang.datafixers.util.Pair; -import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; -import net.minecraft.client.KeyMapping; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.components.DebugScreenOverlay; -import net.minecraft.client.gui.screens.ConnectScreen; -import net.minecraft.client.gui.screens.TitleScreen; -import net.minecraftforge.client.ConfigScreenHandler; -import net.minecraftforge.client.event.CustomizeGuiOverlayEvent; -import net.minecraft.util.MemoryReserve; -import net.minecraftforge.client.event.ScreenEvent; -import net.minecraft.network.syncher.EntityDataAccessor; -import net.minecraft.network.syncher.SynchedEntityData; -import net.minecraft.world.entity.Entity; -import net.minecraftforge.client.gui.overlay.ForgeGui; -import net.minecraftforge.client.event.*; -import net.minecraftforge.client.settings.KeyConflictContext; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.TagsUpdatedEvent; -import net.minecraftforge.event.TickEvent; -import net.minecraftforge.event.level.LevelEvent; -import net.minecraftforge.event.server.ServerStartingEvent; -import net.minecraftforge.eventbus.api.EventPriority; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.IExtensionPoint; -import net.minecraftforge.fml.ModContainer; -import net.minecraftforge.fml.ModList; -import net.minecraftforge.fml.ModLoadingContext; -import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; -import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; -import net.minecraftforge.fml.util.ObfuscationReflectionHelper; -import net.minecraftforge.network.NetworkEvent; -import org.embeddedt.modernfix.core.ModernFixMixinPlugin; -import org.embeddedt.modernfix.core.config.ModernFixConfig; -import org.embeddedt.modernfix.packet.EntityIDSyncPacket; -import org.embeddedt.modernfix.screen.ModernFixConfigScreen; -import org.embeddedt.modernfix.world.IntegratedWatchdog; - -import java.lang.management.ManagementFactory; -import java.lang.reflect.Field; -import java.util.*; -import java.util.function.Supplier; - -public class ModernFixClient { - public static long worldLoadStartTime; - private static int numRenderTicks; - - public static float gameStartTimeSeconds = -1; - - private static boolean recipesUpdated, tagsUpdated = false; - - private String brandingString = null; - - public ModernFixClient() { - // clear reserve as it's not needed - MemoryReserve.release(); - if(ModernFixMixinPlugin.instance.isOptionEnabled("feature.branding.F3Screen")) { - Optional mfContainer = ModList.get().getModContainerById("modernfix"); - if(mfContainer.isPresent()) - brandingString = "ModernFix " + mfContainer.get().getModInfo().getVersion().toString(); - } - - FMLJavaModLoadingContext.get().getModEventBus().addListener(this::keyBindRegister); - ModLoadingContext.get().registerExtensionPoint( - ConfigScreenHandler.ConfigScreenFactory.class, - () -> new ConfigScreenHandler.ConfigScreenFactory((mc, screen) -> new ModernFixConfigScreen(screen)) - ); - } - - private KeyMapping configKey; - - private void keyBindRegister(RegisterKeyMappingsEvent event) { - configKey = new KeyMapping("key.modernfix.config", KeyConflictContext.UNIVERSAL, InputConstants.UNKNOWN, "key.modernfix"); - event.register(configKey); - } - - @SubscribeEvent - public void onConfigKey(TickEvent.ClientTickEvent event) { - if(event.phase == TickEvent.Phase.START && configKey.consumeClick()) { - Minecraft.getInstance().setScreen(new ModernFixConfigScreen(Minecraft.getInstance().screen)); - } - } - - public void resetWorldLoadStateMachine() { - numRenderTicks = 0; - worldLoadStartTime = -1; - recipesUpdated = false; - tagsUpdated = false; - } - - @SubscribeEvent(priority = EventPriority.LOWEST) - public void onMultiplayerConnect(ScreenEvent.Init.Pre event) { - if(event.getScreen() instanceof ConnectScreen && !event.isCanceled()) { - worldLoadStartTime = System.nanoTime(); - } else if (event.getScreen() instanceof TitleScreen && gameStartTimeSeconds < 0) { - gameStartTimeSeconds = ManagementFactory.getRuntimeMXBean().getUptime() / 1000f; - ModernFix.LOGGER.warn("Game took " + gameStartTimeSeconds + " seconds to start"); - } - } - - @SubscribeEvent(priority = EventPriority.LOW) - public void onRecipesUpdated(RecipesUpdatedEvent event) { - recipesUpdated = true; - } - - @SubscribeEvent(priority = EventPriority.LOW) - public void onTagsUpdated(TagsUpdatedEvent event) { - tagsUpdated = true; - } - - @SubscribeEvent - public void onRenderTickEnd(TickEvent.RenderTickEvent event) { - if(event.phase == TickEvent.Phase.END - && recipesUpdated - && tagsUpdated - && worldLoadStartTime != -1 - && Minecraft.getInstance().player != null - && numRenderTicks++ >= 10) { - float timeSpentLoading = ((float)(System.nanoTime() - worldLoadStartTime) / 1000000000f); - ModernFix.LOGGER.warn("Time from main menu to in-game was " + timeSpentLoading + " seconds"); - ModernFix.LOGGER.warn("Total time to load game and open world was " + (timeSpentLoading + gameStartTimeSeconds) + " seconds"); - resetWorldLoadStateMachine(); - if(ModernFix.worldLoadSemaphore != null) - ModernFix.worldLoadSemaphore.countDown(); - } - } - - @SubscribeEvent(priority = EventPriority.HIGHEST) - public void onRenderOverlay(CustomizeGuiOverlayEvent.DebugText event) { - if(brandingString != null && Minecraft.getInstance().options.renderDebug) { - event.getLeft().add(""); - event.getLeft().add(brandingString); - } - } - - @SubscribeEvent - public void onDisconnect(LevelEvent.Unload event) { - if(event.getLevel().isClientSide()) { - DebugScreenOverlay overlay = ObfuscationReflectionHelper.getPrivateValue(ForgeGui.class, (ForgeGui)Minecraft.getInstance().gui, "debugOverlay"); - if(overlay != null) { - Minecraft.getInstance().tell(overlay::clearChunkCache); - } - } - } - - /** - * 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, Supplier context) { - Map, List>> info = packet.getFieldInfo(); - context.get().enqueueWork(() -> { - 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(); - } - }); - - context.get().setPacketHandled(true); - } - - @SubscribeEvent - public void onServerStarted(ServerStartingEvent event) { - if(ModernFixConfig.INTEGRATED_SERVER_WATCHDOG.get()) { - IntegratedWatchdog watchdog = new IntegratedWatchdog(event.getServer()); - watchdog.start(); - } - - } -} diff --git a/src/main/java/org/embeddedt/modernfix/blockstate/BlockStateCacheHandler.java b/src/main/java/org/embeddedt/modernfix/blockstate/BlockStateCacheHandler.java deleted file mode 100644 index 1c6c83c0..00000000 --- a/src/main/java/org/embeddedt/modernfix/blockstate/BlockStateCacheHandler.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.embeddedt.modernfix.blockstate; - -import com.google.common.base.Stopwatch; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockBehaviour; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.fml.loading.FMLLoader; -import org.embeddedt.modernfix.ModernFix; -import org.embeddedt.modernfix.core.config.ModernFixConfig; -import org.embeddedt.modernfix.duck.IBlockState; -import org.embeddedt.modernfix.util.BakeReason; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.concurrent.TimeUnit; - -public class BlockStateCacheHandler { - private static boolean needToBake() { - BakeReason reason = BakeReason.getCurrentBakeReason(); - return !(reason == BakeReason.FREEZE /* startup */ - || reason == BakeReason.REVERT /* crash, in which case cache likely doesn't matter, or exiting world */ - || reason == BakeReason.REMOTE_SNAPSHOT_INJECT /* will be handled when tags are reloaded */ - || (reason == BakeReason.LOCAL_SNAPSHOT_INJECT && FMLLoader.getDist() == Dist.CLIENT /* will be handled when tags are reloaded */)); - } - - public static void rebuildParallel(boolean force) { - synchronized (BlockBehaviour.BlockStateBase.class) { - for (BlockState blockState : Block.BLOCK_STATE_REGISTRY) { - ((IBlockState)blockState).clearCache(); - } - } - } -} diff --git a/src/main/java/org/embeddedt/modernfix/core/ModernFixMixinPlugin.java b/src/main/java/org/embeddedt/modernfix/core/ModernFixMixinPlugin.java deleted file mode 100644 index 1a829323..00000000 --- a/src/main/java/org/embeddedt/modernfix/core/ModernFixMixinPlugin.java +++ /dev/null @@ -1,179 +0,0 @@ -package org.embeddedt.modernfix.core; - -import cpw.mods.modlauncher.api.INameMappingService; -import net.minecraftforge.fml.util.ObfuscationReflectionHelper; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.embeddedt.modernfix.classloading.FastAccessTransformerList; -import org.embeddedt.modernfix.core.config.ModernFixEarlyConfig; -import org.embeddedt.modernfix.core.config.Option; -import org.embeddedt.modernfix.dfu.DFUBlaster; -import org.embeddedt.modernfix.load.ModWorkManagerQueue; -import org.embeddedt.modernfix.util.DummyList; -import org.objectweb.asm.Opcodes; -import org.objectweb.asm.tree.*; -import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; -import org.spongepowered.asm.mixin.extensibility.IMixinInfo; -import org.spongepowered.asm.mixin.injection.struct.InjectionInfo; -import org.spongepowered.asm.mixin.injection.struct.InjectorGroupInfo; - -import java.io.File; -import java.lang.reflect.Field; -import java.util.*; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -public class ModernFixMixinPlugin implements IMixinConfigPlugin { - private static final String MIXIN_PACKAGE_ROOT = "org.embeddedt.modernfix.mixin."; - - private final Logger logger = LogManager.getLogger("ModernFix"); - public static ModernFixEarlyConfig config = null; - public static ModernFixMixinPlugin instance; - - public ModernFixMixinPlugin() { - instance = this; - try { - config = ModernFixEarlyConfig.load(new File("./config/modernfix-mixins.properties")); - } catch (Exception e) { - throw new RuntimeException("Could not load configuration file for ModernFix", e); - } - - this.logger.info("Loaded configuration file for ModernFix: {} options available, {} override(s) found", - config.getOptionCount(), config.getOptionOverrideCount()); - - if(ModernFixEarlyConfig.OPTIFINE_PRESENT) - this.logger.fatal("OptiFine detected. Use of ModernFix with OptiFine is not supported due to its impact on launch time and breakage of Forge features."); - - FastAccessTransformerList.attemptReplace(); - DFUBlaster.blastMaps(); - - /* https://github.com/FabricMC/Mixin/pull/99 */ - try { - Field groupMembersField = InjectorGroupInfo.class.getDeclaredField("members"); - groupMembersField.setAccessible(true); - Field noGroupField = InjectorGroupInfo.Map.class.getDeclaredField("NO_GROUP"); - noGroupField.setAccessible(true); - InjectorGroupInfo noGroup = (InjectorGroupInfo)noGroupField.get(null); - groupMembersField.set(noGroup, new DummyList<>()); - } catch(RuntimeException | ReflectiveOperationException e) { - logger.error("Failed to patch mixin memory leak", e); - } - } - - @Override - public void onLoad(String s) { - - } - - @Override - public String getRefMapperConfig() { - return null; - } - - @Override - public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { - if (!mixinClassName.startsWith(MIXIN_PACKAGE_ROOT)) { - this.logger.error("Expected mixin '{}' to start with package root '{}', treating as foreign and " + - "disabling!", mixinClassName, MIXIN_PACKAGE_ROOT); - - return false; - } - - String mixin = mixinClassName.substring(MIXIN_PACKAGE_ROOT.length()); - if(!isOptionEnabled(mixin)) - return false; - String disabledBecauseMod = config.getPermanentlyDisabledMixins().get(mixin); - return disabledBecauseMod == null; - } - - public boolean isOptionEnabled(String mixin) { - Option option = config.getEffectiveOptionForMixin(mixin); - - if (option == null) { - this.logger.error("No rules matched mixin '{}', treating as foreign and disabling!", mixin); - - return false; - } - - if (option.isOverridden()) { - String source = "[unknown]"; - - if (option.isUserDefined()) { - source = "user configuration"; - } else if (option.isModDefined()) { - source = "mods [" + String.join(", ", option.getDefiningMods()) + "]"; - } - - if (option.isEnabled()) { - this.logger.warn("Force-enabling mixin '{}' as rule '{}' (added by {}) enables it", mixin, - option.getName(), source); - } else { - this.logger.warn("Force-disabling mixin '{}' as rule '{}' (added by {}) disables it and children", mixin, - option.getName(), source); - } - } - - return option.isEnabled(); - } - @Override - public void acceptTargets(Set myTargets, Set otherTargets) { - - } - - @Override - public List getMixins() { - return null; - } - - @Override - public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { - - } - - @Override - public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { - if(mixinClassName.equals("org.embeddedt.modernfix.mixin.perf.compress_blockstate.BlockStateBaseMixin")) { - // Delete unused fields off BlockStateBase - Set fieldsToDelete = Stream.of( - "field_235702_f_", // isAir - "field_235703_g_", // material - "field_235705_i_", // destroySpeed - "field_235706_j_", // requiresCorrectToolForDrops - "field_235707_k_", // canOcclude - "field_235708_l_", // isRedstoneConductor - "field_235709_m_", // isSuffocating - "field_235710_n_", // isViewBlocking - "field_235711_o_", // hasPostProcess - "field_235712_p_" // emissiveRendering - ).map(name -> ObfuscationReflectionHelper.remapName(INameMappingService.Domain.FIELD, name)).collect(Collectors.toSet()); - targetClass.fields.removeIf(field -> { - if(fieldsToDelete.contains(field.name)) { - logger.info("Removing " + field.name); - return true; - } - return false; - }); - for(MethodNode m : targetClass.methods) { - if(m.name.equals("")) { - ListIterator iter = m.instructions.iterator(); - while(iter.hasNext()) { - AbstractInsnNode node = iter.next(); - if(node.getOpcode() == Opcodes.PUTFIELD) { - if(fieldsToDelete.contains(((FieldInsnNode)node).name)) { - iter.remove(); - } - } - } - } - } - } else if(mixinClassName.equals("org.embeddedt.modernfix.mixin.bugfix.chunk_deadlock.valhesia.BlockStateBaseMixin")) { - // We need to destroy Valhelsia's callback so it can never run getBlockState - for(MethodNode m : targetClass.methods) { - if(m.name.contains("valhelsia_placeDousedTorch")) { - m.instructions.clear(); - m.instructions.add(new InsnNode(Opcodes.RETURN)); - } - } - } - } -} \ No newline at end of file diff --git a/src/main/java/org/embeddedt/modernfix/core/config/ModernFixConfig.java b/src/main/java/org/embeddedt/modernfix/core/config/ModernFixConfig.java deleted file mode 100644 index 799814fc..00000000 --- a/src/main/java/org/embeddedt/modernfix/core/config/ModernFixConfig.java +++ /dev/null @@ -1,72 +0,0 @@ -package org.embeddedt.modernfix.core.config; - -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableSet; -import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.common.ForgeConfigSpec; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.config.ModConfig; -import net.minecraftforge.fml.event.config.ModConfigEvent; -import org.embeddedt.modernfix.ModernFix; - -import java.util.Collections; -import java.util.List; -import java.util.Set; -import java.util.function.Predicate; -import java.util.stream.Collectors; - -@Mod.EventBusSubscriber(modid = ModernFix.MODID, bus = Mod.EventBusSubscriber.Bus.MOD) -public class ModernFixConfig { - private static final ForgeConfigSpec.Builder COMMON_BUILDER = new ForgeConfigSpec.Builder(); - public static ForgeConfigSpec COMMON_CONFIG; - - public static ForgeConfigSpec.ConfigValue> BLACKLIST_ASYNC_JEI_PLUGINS; - - public static ForgeConfigSpec.IntValue INTEGRATED_SERVER_PRIORITY; - public static ForgeConfigSpec.BooleanValue ENABLE_DEBUG_RELOADER; - - public static ForgeConfigSpec.BooleanValue REBUILD_BLOCKSTATES_ASYNC; - public static ForgeConfigSpec.BooleanValue INTEGRATED_SERVER_WATCHDOG; - - public static Set jeiPluginBlacklist; - - static { - Predicate locationValidator = o -> o instanceof String && ((String)o).contains(":"); - BLACKLIST_ASYNC_JEI_PLUGINS = COMMON_BUILDER - .comment("These JEI plugins will be loaded on the main thread") - .defineList("blacklist_async_jei_plugins", ImmutableList.of( - "jepb:jei_plugin" - ), locationValidator); - INTEGRATED_SERVER_PRIORITY = COMMON_BUILDER.comment("Thread priority to use for the integrated server. By default this is one less than the client thread, to help prevent the server from lowering FPS.").defineInRange("integratedServerPriority", 4, 1, 10); - ENABLE_DEBUG_RELOADER = COMMON_BUILDER - .comment("Whether Minecraft's built-in profiling logic should be enabled for resource reloading. Can help with diagnosing world load times.") - .define("enable_debug_reloader", false); - REBUILD_BLOCKSTATES_ASYNC = COMMON_BUILDER - .comment("Rebuild blockstate cache asynchronously. Should work with most mods, but can be disabled.") - .define("rebuild_blockstate_cache_async", true); - INTEGRATED_SERVER_WATCHDOG = COMMON_BUILDER - .comment("Automatically output a thread dump if the integrated server spends too long on one tick") - .define("integrated_server_watchdog", true); - } - - static { - COMMON_CONFIG = COMMON_BUILDER.build(); - } - - @SubscribeEvent - public static void onModConfigEvent(final ModConfigEvent configEvent) { - if (configEvent.getConfig().getSpec() == COMMON_CONFIG) { - bakeConfig(); - } - } - - public static void bakeConfig() { - jeiPluginBlacklist = BLACKLIST_ASYNC_JEI_PLUGINS.get().stream().map(ResourceLocation::new).collect(Collectors.toSet()); - } - - public static boolean isLoaded() { - return COMMON_CONFIG.isLoaded(); - } - -} diff --git a/src/main/java/org/embeddedt/modernfix/dynamicresources/ResourcePackHandler.java b/src/main/java/org/embeddedt/modernfix/dynamicresources/ResourcePackHandler.java deleted file mode 100644 index 35df07b7..00000000 --- a/src/main/java/org/embeddedt/modernfix/dynamicresources/ResourcePackHandler.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.embeddedt.modernfix.dynamicresources; - -import dev.latvian.mods.kubejs.script.data.KubeJSResourcePack; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.packs.PackResources; -import net.minecraft.server.packs.resources.ResourceManager; -import net.minecraftforge.fml.ModList; -import org.embeddedt.modernfix.util.FileUtil; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.function.Predicate; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -public class ResourcePackHandler { - private static final List packHandlers = new ArrayList<>(); - public static Collection getExtraResources(ResourceManager manager, String path, Predicate matchPredicate) { - final String normalizedPath = FileUtil.normalize(path); - return manager.listPacks().flatMap(pack -> packHandlers.stream().flatMap(handler -> { - if(handler.shouldHandle(pack)) { - return handler.getExtraResources(pack, normalizedPath, matchPredicate); - } else - return Stream.of(); - })).collect(Collectors.toList()); - } - - interface PackHandler { - Stream getExtraResources(PackResources pack, String path, Predicate matchPredicate); - boolean shouldHandle(PackResources pack); - } - - static class KubeJSPackHandler implements PackHandler { - - @Override - public Stream getExtraResources(PackResources pack, String path, Predicate matchPredicate) { - KubeJSResourcePack p = (KubeJSResourcePack)pack; - return p.getCachedResources().keySet().stream() - .filter(l -> l.getPath().startsWith(path)) - .filter(l -> matchPredicate.test(l.getPath())); - } - - @Override - public boolean shouldHandle(PackResources pack) { - return pack instanceof KubeJSResourcePack; - } - } - - static { - if(ModList.get().isLoaded("kubejs")) { - packHandlers.add(new KubeJSPackHandler()); - } - } -} diff --git a/src/main/java/org/embeddedt/modernfix/entity/EntityDataIDSyncHandler.java b/src/main/java/org/embeddedt/modernfix/entity/EntityDataIDSyncHandler.java deleted file mode 100644 index ae97f71d..00000000 --- a/src/main/java/org/embeddedt/modernfix/entity/EntityDataIDSyncHandler.java +++ /dev/null @@ -1,73 +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.world.entity.Entity; -import net.minecraftforge.event.OnDatapackSyncEvent; -import net.minecraftforge.eventbus.api.EventPriority; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.util.ObfuscationReflectionHelper; -import net.minecraftforge.network.PacketDistributor; -import net.minecraftforge.server.ServerLifecycleHooks; -import org.embeddedt.modernfix.ModernFix; -import org.embeddedt.modernfix.packet.EntityIDSyncPacket; -import org.embeddedt.modernfix.packet.PacketHandler; - -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class EntityDataIDSyncHandler { - private static Map, List>> fieldsToSyncMap; - @SubscribeEvent(priority = EventPriority.HIGHEST) - @SuppressWarnings("unchecked") - public static void onDatapackSyncEvent(OnDatapackSyncEvent event) { - if(event.getPlayer() != null) { - if(!ServerLifecycleHooks.getCurrentServer().isDedicatedServer() && event.getPlayerList().getPlayerCount() == 0) { - ModernFix.LOGGER.debug("Not syncing IDs on integrated server"); - return; - } - /* Compute the current set of serializer IDs in use and send them */ - try { - if(fieldsToSyncMap == null) { - fieldsToSyncMap = new HashMap<>(); - Field entityPoolField = ObfuscationReflectionHelper.findField(SynchedEntityData.class, "f_135343_"); - Map, Integer> entityPoolMap = (Map, Integer>)entityPoolField.get(null); - 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"); - PacketHandler.INSTANCE.send(PacketDistributor.PLAYER.with(event::getPlayer), packet); - } catch(ObfuscationReflectionHelper.UnableToFindFieldException | ReflectiveOperationException e) { - e.printStackTrace(); - } - } - } -} diff --git a/src/main/java/org/embeddedt/modernfix/entity/ErroredEntityRenderer.java b/src/main/java/org/embeddedt/modernfix/entity/ErroredEntityRenderer.java deleted file mode 100644 index 14e97369..00000000 --- a/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/src/main/java/org/embeddedt/modernfix/mixin/core/MinecraftMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/core/MinecraftMixin.java deleted file mode 100644 index c02ccbe5..00000000 --- a/src/main/java/org/embeddedt/modernfix/mixin/core/MinecraftMixin.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.embeddedt.modernfix.mixin.core; - -import net.minecraft.client.Minecraft; -import net.minecraft.server.WorldStem; -import net.minecraft.server.packs.repository.PackRepository; -import net.minecraft.world.level.storage.LevelStorageSource; -import org.embeddedt.modernfix.ModernFix; -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; - -import java.util.concurrent.CountDownLatch; -import java.util.function.Function; - -@Mixin(Minecraft.class) -@ClientOnlyMixin -public class MinecraftMixin { - @Inject(method = "m_231380_", at = @At("HEAD"), remap = false) - private void setLatch(String string, LevelStorageSource.LevelStorageAccess arg, PackRepository arg2, WorldStem arg3, CallbackInfo ci) { - ModernFix.worldLoadSemaphore = new CountDownLatch(1); - } -} diff --git a/src/main/java/org/embeddedt/modernfix/mixin/feature/measure_time/ReloadableServerResourcesMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/feature/measure_time/ReloadableServerResourcesMixin.java deleted file mode 100644 index 7f22fdac..00000000 --- a/src/main/java/org/embeddedt/modernfix/mixin/feature/measure_time/ReloadableServerResourcesMixin.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.embeddedt.modernfix.mixin.feature.measure_time; - -import net.minecraft.server.ReloadableServerResources; -import org.embeddedt.modernfix.core.config.ModernFixConfig; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.ModifyArg; - -@Mixin(ReloadableServerResources.class) -public class ReloadableServerResourcesMixin { - /** - * @author embeddedt - * @reason add ability to use this feature in modpacks - */ - @ModifyArg(method = "loadResources", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/packs/resources/SimpleReloadInstance;create(Lnet/minecraft/server/packs/resources/ResourceManager;Ljava/util/List;Ljava/util/concurrent/Executor;Ljava/util/concurrent/Executor;Ljava/util/concurrent/CompletableFuture;Z)Lnet/minecraft/server/packs/resources/ReloadInstance;"), index = 5) - private static boolean enableDebugReloader(boolean bl) { - return bl || ModernFixConfig.ENABLE_DEBUG_RELOADER.get(); - } -} diff --git a/src/main/java/org/embeddedt/modernfix/mixin/feature/reduce_loading_screen_freezes/ModelBakeryMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/feature/reduce_loading_screen_freezes/ModelBakeryMixin.java deleted file mode 100644 index 8297b278..00000000 --- a/src/main/java/org/embeddedt/modernfix/mixin/feature/reduce_loading_screen_freezes/ModelBakeryMixin.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.embeddedt.modernfix.mixin.feature.reduce_loading_screen_freezes; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.resources.model.ModelBakery; -import net.minecraft.Util; -import net.minecraftforge.fml.loading.progress.StartupMessageManager; -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.Redirect; - -import java.util.Set; -import java.util.concurrent.CompletableFuture; -import java.util.function.Consumer; - -@Mixin(ModelBakery.class) -@ClientOnlyMixin -public class ModelBakeryMixin { - @Redirect(method = "uploadTextures", at = @At(value = "INVOKE", target = "Ljava/util/Set;forEach(Ljava/util/function/Consumer;)V", ordinal = 0)) - private void bakeAndTickGUI(Set instance, Consumer consumer) { - StartupMessageManager.mcLoaderConsumer().ifPresent(c -> c.accept("Baking models")); - CompletableFuture modelBakingFuture = CompletableFuture.runAsync(() -> { - instance.forEach(consumer); - }, Util.backgroundExecutor()); - /* allow the GUI to continue running */ - Minecraft.getInstance().managedBlock(modelBakingFuture::isDone); - } -} diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/async_jei/InputConstantsMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/perf/async_jei/InputConstantsMixin.java deleted file mode 100644 index 304aafaa..00000000 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/async_jei/InputConstantsMixin.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.embeddedt.modernfix.mixin.perf.async_jei; - -import com.mojang.blaze3d.platform.InputConstants; -import com.mojang.blaze3d.systems.RenderSystem; -import org.embeddedt.modernfix.annotation.RequiresMod; -import org.lwjgl.glfw.GLFW; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -@Mixin(InputConstants.class) -@RequiresMod("jei") -public class InputConstantsMixin { - @Redirect(method = "isKeyDown", at = @At(value = "INVOKE", target = "Lorg/lwjgl/glfw/GLFW;glfwGetKey(JI)I", remap = false)) - private static int offThreadKeyFetch(long win, int k) { - if(RenderSystem.isOnRenderThreadOrInit()) - return GLFW.glfwGetKey(win, k); - else - return 0; - } -} diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_entity_renderers/EntityRenderersMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_entity_renderers/EntityRenderersMixin.java deleted file mode 100644 index 608cb8fc..00000000 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_entity_renderers/EntityRenderersMixin.java +++ /dev/null @@ -1,128 +0,0 @@ -package org.embeddedt.modernfix.mixin.perf.dynamic_entity_renderers; - -import com.google.common.cache.CacheBuilder; -import com.google.common.cache.CacheLoader; -import com.google.common.cache.LoadingCache; -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.Registry; -import net.minecraft.world.entity.EntityType; -import org.embeddedt.modernfix.ModernFix; -import org.embeddedt.modernfix.entity.ErroredEntityRenderer; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -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.Collection; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ExecutionException; - -@Mixin(EntityRenderers.class) -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) { - Map, EntityRendererProvider> rendererProviders = PROVIDERS; - LoadingCache, EntityRenderer> rendererMap = CacheBuilder.newBuilder() - .build(new CacheLoader<>() { - @Override - public EntityRenderer load(EntityType key) throws Exception { - EntityRendererProvider provider = rendererProviders.get(key); - synchronized(EntityRenderers.class) { - EntityRenderer renderer; - try { - if(provider == null) - throw new RuntimeException("Provider not registered"); - renderer = provider.create(context); - ModernFix.LOGGER.debug("Loaded entity {}", Registry.ENTITY_TYPE.getKey(key)); - } catch(RuntimeException e) { - ModernFix.LOGGER.error("Failed to create entity model for " + Registry.ENTITY_TYPE.getKey(key) + ":", e); - renderer = new ErroredEntityRenderer<>(context); - } - return renderer; - } - } - }); - cir.setReturnValue(new Map, EntityRenderer>() { - @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 { - return rendererMap.get((EntityType)o); - } catch(ExecutionException e) { - throw new RuntimeException(e); - } - } - - @Nullable - @Override - public EntityRenderer put(EntityType entityType, EntityRenderer entityRenderer) { - EntityRenderer old = rendererMap.getIfPresent(entityType); - rendererMap.put(entityType, entityRenderer); - return old; - } - - @Override - public EntityRenderer remove(Object o) { - EntityRenderer r = rendererMap.getIfPresent(o); - rendererMap.invalidate(o); - return r; - } - - @Override - public void putAll(@NotNull Map, ? extends EntityRenderer> map) { - rendererMap.putAll(map); - } - - @Override - public void clear() { - rendererMap.invalidateAll(); - } - - @NotNull - @Override - public Set> keySet() { - return rendererProviders.keySet(); - } - - @NotNull - @Override - public Collection> values() { - return rendererMap.asMap().values(); - } - - @NotNull - @Override - public Set, EntityRenderer>> entrySet() { - return rendererMap.asMap().entrySet(); - } - }); - } -} diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg deleted file mode 100644 index e7b00b3b..00000000 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ /dev/null @@ -1,32 +0,0 @@ -public net.minecraft.client.Minecraft$ExperimentalDialogType -public net.minecraft.client.renderer.RenderType$CompositeRenderType -public net.minecraft.client.renderer.RenderType$CompositeRenderType (Ljava/lang/String;Lcom/mojang/blaze3d/vertex/VertexFormat;IIZZLnet/minecraft/client/renderer/RenderType$CompositeState;)V -public net.minecraft.world.level.block.state.BlockBehaviour$BlockStateBase$Cache -public net.minecraft.world.phys.shapes.VoxelShape (Lnet/minecraft/util/math/shapes/VoxelShapePart;)V # -public net.minecraft.client.resources.model.ModelBakery$BlockStateDefinitionException -public net.minecraft.client.renderer.model.ModelBakery field_217849_F # unbakedCache -public net.minecraft.client.renderer.texture.Stitcher$Holder -public net.minecraft.util.thread.BlockableEventLoop m_18699_()V # runAllTasks -public net.minecraft.server.MinecraftServer f_129726_ # nextTickTime -public net.minecraft.client.Minecraft f_90999_ # progressListener -public-f net.minecraft.network.syncher.EntityDataAccessor f_135010_ # id -public-f net.minecraft.network.syncher.SynchedEntityData f_135345_ # itemsById -public-f net.minecraft.network.syncher.SynchedEntityData f_135346_ # lock -public net.minecraft.client.gui.screens.worldselection.WorldGenSettingsComponent m_233042_(Lnet/minecraft/client/gui/screens/worldselection/WorldCreationContext;)V # updateSettings -public net.minecraft.world.level.block.state.BlockBehaviour f_60439_ # properties -public net.minecraft.world.level.block.state.BlockBehaviour$Properties f_60882_ # material -public net.minecraft.world.level.block.state.BlockBehaviour$Properties f_60895_ # canOcclude -public net.minecraft.world.level.block.state.BlockBehaviour$Properties f_60896_ # isAir -public net.minecraft.world.level.block.state.BlockBehaviour$Properties f_60898_ # isRedstoneConductor -public net.minecraft.world.level.block.state.BlockBehaviour$Properties f_60899_ # isSuffocating -public net.minecraft.world.level.block.state.BlockBehaviour$Properties f_60900_ # isViewBlocking -public net.minecraft.world.level.block.state.BlockBehaviour$Properties f_60901_ # hasPostProcess -public net.minecraft.world.level.block.state.BlockBehaviour$Properties f_60902_ # emissiveRendering -public net.minecraft.world.level.block.state.BlockBehaviour$Properties f_60889_ # requiresCorrectToolForDrops -public net.minecraft.world.level.block.state.BlockBehaviour$Properties f_60888_ # destroyTime -public net.minecraft.server.level.ServerChunkCache$MainThreadExecutor -public net.minecraft.nbt.CompoundTag (Ljava/util/Map;)V # -public net.minecraft.client.renderer.texture.TextureAtlasSprite (Lnet/minecraft/client/renderer/texture/TextureAtlas;Lnet/minecraft/client/renderer/texture/TextureAtlasSprite$Info;IIIIILcom/mojang/blaze3d/platform/NativeImage;)V # -public net.minecraft.server.level.DistanceManager m_140792_(Lnet/minecraft/server/level/TicketType;Lnet/minecraft/world/level/ChunkPos;ILjava/lang/Object;)V # addTicket -public net.minecraft.server.level.ChunkMap$DistanceManager -public net.minecraft.resources.ResourceKey (Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;)V #