├── src ├── shim │ └── java │ │ ├── org │ │ └── joml │ │ │ └── Matrix4f.java │ │ └── net │ │ └── minecraft │ │ ├── class_5819.java │ │ ├── class_5944.java │ │ ├── class_7775.java │ │ ├── class_6850.java │ │ ├── class_5636.java │ │ └── class_846.java └── main │ ├── resources │ ├── assets │ │ └── optifabric │ │ │ └── icon.png │ ├── optifabric.compat.age-of-exile.mixins.json │ ├── optifabric.compat.voxelmap.mixins.json │ ├── optifabric.optifine.new-mixins.json │ ├── optifabric.optifine.old-mixins.json │ ├── optifabric.compat.ae2.mixins.json │ ├── optifabric.compat.fabric-rendering-data.mixins.json │ ├── optifabric.compat.hctm.mixins.json │ ├── optifabric.compat.phormat.mixins.json │ ├── optifabric.compat.pswg.mixins.json │ ├── optifabric.compat.stacc.mixins.json │ ├── optifabric.compat.amecsapi.mixins.json │ ├── optifabric.compat.carpet.mixins.json │ ├── optifabric.compat.chat-heads.mixins.json │ ├── optifabric.compat.mubble.mixins.json │ ├── optifabric.compat.replaymod.mixins.json │ ├── optifabric.compat.aether.mixins.json │ ├── optifabric.compat.cloth.mixins.json │ ├── optifabric.compat.cloth.new-mixins.json │ ├── optifabric.compat.cloth.newer-mixins.json │ ├── optifabric.compat.dawn.old-mixins.json │ ├── optifabric.compat.dawn.older-mixins.json │ ├── optifabric.compat.replaymod.new-mixins.json │ ├── optifabric.compat.stacc.old-mixins.json │ ├── optifabric.compat.architectury-A.mixins.json │ ├── optifabric.compat.astromine.mixins.json │ ├── optifabric.compat.charm-new.mixins.json │ ├── optifabric.compat.charm-old.mixins.json │ ├── optifabric.compat.clothesline.mixins.json │ ├── optifabric.compat.fabric-item-api.mixins.json │ ├── optifabric.compat.frex.mixins.json │ ├── optifabric.compat.images.mixins.json │ ├── optifabric.compat.origins.mixins.json │ ├── optifabric.compat.pswg.extra-mixins.json │ ├── optifabric.compat.bannerpp.mixins.json │ ├── optifabric.compat.carpet.extra-mixins.json │ ├── optifabric.compat.charm-older.mixins.json │ ├── optifabric.compat.charm-plus.mixins.json │ ├── optifabric.compat.now-playing.mixins.json │ ├── optifabric.compat.staffofbuilding.mixins.json │ ├── optifabric.compat.custom-fog.mixins.json │ ├── optifabric.compat.fabric-screen-api.mixins.json │ ├── optifabric.compat.frex-old.mixins.json │ ├── optifabric.compat.full-slabs.mixins.json │ ├── optifabric.compat.images-old.mixins.json │ ├── optifabric.compat.indigo.extra-mixins.json │ ├── optifabric.compat.multiconnect.mixins.json │ ├── optifabric.compat.origins.extra-mixins.json │ ├── optifabric.compat.trumpet-skeleton.mixins.json │ ├── optifabric.compat.fabric-screen-api.new-mixins.json │ ├── optifabric.compat.images-older.mixins.json │ ├── optifabric.compat.smooth-chunks.mixins.json │ ├── optifabric.compat.zoomify.mixins.json │ ├── optifabric.mixins.json │ ├── optifabric.compat.cullparticles.mixins.json │ ├── optifabric.compat.dawn.mixins.json │ ├── optifabric.compat.enhancedcelestials.mixins.json │ ├── optifabric.compat.fabric-rendering.mixins.json │ ├── optifabric.compat.fabric-screen-api.new3er-mixins.json │ ├── optifabric.compat.fabric-screen-api.new4er-mixins.json │ ├── optifabric.compat.fabric-screen-api.new5er-mixins.json │ ├── optifabric.compat.fabric-screen-api.newer-mixins.json │ ├── optifabric.compat.replaymod.newer-mixins.json │ ├── optifabric.compat.apoli.mixins.json │ ├── optifabric.compat.fabric-screen-api.newerer-mixins.json │ ├── optifabric.compat.sandwichable.mixins.json │ ├── optifabric.compat.architectury-B.mixins.json │ ├── optifabric.compat.carpet.extra-new-mixins.json │ ├── optifabric.compat.enhancedcelestials.new-mixins.json │ ├── optifabric.compat.fabric-rendering.extra-mixins.json │ ├── optifabric.compat.fabric-rendering.new-mixins.json │ ├── optifabric.compat.sandwichable.new-mixins.json │ ├── optifabric.compat.architectury-AB.new4er-mixins.json │ ├── optifabric.compat.charm.mixins.json │ ├── optifabric.compat.sandwichable-old.mixins.json │ ├── optifabric.compat.fabric-block-view-api.mixins.json │ ├── optifabric.compat.architectury-AB.new-mixins.json │ ├── optifabric.compat.architectury-AB.newererer-mixins.json │ ├── optifabric.compat.fabric-lifecycle-events.mixins.json │ ├── optifabric.compat.apoli-newerer.extra-mixins.json │ ├── optifabric.compat.architectury-AB.newer-mixins.json │ ├── optifabric.compat.fabric-lifecycle-events.new-mixins.json │ ├── optifabric.compat.apoli-new.mixins.json │ ├── optifabric.compat.apoli-newerer.mixins.json │ ├── optifabric.compat.fabric-model-loading-api.mixins.json │ ├── optifabric.compat.additional-entity-attributes.mixins.json │ ├── optifabric.compat.borderlessmining.mixins.json │ ├── optifabric.compat.architectury-AB.newerer-mixins.json │ ├── optifabric.compat.borderlessmining.new-mixins.json │ ├── optifabric.compat.fabric-rendering-data.extra-mixins.json │ ├── optifabric.compat.fabric-rendering-data.bonus-mixins.json │ ├── optifabric.optifine.mixins.json │ ├── optifabric.compat.apoli-newer.mixins.json │ ├── optifabric.compat.fabric-renderer-api.mixins.json │ ├── optifabric.compat.indigo.new-mixins.json │ ├── optifabric.compat.indigo.mixins.json │ ├── optifabric.compat.indigo.newer-mixins.json │ ├── optifabric.compat.indigo.old-mixins.json │ ├── optifabric.compat.fabric-renderer-api.new-mixins.json │ └── fabric.mod.json │ └── java │ └── me │ └── modmuss50 │ └── optifabric │ ├── patcher │ ├── fixes │ │ ├── ClassFixer.java │ │ ├── ChunkDataFix.java │ │ ├── AmbientOcclusionCalculatorFix.java │ │ └── SpriteAtlasTextureFix.java │ └── Lambda.java │ ├── compat │ ├── borderlessmining │ │ ├── MagicMixinBridge.java │ │ ├── BorderlessMiningNewMixinPlugin.java │ │ ├── mixin │ │ │ ├── VideoOptionsScreenMixin.java │ │ │ ├── OptionFullscreenResolutionNewMixin.java │ │ │ └── OptionFullscreenResolutionMixin.java │ │ └── BorderlessMiningMixinPlugin.java │ ├── zoomify │ │ └── mixin │ │ │ └── GameRendererMixin.java │ ├── cullparticles │ │ └── mixin │ │ │ └── ParticleManagerMixin.java │ ├── DevOnly.java │ ├── Shim.java │ ├── PlacatingSurrogate.java │ ├── fabricrendering │ │ ├── RenderingNewMixinPlugin.java │ │ └── mixin │ │ │ ├── ShaderProgramMixin.java │ │ │ ├── WorldRendererMixin.java │ │ │ └── WorldRendererNewMixin.java │ ├── fabriclifecycleevents │ │ ├── LifecycleNewMixinPlugin.java │ │ └── mixin │ │ │ ├── ClientChunkManagerNewMixin.java │ │ │ └── ClientChunkManagerMixin.java │ ├── InterceptingMixin.java │ ├── ae2 │ │ └── mixin │ │ │ ├── BakedQuadAccess.java │ │ │ └── FaceRotatingModelMixin.java │ ├── indigo │ │ ├── mixin │ │ │ ├── ChunkCacheOFAccess.java │ │ │ ├── ChunkDataMixin.java │ │ │ ├── ChunkCacheOFNewMixin.java │ │ │ ├── BridgedChunkRendererRegionMixin.java │ │ │ └── ChunkCacheOFMixin.java │ │ ├── ChunkRendererRegionAccess.java │ │ └── IndigoOldMixinPlugin.java │ ├── fabricscreenapi │ │ └── Events.java │ ├── frex │ │ ├── mixin │ │ │ └── ChunkCacheOF.java │ │ └── BridgedChunkRendererRegion.java │ ├── EmptyMixinPlugin.java │ ├── fabricitemapi │ │ └── mixin │ │ │ └── MobEntityMixin.java │ ├── voxelmap │ │ └── mixin │ │ │ └── CustomColorsMixin.java │ ├── ageofexile │ │ └── mixin │ │ │ └── InGameHudMixin.java │ ├── fabricblockview │ │ ├── BlockViewMixinPlugin.java │ │ └── mixin │ │ │ └── ChunkRendererRegionBuilderMixin.java │ ├── fabricrenderingdata │ │ ├── mixin │ │ │ ├── ChunkCacheOFMixin.java │ │ │ ├── BridgedChunkRendererRegionMixin.java │ │ │ ├── ChunkRendererRegionMixin.java │ │ │ └── ChunkRendererRegionBuilderMixin.java │ │ ├── RenderingDataExtraMixinPlugin.java │ │ └── RenderingDataBonusMixinPlugin.java │ ├── fabricrenderingfluids │ │ └── FluidRendererFixExternal.java │ ├── carpet │ │ └── mixin │ │ │ ├── WorldRendererMixin.java │ │ │ ├── LevelRendererExtraMixin.java │ │ │ └── WorldRendererExtraMixin.java │ ├── pswg │ │ ├── mixin │ │ │ └── FrameBufferMixin.java │ │ └── StarWarsMixinPlugin.java │ ├── fabricrendererapi │ │ ├── RendererMixinPlugin.java │ │ └── mixin │ │ │ ├── ConnectedTexturesMixin.java │ │ │ └── BlockRenderManagerMixin.java │ ├── nowplaying │ │ ├── mixin │ │ │ └── WorldRendererMixin.java │ │ └── NowPlayingMixinPlugin.java │ ├── dawn │ │ └── mixin │ │ │ ├── ItemRendererMixin.java │ │ │ ├── old │ │ │ └── ItemRendererOldMixin.java │ │ │ ├── older │ │ │ └── ItemRendererOldMixin.java │ │ │ └── BackgroundRendererMixin.java │ ├── mubble │ │ └── mixin │ │ │ └── ItemRendererMixin.java │ ├── stacc │ │ └── mixin │ │ │ ├── PacketByteBufMixin.java │ │ │ └── old │ │ │ └── PacketByteBufMixin.java │ ├── charm │ │ ├── mixin │ │ │ ├── old │ │ │ │ ├── UtilMixin.java │ │ │ │ └── SpriteAtlasTextureMixin.java │ │ │ ├── SpriteAtlasTextureNewMixin.java │ │ │ ├── SpriteAtlasTextureMixin.java │ │ │ └── older │ │ │ │ └── SpriteAtlasTextureMixin.java │ │ └── CharmMixinPlugin.java │ ├── aether │ │ ├── mixin │ │ │ └── BackgroundRendererMixin.java │ │ └── AetherMixinPlugin.java │ ├── astromine │ │ └── mixin │ │ │ └── GameRendererMixin.java │ ├── replaymod │ │ └── mixin │ │ │ ├── KeyboardNewerMixin.java │ │ │ └── KeyboardNewMixin.java │ ├── sandwichable │ │ └── mixin │ │ │ ├── BuiltinModelItemRendererMixin.java │ │ │ ├── old │ │ │ └── BuiltinModelItemRendererMixin.java │ │ │ └── BuiltinModelItemRendererNewMixin.java │ ├── uglyscoreboardfix │ │ └── InGameHudFix.java │ ├── apoli │ │ ├── ApoliMixinPlugin.java │ │ └── mixin │ │ │ └── ElytraFeatureRendererMixin.java │ ├── customfog │ │ ├── mixin │ │ │ └── BackgroundRendererMixin.java │ │ └── CustomFogMixinPlugin.java │ ├── multiconnect │ │ └── mixin │ │ │ └── ModelLoaderMixin.java │ ├── full_slabs │ │ └── mixin │ │ │ └── BlockRenderManagerMixin.java │ ├── origins │ │ └── mixin │ │ │ └── ElytraFeatureRendererMixin.java │ ├── images │ │ └── mixin │ │ │ ├── older │ │ │ └── BuiltinModelItemRendererMixin.java │ │ │ ├── old │ │ │ └── BuiltinModelItemRendererMixin.java │ │ │ └── BuiltinModelItemRendererMixin.java │ ├── enhancedcelestials │ │ └── mixin │ │ │ ├── LightmapTextureManagerMixin.java │ │ │ └── LightmapTextureManagerNewMixin.java │ ├── bannerpp │ │ └── mixin │ │ │ └── BuiltinModelItemRendererMixin.java │ ├── cloth │ │ └── mixin │ │ │ ├── GameRendererNewMixin.java │ │ │ ├── GameRendererNewerMixin.java │ │ │ └── DummyMixinGameRenderer.java │ ├── architectury │ │ └── mixin │ │ │ ├── SpriteAtlasTextureMixin.java │ │ │ └── SpriteAtlasTextureNewMixin.java │ ├── additionalentityattributes │ │ └── AEAMixinPlugin.java │ └── amecs │ │ └── mixin │ │ └── GameOptionsMixin.java │ ├── mod │ ├── Registries.java │ ├── DrawContext.java │ ├── Text.java │ ├── FeatureFinder.java │ ├── OptifabricLoadGuard.java │ ├── OptifabricError.java │ ├── OptifineResources.java │ ├── Preloader.java │ ├── ContextualMappingContext.java │ └── TextSetup.java │ ├── mixin │ ├── SMCLog.java │ ├── Config.java │ ├── DefaultResourcePackMixin.java │ ├── ShadersMixin.java │ ├── ParticleManagerMixin.java │ ├── MixinReflectorClass.java │ ├── VideoOptionsScreenMixin.java │ ├── MixinOptifineConfig.java │ └── MixinDefaultResourcePack.java │ └── util │ └── ASMUtils.java ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── .gitlab-ci.yml ├── settings.gradle ├── .gitignore ├── gradle.properties ├── proguard.conf └── .github └── workflows └── main.yml /src/shim/java/org/joml/Matrix4f.java: -------------------------------------------------------------------------------- 1 | package org.joml; 2 | 3 | public class Matrix4f { 4 | } -------------------------------------------------------------------------------- /src/shim/java/net/minecraft/class_5819.java: -------------------------------------------------------------------------------- 1 | package net.minecraft; 2 | 3 | public class class_5819 { 4 | } -------------------------------------------------------------------------------- /src/shim/java/net/minecraft/class_5944.java: -------------------------------------------------------------------------------- 1 | package net.minecraft; 2 | 3 | public class class_5944 { 4 | } -------------------------------------------------------------------------------- /src/shim/java/net/minecraft/class_7775.java: -------------------------------------------------------------------------------- 1 | package net.minecraft; 2 | 3 | public interface class_7775 { 4 | } 5 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chocohead/OptiFabric/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /src/main/resources/assets/optifabric/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chocohead/OptiFabric/HEAD/src/main/resources/assets/optifabric/icon.png -------------------------------------------------------------------------------- /src/shim/java/net/minecraft/class_6850.java: -------------------------------------------------------------------------------- 1 | package net.minecraft; 2 | 3 | public class class_6850 { 4 | public static class class_6851 { 5 | } 6 | } -------------------------------------------------------------------------------- /src/shim/java/net/minecraft/class_5636.java: -------------------------------------------------------------------------------- 1 | package net.minecraft; 2 | 3 | // net/minecraft/client/render/CameraSubmersionType 4 | public class class_5636 { 5 | } 6 | -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.age-of-exile.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.ageofexile.mixin", 4 | "mixins": [ 5 | "InGameHudMixin" 6 | ] 7 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.voxelmap.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.voxelmap.mixin", 4 | "mixins": [ 5 | "CustomColorsMixin" 6 | ] 7 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.optifine.new-mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.optifine.mixins.json", 3 | "package": "me.modmuss50.optifabric.mixin", 4 | "mixins": [ 5 | "DefaultResourcePackMixin" 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /src/main/resources/optifabric.optifine.old-mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.optifine.mixins.json", 3 | "package": "me.modmuss50.optifabric.mixin", 4 | "mixins": [ 5 | "MixinDefaultResourcePack" 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /src/shim/java/net/minecraft/class_846.java: -------------------------------------------------------------------------------- 1 | package net.minecraft; 2 | 3 | public class class_846 { 4 | public class class_851 { 5 | public class class_4578 { 6 | public class class_7435 { 7 | } 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.ae2.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.ae2.mixin", 4 | "mixins": [ 5 | "BakedQuadAccess", 6 | "FaceRotatingModelMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /.gitlab-ci.yml: -------------------------------------------------------------------------------- 1 | image: java:8 2 | 3 | before_script: 4 | - which java 5 | - which javac 6 | 7 | build: 8 | script: 9 | - ./gradlew build 10 | artifacts: 11 | paths: 12 | - build/libs/*.jar 13 | expire_in: 1 month 14 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | repositories { 3 | jcenter() 4 | maven { 5 | name = 'Fabric' 6 | url = 'https://maven.fabricmc.net/' 7 | } 8 | gradlePluginPortal() 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/patcher/fixes/ClassFixer.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.patcher.fixes; 2 | 3 | 4 | import org.objectweb.asm.tree.ClassNode; 5 | 6 | public interface ClassFixer { 7 | void fix(ClassNode optifine, ClassNode minecraft); 8 | } 9 | -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.fabric-rendering-data.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.fabricrenderingdata.mixin", 4 | "mixins": [ 5 | "BridgedChunkRendererRegionMixin", 6 | "ChunkCacheOFMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.hctm.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.hctm.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.InterceptingMixinPlugin", 5 | "mixins": [ 6 | "ModelLoaderMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.phormat.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.phormat.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.InterceptingMixinPlugin", 5 | "mixins": [ 6 | "DrawerMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.pswg.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.pswg.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.InterceptingMixinPlugin", 5 | "mixins": [ 6 | "GameRendererMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.stacc.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.stacc.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.stacc.StaccMixinPlugin", 5 | "mixins": [ 6 | "PacketByteBufMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.amecsapi.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.amecs.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.InterceptingMixinPlugin", 5 | "mixins": [ 6 | "GameOptionsMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.carpet.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.carpet.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.InterceptingMixinPlugin", 5 | "mixins": [ 6 | "WorldRendererMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.chat-heads.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.chatheads.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.InterceptingMixinPlugin", 5 | "mixins": [ 6 | "ChatHudMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.mubble.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.mubble.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.mubble.MubbleMixinPlugin", 5 | "mixins": [ 6 | "ItemRendererMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.replaymod.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.replaymod.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.InterceptingMixinPlugin", 5 | "mixins": [ 6 | "KeyboardMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.aether.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.aether.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.aether.AetherMixinPlugin", 5 | "mixins": [ 6 | "BackgroundRendererMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.cloth.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.cloth.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.InterceptingMixinPlugin", 5 | "mixins": [ 6 | "DummyMixinGameRenderer" 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.cloth.new-mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.cloth.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.InterceptingMixinPlugin", 5 | "mixins": [ 6 | "GameRendererNewMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.cloth.newer-mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.cloth.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.InterceptingMixinPlugin", 5 | "mixins": [ 6 | "GameRendererNewerMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.dawn.old-mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.dawn.mixin.old", 4 | "plugin": "me.modmuss50.optifabric.compat.mubble.MubbleMixinPlugin", 5 | "mixins": [ 6 | "ItemRendererMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.dawn.older-mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.dawn.mixin.older", 4 | "plugin": "me.modmuss50.optifabric.compat.mubble.MubbleMixinPlugin", 5 | "mixins": [ 6 | "ItemRendererMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.replaymod.new-mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.replaymod.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.InterceptingMixinPlugin", 5 | "mixins": [ 6 | "KeyboardNewMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.stacc.old-mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.stacc.mixin.old", 4 | "plugin": "me.modmuss50.optifabric.compat.stacc.StaccMixinPlugin", 5 | "mixins": [ 6 | "PacketByteBufMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.architectury-A.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.architectury.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.InterceptingMixinPlugin", 5 | "mixins": [ 6 | "GameRendererMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.astromine.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.astromine.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.astromine.AstromineMixinPlugin", 5 | "mixins": [ 6 | "GameRendererMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.charm-new.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.charm.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.InterceptingMixinPlugin", 5 | "mixins": [ 6 | "SpriteAtlasTextureNewMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.charm-old.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.charm.mixin.old", 4 | "plugin": "me.modmuss50.optifabric.compat.InterceptingMixinPlugin", 5 | "mixins": [ 6 | "SpriteAtlasTextureMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.clothesline.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.clothesline.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.InterceptingMixinPlugin", 5 | "mixins": [ 6 | "WorldRendererMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.fabric-item-api.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.fabricitemapi.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.InterceptingMixinPlugin", 5 | "mixins": [ 6 | "MobEntityMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.frex.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.frex.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.frex.FrexMixinPlugin", 5 | "mixins": [ 6 | "ChunkCacheOF", 7 | "RebuildTaskMixin" 8 | ] 9 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.images.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.images.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.images.ImagesMixinPlugin", 5 | "mixins": [ 6 | "BuiltinModelItemRendererMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.origins.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.origins.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.origins.OriginsMixinPlugin", 5 | "mixins": [ 6 | "BackgroundRendererMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.pswg.extra-mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.compat.pswg.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.pswg.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.pswg.StarWarsMixinPlugin", 5 | "mixins": [ 6 | "FrameBufferMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.bannerpp.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.bannerpp.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.images.ImagesMixinPlugin", 5 | "mixins": [ 6 | "BuiltinModelItemRendererMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.carpet.extra-mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.carpet.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.carpet.CarpetExtraMixinPlugin", 5 | "mixins": [ 6 | "WorldRendererExtraMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.charm-older.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.charm.mixin.older", 4 | "plugin": "me.modmuss50.optifabric.compat.InterceptingMixinPlugin", 5 | "mixins": [ 6 | "SpriteAtlasTextureMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.charm-plus.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.compat.charm-old.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.charm.mixin.old", 4 | "plugin": "me.modmuss50.optifabric.compat.charm.CharmMixinPlugin", 5 | "mixins": [ 6 | "UtilMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.now-playing.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.nowplaying.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.nowplaying.NowPlayingMixinPlugin", 5 | "mixins": [ 6 | "WorldRendererMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.staffofbuilding.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.staffofbuilding.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.InterceptingMixinPlugin", 5 | "mixins": [ 6 | "WorldRendererMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.custom-fog.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.customfog.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.customfog.CustomFogMixinPlugin", 5 | "mixins": [ 6 | "BackgroundRendererMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.fabric-screen-api.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.fabricscreenapi.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.InterceptingMixinPlugin", 5 | "mixins": [ 6 | "GameRendererMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.frex-old.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.frex.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.frex.FrexMixinPlugin", 5 | "mixins": [ 6 | "ChunkCacheOF", 7 | "old.RebuildTaskMixin" 8 | ] 9 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.full-slabs.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.full_slabs.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.full_slabs.FullSlabsMixinPlugin", 5 | "mixins": [ 6 | "BlockRenderManagerMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.images-old.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.images.mixin.old", 4 | "plugin": "me.modmuss50.optifabric.compat.images.ImagesMixinPlugin", 5 | "mixins": [ 6 | "BuiltinModelItemRendererMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.indigo.extra-mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.compat.indigo.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.indigo.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.InterceptingMixinPlugin", 5 | "mixins": [ 6 | "ChunkDataMixin" 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.multiconnect.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.multiconnect.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.multiconnect.MulticonnectMixinPlugin", 5 | "mixins": [ 6 | "ModelLoaderMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.origins.extra-mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.origins.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.origins.OriginsMixinPlugin", 5 | "mixins": [ 6 | "ElytraFeatureRendererMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.trumpet-skeleton.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.trumpetskeleton.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.InterceptingMixinPlugin", 5 | "mixins": [ 6 | "HeldItemRendererMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/borderlessmining/MagicMixinBridge.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.borderlessmining; 2 | 3 | import org.spongepowered.asm.mixin.injection.invoke.arg.Args; 4 | 5 | public interface MagicMixinBridge { 6 | void optifabric£modifyFullscreenButton(Args args); 7 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.fabric-screen-api.new-mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.fabricscreenapi.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.InterceptingMixinPlugin", 5 | "mixins": [ 6 | "GameRendererNewMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.images-older.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.images.mixin.older", 4 | "plugin": "me.modmuss50.optifabric.compat.images.ImagesMixinPlugin", 5 | "mixins": [ 6 | "BuiltinModelItemRendererMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.smooth-chunks.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.smoothchunks.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.smoothchunks.SmoothChunksMixinPlugin", 5 | "mixins": [ 6 | "WorldRendererMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.zoomify.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.zoomify.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.zoomify.ZoomifyMixinPlugin", 5 | "mixins": [ 6 | "GameRendererMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "required": true, 3 | "package": "me.modmuss50.optifabric.mixin", 4 | "compatibilityLevel": "JAVA_8", 5 | "mixins": [ 6 | "MixinTitleScreen", 7 | "CrashReportMixin" 8 | ], 9 | "injectors": { 10 | "defaultRequire": 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/zoomify/mixin/GameRendererMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.zoomify.mixin; 2 | 3 | import net.minecraft.client.render.GameRenderer; 4 | import org.spongepowered.asm.mixin.Mixin; 5 | 6 | @Mixin(GameRenderer.class) 7 | public class GameRendererMixin { 8 | } 9 | -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.cullparticles.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.cullparticles.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.cullparticles.CullParticlesMixinPlugin", 5 | "mixins": [ 6 | "ParticleManagerMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.dawn.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.dawn.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.mubble.MubbleMixinPlugin", 5 | "mixins": [ 6 | "ItemRendererMixin", 7 | "BackgroundRendererMixin" 8 | ] 9 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.enhancedcelestials.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.enhancedcelestials.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.InterceptingMixinPlugin", 5 | "mixins": [ 6 | "LightmapTextureManagerMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.fabric-rendering.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.fabricrendering.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.fabricrendering.RenderingMixinPlugin", 5 | "mixins": [ 6 | "WorldRendererMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.fabric-screen-api.new3er-mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.fabricscreenapi.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.InterceptingMixinPlugin", 5 | "mixins": [ 6 | "GameRendererNew3erMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.fabric-screen-api.new4er-mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.fabricscreenapi.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.InterceptingMixinPlugin", 5 | "mixins": [ 6 | "GameRendererNew4erMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.fabric-screen-api.new5er-mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.fabricscreenapi.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.InterceptingMixinPlugin", 5 | "mixins": [ 6 | "GameRendererNew5erMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.fabric-screen-api.newer-mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.fabricscreenapi.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.InterceptingMixinPlugin", 5 | "mixins": [ 6 | "GameRendererNewerMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.replaymod.newer-mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.replaymod.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.InterceptingMixinPlugin", 5 | "mixins": [ 6 | "KeyboardNewerMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.apoli.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.apoli.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.apoli.ApoliMixinPlugin", 5 | "mixins": [ 6 | "BackgroundRendererMixin", 7 | "ElytraFeatureRendererMixin" 8 | ] 9 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.fabric-screen-api.newerer-mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.fabricscreenapi.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.InterceptingMixinPlugin", 5 | "mixins": [ 6 | "GameRendererNewererMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.sandwichable.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.sandwichable.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.sandwichable.SandwichableMixinPlugin", 5 | "mixins": [ 6 | "BuiltinModelItemRendererMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.architectury-B.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.compat.architectury-A.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.architectury.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.InterceptingMixinPlugin", 5 | "mixins": [ 6 | "SpriteAtlasTextureMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.carpet.extra-new-mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.carpet.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.carpet.CarpetExtraMixinPlugin", 5 | "mixins": [ 6 | "LevelRendererExtraMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.enhancedcelestials.new-mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.enhancedcelestials.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.InterceptingMixinPlugin", 5 | "mixins": [ 6 | "LightmapTextureManagerNewMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.fabric-rendering.extra-mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.fabricrendering.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.fabricrendering.RenderingExtraMixinPlugin", 5 | "mixins": [ 6 | "ShaderProgramMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.fabric-rendering.new-mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.fabricrendering.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.fabricrendering.RenderingNewMixinPlugin", 5 | "mixins": [ 6 | "WorldRendererNewMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.sandwichable.new-mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.sandwichable.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.sandwichable.SandwichableMixinPlugin", 5 | "mixins": [ 6 | "BuiltinModelItemRendererNewMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.architectury-AB.new4er-mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.architectury.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.InterceptingMixinPlugin", 5 | "mixins": [ 6 | "GameRendererNew4erMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.charm.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.charm.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.InterceptingMixinPlugin", 5 | "mixins": [ 6 | "BlockEntityRenderDispatcherMixin", 7 | "SpriteAtlasTextureMixin" 8 | ] 9 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.sandwichable-old.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.sandwichable.mixin.old", 4 | "plugin": "me.modmuss50.optifabric.compat.sandwichable.SandwichableMixinPlugin", 5 | "mixins": [ 6 | "BuiltinModelItemRendererMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.fabric-block-view-api.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.fabricblockview.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.fabricblockview.BlockViewMixinPlugin", 5 | "mixins": [ 6 | "ChunkRendererRegionBuilderMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.architectury-AB.new-mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.architectury.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.InterceptingMixinPlugin", 5 | "mixins": [ 6 | "GameRendererNewMixin", 7 | "SpriteAtlasTextureNewMixin" 8 | ] 9 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.architectury-AB.newererer-mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.architectury.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.InterceptingMixinPlugin", 5 | "mixins": [ 6 | "GameRendererNewerererMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.fabric-lifecycle-events.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.fabriclifecycleevents.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.fabriclifecycleevents.LifecycleMixinPlugin", 5 | "mixins": [ 6 | "ClientChunkManagerMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/cullparticles/mixin/ParticleManagerMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.cullparticles.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | 5 | import net.minecraft.client.particle.ParticleManager; 6 | 7 | @Mixin(ParticleManager.class) 8 | abstract class ParticleManagerMixin { 9 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.apoli-newerer.extra-mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.compat.apoli-newerer.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.apoli.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.apoli.ApoliMixinPlugin", 5 | "mixins": [ 6 | "BackgroundRendererNewerMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.architectury-AB.newer-mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.architectury.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.InterceptingMixinPlugin", 5 | "mixins": [ 6 | "GameRendererNewerMixin", 7 | "SpriteAtlasTextureNewMixin" 8 | ] 9 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.fabric-lifecycle-events.new-mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.fabriclifecycleevents.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.fabriclifecycleevents.LifecycleNewMixinPlugin", 5 | "mixins": [ 6 | "ClientChunkManagerNewMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.apoli-new.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.apoli.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.apoli.ApoliMixinPlugin", 5 | "mixins": [ 6 | "BackgroundRendererNewMixin", 7 | "ElytraFeatureRendererMixin" 8 | ] 9 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.apoli-newerer.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.apoli.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.apoli.ApoliMixinPlugin", 5 | "mixins": [ 6 | "ElytraFeatureRendererMixin", 7 | "WorldRendererNewMixin" 8 | ] 9 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.fabric-model-loading-api.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.fabricmodelloadingapi.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.fabricmodelloadingapi.ModelLoadingMixinPlugin", 5 | "mixins": [ 6 | "ModelLoaderBakerImplMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # gradle 2 | 3 | .gradle/ 4 | build/ 5 | out/ 6 | classes/ 7 | libs/ 8 | 9 | # Eclipse 10 | 11 | *.launch 12 | 13 | # idea 14 | 15 | .idea/ 16 | *.iml 17 | *.ipr 18 | *.iws 19 | 20 | # vscode 21 | 22 | .settings/ 23 | .vscode/ 24 | bin/ 25 | .classpath 26 | .project 27 | 28 | # fabric 29 | 30 | run/ 31 | files/ 32 | temp/ 33 | logs/ 34 | -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.additional-entity-attributes.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.additionalentityattributes.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.additionalentityattributes.AEAMixinPlugin", 5 | "mixins": [ 6 | "BackgroundRendererMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.borderlessmining.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.borderlessmining.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.borderlessmining.BorderlessMiningMixinPlugin", 5 | "mixins": [ 6 | "VideoOptionsScreenMixin", 7 | "OptionFullscreenResolutionMixin" 8 | ] 9 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/mod/Registries.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.mod; 2 | 3 | import net.minecraft.block.Block; 4 | import net.minecraft.util.Identifier; 5 | import net.minecraft.util.registry.Registry; 6 | 7 | public class Registries { 8 | public static Identifier getID(Block block) { 9 | return Registry.BLOCK.getId(block); 10 | } 11 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.architectury-AB.newerer-mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.architectury.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.InterceptingMixinPlugin", 5 | "mixins": [ 6 | "GameRendererNewererMixin", 7 | "SpriteAtlasTextureNewMixin" 8 | ] 9 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.borderlessmining.new-mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.borderlessmining.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.borderlessmining.BorderlessMiningNewMixinPlugin", 5 | "mixins": [ 6 | "VideoOptionsScreenMixin", 7 | "OptionFullscreenResolutionNewMixin" 8 | ] 9 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.fabric-rendering-data.extra-mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.compat.fabric-rendering-data.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.fabricrenderingdata.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.fabricrenderingdata.RenderingDataExtraMixinPlugin", 5 | "mixins": [ 6 | "ChunkRendererRegionMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.fabric-rendering-data.bonus-mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.compat.fabric-rendering-data.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.fabricrenderingdata.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.fabricrenderingdata.RenderingDataBonusMixinPlugin", 5 | "mixins": [ 6 | "ChunkRendererRegionBuilderMixin" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.optifine.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.mixin", 4 | "mixins": [ 5 | "MixinReflectorClass", 6 | "MixinOptifineConfig", 7 | "CustomColoursMixin", 8 | "ShadersMixin", 9 | "VideoOptionsScreenMixin", 10 | "Config", 11 | "SMCLog", 12 | "ParticleManagerMixin" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/DevOnly.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat; 2 | 3 | import static java.lang.annotation.ElementType.TYPE; 4 | import static java.lang.annotation.RetentionPolicy.CLASS; 5 | 6 | import java.lang.annotation.Retention; 7 | import java.lang.annotation.Target; 8 | 9 | @Retention(CLASS) 10 | @Target(TYPE) 11 | public @interface DevOnly { 12 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/Shim.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat; 2 | 3 | import static java.lang.annotation.ElementType.METHOD; 4 | import static java.lang.annotation.RetentionPolicy.CLASS; 5 | 6 | import java.lang.annotation.Retention; 7 | import java.lang.annotation.Target; 8 | 9 | @Retention(CLASS) 10 | @Target(METHOD) 11 | public @interface Shim { 12 | } -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Done to increase the memory available to gradle. 2 | org.gradle.jvmargs=-Xmx1G 3 | 4 | minecraft_version=1.16.5 5 | yarn_mappings=1.16.5+build.10 6 | loader_version=0.15.3 7 | 8 | fabric_version=0.42.0+1.16 9 | tiny_remapper_version=0.8.11 10 | fabric_asm_version=v2.3 11 | 12 | mod_version = 1.14.3 13 | maven_group = me.modmuss50 14 | archives_base_name = optifabric 15 | -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.apoli-newer.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.apoli.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.apoli.ApoliMixinPlugin", 5 | "mixins": [ 6 | "BackgroundRendererNewMixin", 7 | "ElytraFeatureRendererMixin", 8 | "WorldRendererMixin" 9 | ] 10 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.fabric-renderer-api.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.fabricrendererapi.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.fabricrendererapi.RendererMixinPlugin", 5 | "mixins": [ 6 | "BlockModelRendererMixin", 7 | "BlockRenderManagerMixin", 8 | "ConnectedTexturesMixin" 9 | ] 10 | } -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.indigo.new-mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.indigo.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.indigo.IndigoMixinPlugin", 5 | "mixins": [ 6 | "RebuildTaskNewMixin", 7 | "ChunkCacheOFAccess", 8 | "ChunkCacheOFNewMixin", 9 | "BlockModelRendererNewMixin" 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.indigo.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.indigo.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.indigo.IndigoOldMixinPlugin", 5 | "mixins": [ 6 | "RebuildTaskMixin", 7 | "ChunkCacheOFMixin", 8 | "BlockModelRendererMixin", 9 | "BridgedChunkRendererRegionMixin" 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.indigo.newer-mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.indigo.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.indigo.IndigoMixinPlugin", 5 | "mixins": [ 6 | "RebuildTaskNewerMixin", 7 | "ChunkCacheOFAccess", 8 | "ChunkCacheOFNewMixin", 9 | "BlockModelRendererNewMixin" 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.indigo.old-mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.indigo.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.InterceptingMixinPlugin", 5 | "mixins": [ 6 | "RebuildTaskMixin", 7 | "ChunkCacheOFMixin", 8 | "BlockModelRendererMixin", 9 | "BridgedChunkRendererRegionMixin" 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /src/main/resources/optifabric.compat.fabric-renderer-api.new-mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "parent": "optifabric.mixins.json", 3 | "package": "me.modmuss50.optifabric.compat.fabricrendererapi.mixin", 4 | "plugin": "me.modmuss50.optifabric.compat.fabricrendererapi.RendererMixinPlugin", 5 | "mixins": [ 6 | "BlockModelRendererNewMixin", 7 | "BlockRenderManagerNewMixin", 8 | "ConnectedTexturesMixin" 9 | ] 10 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/PlacatingSurrogate.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat; 2 | 3 | import static java.lang.annotation.ElementType.METHOD; 4 | import static java.lang.annotation.RetentionPolicy.CLASS; 5 | 6 | import java.lang.annotation.Retention; 7 | import java.lang.annotation.Target; 8 | 9 | @Retention(CLASS) 10 | @Target(METHOD) 11 | public @interface PlacatingSurrogate { 12 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/fabricrendering/RenderingNewMixinPlugin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.fabricrendering; 2 | 3 | public class RenderingNewMixinPlugin extends RenderingMixinPlugin { 4 | @Override 5 | protected String getRenderDesc() { 6 | return "(Lnet/minecraft/class_4587;FJZLnet/minecraft/class_4184;Lnet/minecraft/class_757;Lnet/minecraft/class_765;Lorg/joml/Matrix4f;)V"; 7 | } 8 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/fabriclifecycleevents/LifecycleNewMixinPlugin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.fabriclifecycleevents; 2 | 3 | public class LifecycleNewMixinPlugin extends LifecycleMixinPlugin { 4 | @Override 5 | protected String getLoadChunkFromPacketDesc() { 6 | return "(IILnet/minecraft/class_2540;Lnet/minecraft/class_2487;Ljava/util/function/Consumer;)Lnet/minecraft/class_2818;"; 7 | } 8 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/InterceptingMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat; 2 | 3 | import static java.lang.annotation.ElementType.TYPE; 4 | import static java.lang.annotation.RetentionPolicy.CLASS; 5 | 6 | import java.lang.annotation.Retention; 7 | import java.lang.annotation.Target; 8 | 9 | @Retention(CLASS) 10 | @Target(TYPE) 11 | public @interface InterceptingMixin { 12 | String[] value(); 13 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/ae2/mixin/BakedQuadAccess.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.ae2.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.gen.Accessor; 5 | 6 | import net.minecraft.client.render.model.BakedQuad; 7 | import net.minecraft.client.texture.Sprite; 8 | 9 | @Mixin(BakedQuad.class) 10 | public interface BakedQuadAccess { 11 | @Accessor 12 | Sprite getSprite(); 13 | } -------------------------------------------------------------------------------- /proguard.conf: -------------------------------------------------------------------------------- 1 | -dontnote 2 | 3 | -dontobfuscate 4 | -optimizationpasses 5 5 | -optimizations !code/allocation/variable 6 | -allowaccessmodification 7 | -keepparameternames 8 | -keepattributes * 9 | 10 | -keep class !me.modmuss50.optifabric.shadow.** { 11 | *; 12 | } 13 | 14 | -keepclassmembers,allowoptimization class * extends java.lang.Enum { 15 | #; 16 | public static **[] values(); 17 | public static ** valueOf(java.lang.String); 18 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/mod/DrawContext.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.mod; 2 | 3 | import net.minecraft.client.font.TextRenderer; 4 | import net.minecraft.client.util.math.MatrixStack; 5 | 6 | public class DrawContext { 7 | public static int drawTextWithShadow(TextRenderer textRenderer, Object matrices, String text, int x, int y, int color) { 8 | return textRenderer.drawWithShadow((MatrixStack) matrices, text, x, y, color); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/mod/Text.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.mod; 2 | 3 | import net.minecraft.text.LiteralText; 4 | import net.minecraft.text.MutableText; 5 | import net.minecraft.util.Formatting; 6 | 7 | public class Text { 8 | public static MutableText literal(String text) { 9 | return new LiteralText(text); 10 | } 11 | 12 | public static MutableText literal(String text, Formatting style) { 13 | return literal(text).formatted(style); 14 | } 15 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/mixin/SMCLog.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.Pseudo; 5 | import org.spongepowered.asm.mixin.gen.Invoker; 6 | 7 | @Pseudo 8 | @Mixin(targets = "net.optifine.shaders.SMCLog", remap = false) 9 | public interface SMCLog { 10 | @Invoker 11 | public static void callInfo(String message) { 12 | throw new AssertionError("Mixin failed to apply"); 13 | } 14 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/mod/FeatureFinder.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.mod; 2 | 3 | import java.util.function.BooleanSupplier; 4 | 5 | public abstract class FeatureFinder implements BooleanSupplier { 6 | private boolean haveLooked, isPresent; 7 | 8 | protected abstract boolean isPresent(); 9 | 10 | @Override 11 | public boolean getAsBoolean() { 12 | if (!haveLooked) { 13 | isPresent = isPresent(); 14 | haveLooked = true; 15 | } 16 | 17 | return isPresent; 18 | } 19 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/mixin/Config.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.Pseudo; 5 | import org.spongepowered.asm.mixin.gen.Invoker; 6 | 7 | @Pseudo 8 | @Mixin(targets = "net.optifine.Config", remap = false) 9 | public interface Config { 10 | @Invoker 11 | public static void callShowGuiMessage(String firstLine, String secondLine) { 12 | throw new AssertionError("Mixin failed to apply"); 13 | } 14 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/borderlessmining/BorderlessMiningNewMixinPlugin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.borderlessmining; 2 | 3 | public class BorderlessMiningNewMixinPlugin extends BorderlessMiningMixinPlugin { 4 | @Override 5 | protected String getCreateSimpleOptionInitDescriptor() { 6 | return "(Ljava/lang/String;Lnet/minecraft/class_7172$class_7277;Lnet/minecraft/class_7172$class_7303;Lnet/minecraft/class_7172$class_7178;Ljava/lang/Object;Ljava/util/function/Consumer;)V"; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/indigo/mixin/ChunkCacheOFAccess.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.indigo.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.Pseudo; 5 | import org.spongepowered.asm.mixin.gen.Accessor; 6 | 7 | import net.minecraft.client.render.chunk.ChunkRendererRegion; 8 | 9 | @Pseudo 10 | @Mixin(targets = "net/optifine/override/ChunkCacheOF", remap = false) 11 | public interface ChunkCacheOFAccess { 12 | @Accessor 13 | ChunkRendererRegion getChunkCache(); 14 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/fabricscreenapi/Events.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.fabricscreenapi; 2 | 3 | import net.minecraft.client.MinecraftClient; 4 | import net.minecraft.client.gui.screen.Screen; 5 | 6 | import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; 7 | 8 | public class Events { 9 | /** Post the {@link ScreenEvents#AFTER_INIT} event for the given screen */ 10 | public static void afterInit(MinecraftClient client, Screen screen, int width, int height) { 11 | ScreenEvents.AFTER_INIT.invoker().afterInit(client, screen, width, height); 12 | } 13 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/mod/OptifabricLoadGuard.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.mod; 2 | 3 | import net.fabricmc.loader.api.entrypoint.PreLaunchEntrypoint; 4 | 5 | public class OptifabricLoadGuard implements PreLaunchEntrypoint { 6 | @Override 7 | public void onPreLaunch() { 8 | //The first class loaded cannot have any Mixins for it or extra Mixin configs added won't apply 9 | //They would apply by bumping the Mixin phase afterwards, but this is a much cleaner solution 10 | //There is good precedent as this as a solution to the problem, first found here: 11 | //https://github.com/ReplayMod/ReplayMod/commit/27edfcb4f3cd0eac0c7fb24e87ee3fa67324ab0a 12 | } 13 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/frex/mixin/ChunkCacheOF.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.frex.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.Pseudo; 5 | import org.spongepowered.asm.mixin.gen.Invoker; 6 | 7 | import net.minecraft.block.entity.BlockEntity; 8 | import net.minecraft.util.math.BlockPos; 9 | import net.minecraft.world.BlockRenderView; 10 | import net.minecraft.world.chunk.WorldChunk.CreationType; 11 | 12 | @Pseudo 13 | @Mixin(targets = "net/optifine/override/ChunkCacheOF", remap = false) 14 | public interface ChunkCacheOF extends BlockRenderView { 15 | @Invoker(value = "getTileEntity") 16 | BlockEntity getBlockEntity(BlockPos pos, CreationType creation); 17 | } -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: Java CI with Gradle 2 | 3 | on: 4 | push: 5 | branches: [ llama ] 6 | pull_request: 7 | branches: [ llama ] 8 | 9 | jobs: 10 | build: 11 | 12 | runs-on: ubuntu-latest 13 | 14 | steps: 15 | - uses: actions/checkout@v2 16 | - name: Set up JDK 1.8 17 | uses: actions/setup-java@v1 18 | with: 19 | java-version: 1.8 20 | - name: Grant execute permission for gradlew 21 | run: chmod +x gradlew 22 | - name: Build with Gradle 23 | run: ./gradlew build --stacktrace --info 24 | - name: Upload a Build Artifact 25 | uses: actions/upload-artifact@v2.1.4 26 | with: 27 | name: Optifabric-Artifact 28 | path: build/libs/optifabric-*.*.jar 29 | if-no-files-found: error 30 | -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/EmptyMixinPlugin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat; 2 | 3 | import java.util.Collections; 4 | import java.util.List; 5 | import java.util.Set; 6 | 7 | import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; 8 | 9 | public abstract class EmptyMixinPlugin implements IMixinConfigPlugin { 10 | @Override 11 | public void onLoad(String mixinPackage) { 12 | } 13 | 14 | @Override 15 | public String getRefMapperConfig() { 16 | return null; 17 | } 18 | 19 | @Override 20 | public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { 21 | return true; 22 | } 23 | 24 | @Override 25 | public void acceptTargets(Set myTargets, Set otherTargets) { 26 | } 27 | 28 | @Override 29 | public List getMixins() { 30 | return Collections.emptyList(); 31 | } 32 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/indigo/mixin/ChunkDataMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.indigo.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.Shadow; 5 | 6 | import net.minecraft.client.render.RenderLayer; 7 | import net.minecraft.client.render.chunk.ChunkBuilder.ChunkData; 8 | 9 | import me.modmuss50.optifabric.compat.InterceptingMixin; 10 | 11 | @Mixin(value = ChunkData.class, priority = 2000) 12 | @InterceptingMixin("net/fabricmc/fabric/mixin/client/indigo/renderer/MixinChunkRenderData") 13 | abstract class ChunkDataMixin { 14 | @Shadow 15 | private boolean empty; 16 | 17 | public void fabric_markPopulated(RenderLayer renderLayer) { 18 | empty = false; 19 | setLayerUsed(renderLayer); 20 | } 21 | 22 | @Shadow(remap = false) 23 | public abstract void setLayerUsed(RenderLayer renderLayer); 24 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/fabricitemapi/mixin/MobEntityMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.fabricitemapi.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 5 | 6 | import net.minecraft.entity.EquipmentSlot; 7 | import net.minecraft.entity.mob.MobEntity; 8 | import net.minecraft.item.ItemStack; 9 | 10 | import me.modmuss50.optifabric.compat.InterceptingMixin; 11 | import me.modmuss50.optifabric.compat.PlacatingSurrogate; 12 | 13 | @Mixin(MobEntity.class) 14 | @InterceptingMixin("net/fabricmc/fabric/mixin/item/MobEntityMixin") 15 | abstract class MobEntityMixin { 16 | @PlacatingSurrogate 17 | private void onGetPreferredEquipmentSlot(ItemStack stack, CallbackInfoReturnable info) { 18 | throw new AssertionError("Unexpectedly reached code path"); 19 | } 20 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/voxelmap/mixin/CustomColorsMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.voxelmap.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.Pseudo; 5 | import org.spongepowered.asm.mixin.injection.At; 6 | import org.spongepowered.asm.mixin.injection.ModifyVariable; 7 | 8 | import net.minecraft.client.MinecraftClient; 9 | import net.minecraft.entity.Entity; 10 | 11 | @Pseudo 12 | @Mixin(targets = "net.optifine.CustomColors", remap = false) 13 | class CustomColorsMixin { 14 | @ModifyVariable(method = {"getWorldFogColor", "getWorldSkyColor"}, at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;getX()D", remap = true), argsOnly = true) 15 | private static Entity focusEntity(Entity focusedEntity) { 16 | return focusedEntity != null ? focusedEntity : MinecraftClient.getInstance().player; 17 | } 18 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/borderlessmining/mixin/VideoOptionsScreenMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.borderlessmining.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.invoke.arg.Args; 5 | 6 | import net.minecraft.client.gui.screen.option.VideoOptionsScreen; 7 | 8 | import me.modmuss50.optifabric.compat.InterceptingMixin; 9 | import me.modmuss50.optifabric.compat.Shim; 10 | import me.modmuss50.optifabric.compat.borderlessmining.MagicMixinBridge; 11 | 12 | @Mixin(VideoOptionsScreen.class) 13 | @InterceptingMixin("link/infra/borderlessmining/mixin/FullScreenOptionMixin") 14 | abstract class VideoOptionsScreenMixin implements MagicMixinBridge { 15 | @Shim 16 | private native void modifyOption(Args args); 17 | 18 | @Override 19 | public void optifabric£modifyFullscreenButton(Args args) { 20 | modifyOption(args); 21 | } 22 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/mixin/DefaultResourcePackMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.mixin; 2 | 3 | import java.io.IOException; 4 | import java.io.InputStream; 5 | 6 | import org.spongepowered.asm.mixin.Mixin; 7 | import org.spongepowered.asm.mixin.injection.At; 8 | import org.spongepowered.asm.mixin.injection.Redirect; 9 | 10 | import net.minecraft.resource.DefaultResourcePack; 11 | 12 | import me.modmuss50.optifabric.mod.OptifineResources; 13 | 14 | @Mixin(value = DefaultResourcePack.class, priority = 400) 15 | abstract class DefaultResourcePackMixin { 16 | @Redirect(method = "getResourceOF", remap = false, 17 | at = @At(value = "INVOKE", target = "Lnet/optifine/reflect/ReflectorForge;getOptiFineResourceStream(Ljava/lang/String;)Ljava/io/InputStream;")) 18 | private InputStream onFindInputStream(String path) throws IOException { 19 | return OptifineResources.INSTANCE.getResource(path); 20 | } 21 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/indigo/ChunkRendererRegionAccess.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.indigo; 2 | 3 | import net.minecraft.client.render.chunk.BlockBufferBuilderStorage; 4 | import net.minecraft.client.render.chunk.ChunkBuilder.BuiltChunk; 5 | import net.minecraft.client.render.chunk.ChunkBuilder.ChunkData; 6 | 7 | import net.fabricmc.fabric.impl.client.indigo.renderer.accessor.AccessChunkRendererRegion; 8 | import net.fabricmc.fabric.impl.client.indigo.renderer.render.TerrainRenderContext; 9 | 10 | public interface ChunkRendererRegionAccess extends AccessChunkRendererRegion { 11 | void optifabric_setRenderer(TerrainRenderContext renderContext, BuiltChunk chunk, ChunkData data, BlockBufferBuilderStorage buffer); 12 | 13 | @Override 14 | default void fabric_setRenderer(TerrainRenderContext renderer) { 15 | throw new UnsupportedOperationException("Received unexpected render context: " + renderer); 16 | } 17 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/ageofexile/mixin/InGameHudMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.ageofexile.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.At; 5 | import org.spongepowered.asm.mixin.injection.Inject; 6 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 7 | 8 | import net.minecraft.client.gui.hud.InGameHud; 9 | import net.minecraft.entity.LivingEntity; 10 | 11 | @Mixin(InGameHud.class) 12 | abstract class InGameHudMixin { 13 | @Inject(method = "getHeartCount", at = @At("HEAD"), cancellable = true) 14 | public void on$getMaxHealth(LivingEntity entity, CallbackInfoReturnable call) { 15 | //Follow what https://github.com/RobertSkalko/Age-of-Exile/blob/master/src/main/java/com/robertx22/age_of_exile/mixins/InGameHudMixin.java#L43 does 16 | call.setReturnValue(entity == null || !entity.isLiving() ? 0 : 10); 17 | } 18 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/fabricblockview/BlockViewMixinPlugin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.fabricblockview; 2 | 3 | import org.objectweb.asm.tree.ClassNode; 4 | 5 | import org.spongepowered.asm.mixin.extensibility.IMixinInfo; 6 | import org.spongepowered.asm.mixin.transformer.ClassInfo; 7 | 8 | import me.modmuss50.optifabric.compat.InterceptingMixinPlugin; 9 | import me.modmuss50.optifabric.util.MixinUtils; 10 | 11 | public class BlockViewMixinPlugin extends InterceptingMixinPlugin { 12 | @Override 13 | public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { 14 | if ("ChunkRendererRegionBuilderMixin".equals(mixinInfo.getName())) { 15 | ClassInfo info = ClassInfo.forName(targetClassName); 16 | MixinUtils.completeClassInfo(info, targetClass.methods); 17 | } 18 | 19 | super.preApply(targetClassName, targetClass, mixinClassName, mixinInfo); 20 | } 21 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/fabricrenderingdata/mixin/ChunkCacheOFMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.fabricrenderingdata.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Final; 4 | import org.spongepowered.asm.mixin.Mixin; 5 | import org.spongepowered.asm.mixin.Pseudo; 6 | import org.spongepowered.asm.mixin.Shadow; 7 | 8 | import net.minecraft.util.math.BlockPos; 9 | import net.minecraft.client.render.chunk.ChunkRendererRegion; 10 | 11 | import net.fabricmc.fabric.api.rendering.data.v1.RenderAttachedBlockView; 12 | 13 | @Pseudo 14 | @Mixin(targets = "net/optifine/override/ChunkCacheOF", remap = false) 15 | abstract class ChunkCacheOFMixin implements RenderAttachedBlockView { 16 | @Shadow 17 | private @Final ChunkRendererRegion chunkCache; 18 | 19 | @Override 20 | public Object getBlockEntityRenderAttachment(BlockPos pos) { 21 | return ((RenderAttachedBlockView) chunkCache).getBlockEntityRenderAttachment(pos); 22 | } 23 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/fabricrenderingdata/RenderingDataExtraMixinPlugin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.fabricrenderingdata; 2 | 3 | import org.objectweb.asm.tree.ClassNode; 4 | 5 | import org.spongepowered.asm.mixin.extensibility.IMixinInfo; 6 | import org.spongepowered.asm.mixin.transformer.ClassInfo; 7 | 8 | import me.modmuss50.optifabric.compat.InterceptingMixinPlugin; 9 | import me.modmuss50.optifabric.util.MixinUtils; 10 | 11 | public class RenderingDataExtraMixinPlugin extends InterceptingMixinPlugin { 12 | @Override 13 | public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { 14 | if ("ChunkRendererRegionMixin".equals(mixinInfo.getName())) { 15 | ClassInfo info = ClassInfo.forName(targetClassName); 16 | MixinUtils.completeClassInfo(info, targetClass.methods); 17 | } 18 | 19 | super.preApply(targetClassName, targetClass, mixinClassName, mixinInfo); 20 | } 21 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/fabricrenderingdata/RenderingDataBonusMixinPlugin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.fabricrenderingdata; 2 | 3 | import org.objectweb.asm.tree.ClassNode; 4 | 5 | import org.spongepowered.asm.mixin.extensibility.IMixinInfo; 6 | import org.spongepowered.asm.mixin.transformer.ClassInfo; 7 | 8 | import me.modmuss50.optifabric.compat.InterceptingMixinPlugin; 9 | import me.modmuss50.optifabric.util.MixinUtils; 10 | 11 | public class RenderingDataBonusMixinPlugin extends InterceptingMixinPlugin { 12 | @Override 13 | public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { 14 | if ("ChunkRendererRegionBuilderMixin".equals(mixinInfo.getName())) { 15 | ClassInfo info = ClassInfo.forName(targetClassName); 16 | MixinUtils.completeClassInfo(info, targetClass.methods); 17 | } 18 | 19 | super.preApply(targetClassName, targetClass, mixinClassName, mixinInfo); 20 | } 21 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/fabricrenderingdata/mixin/BridgedChunkRendererRegionMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.fabricrenderingdata.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Final; 4 | import org.spongepowered.asm.mixin.Mixin; 5 | import org.spongepowered.asm.mixin.Shadow; 6 | 7 | import net.minecraft.util.math.BlockPos; 8 | 9 | import net.fabricmc.fabric.api.rendering.data.v1.RenderAttachedBlockView; 10 | 11 | import me.modmuss50.optifabric.compat.frex.BridgedChunkRendererRegion; 12 | import me.modmuss50.optifabric.compat.frex.mixin.ChunkCacheOF; 13 | 14 | @Mixin(value = BridgedChunkRendererRegion.class, remap = false) 15 | abstract class BridgedChunkRendererRegionMixin implements RenderAttachedBlockView { 16 | @Shadow 17 | private @Final ChunkCacheOF wrapped; 18 | 19 | @Override 20 | public Object getBlockEntityRenderAttachment(BlockPos pos) { 21 | return ((RenderAttachedBlockView) wrapped).getBlockEntityRenderAttachment(pos); 22 | } 23 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/fabricrenderingfluids/FluidRendererFixExternal.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.fabricrenderingfluids; 2 | 3 | import java.util.Objects; 4 | 5 | import net.minecraft.fluid.Fluid; 6 | import net.minecraft.fluid.FluidState; 7 | import net.minecraft.fluid.Fluids; 8 | 9 | import net.fabricmc.fabric.api.client.render.fluid.v1.FluidRenderHandlerRegistry; 10 | 11 | /** Called from {@link FluidRendererFix}, here to avoid class loading Minecraft stuff too early */ 12 | public class FluidRendererFixExternal { 13 | public static boolean needsOptiFine(FluidState state) { 14 | return needsOptiFine(state.getFluid()); 15 | } 16 | 17 | public static boolean needsOptiFine(Fluid fluid) { 18 | return (fluid == Fluids.WATER || fluid == Fluids.FLOWING_WATER) && 19 | Objects.requireNonNull(FluidRenderHandlerRegistry.INSTANCE.get(fluid), "Can't find render handler for water?").getClass().getName().startsWith("net.fabricmc.fabric."); 20 | } 21 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/mixin/ShadersMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.mixin; 2 | 3 | import org.objectweb.asm.Opcodes; 4 | 5 | import org.spongepowered.asm.mixin.Mixin; 6 | import org.spongepowered.asm.mixin.Pseudo; 7 | import org.spongepowered.asm.mixin.injection.At; 8 | import org.spongepowered.asm.mixin.injection.ModifyVariable; 9 | 10 | import net.fabricmc.loader.api.FabricLoader; 11 | 12 | @Pseudo 13 | @Mixin(targets = "net.optifine.shaders.Shaders", remap = false) 14 | class ShadersMixin { 15 | @ModifyVariable(method = "loadShaderPack", at = @At(value = "FIELD", target = "Lnet/optifine/shaders/Shaders;shadersConfig:Ljava/util/Properties;", opcode = Opcodes.GETSTATIC), name = "shadersBlocked") 16 | private static boolean loadCarefully(boolean shadersBlocked) { 17 | if (FabricLoader.getInstance().isModLoaded("satin")) { 18 | SMCLog.callInfo("Shaders can not be loaded, the mod Satin is installed."); 19 | return true; 20 | } else { 21 | return shadersBlocked; 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/carpet/mixin/WorldRendererMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.carpet.mixin; 2 | 3 | import org.objectweb.asm.Opcodes; 4 | 5 | import org.spongepowered.asm.mixin.Mixin; 6 | import org.spongepowered.asm.mixin.injection.At; 7 | import org.spongepowered.asm.mixin.injection.ModifyVariable; 8 | 9 | import net.minecraft.client.render.WorldRenderer; 10 | 11 | import me.modmuss50.optifabric.compat.InterceptingMixin; 12 | import me.modmuss50.optifabric.compat.Shim; 13 | 14 | @Mixin(WorldRenderer.class) 15 | @InterceptingMixin("carpet/mixins/WorldRenderer_pausedShakeMixin") 16 | abstract class WorldRendererMixin { 17 | @ModifyVariable(method = "render", argsOnly = true, ordinal = 0, 18 | at = @At(value = "FIELD", remap = false, target = "renderInfosEntities:Ljava/util/List;", opcode = Opcodes.GETFIELD)) 19 | private float doChangeTickPhase(float previous) { 20 | return changeTickPhase(previous); 21 | } 22 | 23 | @Shim 24 | private native float changeTickPhase(float previous); 25 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/mod/OptifabricError.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.mod; 2 | 3 | import java.io.PrintWriter; 4 | import java.io.StringWriter; 5 | 6 | public class OptifabricError { 7 | private static String error; 8 | private static String stack; 9 | 10 | public static boolean hasError() { 11 | return error != null; 12 | } 13 | 14 | public static String getError() { 15 | return error; 16 | } 17 | 18 | public static void setError(String error) { 19 | OptifabricError.error = error; 20 | } 21 | 22 | public static void setError(Throwable t, String error) { 23 | OptifabricError.error = error; 24 | logError(t); 25 | } 26 | 27 | public static void setError(String error, Object... args) { 28 | OptifabricError.error = String.format(error, args); 29 | } 30 | 31 | public static void logError(Throwable t) { 32 | StringWriter error = new StringWriter(); 33 | t.printStackTrace(new PrintWriter(error)); 34 | stack = error.toString(); 35 | } 36 | 37 | public static String getErrorLog() { 38 | return stack; 39 | } 40 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/patcher/fixes/ChunkDataFix.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.patcher.fixes; 2 | 3 | import org.objectweb.asm.Opcodes; 4 | import org.objectweb.asm.tree.ClassNode; 5 | import org.objectweb.asm.tree.FieldNode; 6 | 7 | import me.modmuss50.optifabric.util.RemappingUtils; 8 | 9 | public class ChunkDataFix implements ClassFixer { 10 | //Newer OptiFine versions change the type of a private field which Indigo uses 11 | 12 | @Override 13 | public void fix(ClassNode optifine, ClassNode minecraft) { 14 | String nonEmptyLayers = RemappingUtils.mapFieldName("class_846$class_849", "field_4450", "Ljava/util/Set;"); 15 | 16 | for (FieldNode field : optifine.fields) { 17 | if (nonEmptyLayers.equals(field.name) && "Ljava/util/Set;".equals(field.desc)) { 18 | return; 19 | } 20 | } 21 | 22 | //Strictly speaking it does have a signature too, but it has no bearing on the outcome to bother making it 23 | optifine.fields.add(new FieldNode(Opcodes.ACC_PRIVATE | Opcodes.ACC_FINAL, nonEmptyLayers, "Ljava/util/Set;", null, null)); 24 | } 25 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/pswg/mixin/FrameBufferMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.pswg.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.Shadow; 5 | import org.spongepowered.asm.mixin.injection.At; 6 | import org.spongepowered.asm.mixin.injection.Inject; 7 | import org.spongepowered.asm.mixin.injection.Redirect; 8 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 9 | 10 | import net.minecraft.client.gl.Framebuffer; 11 | 12 | @Mixin(Framebuffer.class) 13 | abstract class FrameBufferMixin { 14 | @Shadow(remap = false) 15 | private boolean stencilEnabled; 16 | 17 | @Inject(method = "", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gl/Framebuffer;resize(IIZ)V")) 18 | private void stencilUp(CallbackInfo call) { 19 | stencilEnabled = true; 20 | } 21 | 22 | @Redirect(method = "initFbo", at = @At(value = "INVOKE", target = "Lnet/optifine/reflect/ReflectorForge;getForgeUseCombinedDepthStencilAttachment()Z", remap = false)) 23 | private boolean combined() { 24 | return true; 25 | } 26 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/patcher/fixes/AmbientOcclusionCalculatorFix.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.patcher.fixes; 2 | 3 | import org.objectweb.asm.tree.ClassNode; 4 | import org.objectweb.asm.tree.MethodNode; 5 | 6 | import me.modmuss50.optifabric.util.RemappingUtils; 7 | 8 | public class AmbientOcclusionCalculatorFix implements ClassFixer { 9 | @Override 10 | public void fix(ClassNode optifine, ClassNode minecraft) { 11 | //OptiFine manages to switch the constructors around so Indigo expecting the first to take a BlockModelRenderer is wrong 12 | //Simple enough to go fishing for the right constructor and put it back though 13 | String targetDesc = "(L" + RemappingUtils.getClassName("class_778") + ";)V"; 14 | 15 | MethodNode constructor = null; 16 | for (MethodNode method : optifine.methods) { 17 | if ("".equals(method.name) && targetDesc.equals(method.desc)) { 18 | constructor = method; 19 | break; 20 | } 21 | } 22 | 23 | if (constructor != null && optifine.methods.remove(constructor)) { 24 | optifine.methods.add(0, constructor); 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/patcher/fixes/SpriteAtlasTextureFix.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.patcher.fixes; 2 | 3 | import me.modmuss50.optifabric.util.RemappingUtils; 4 | import org.objectweb.asm.tree.ClassNode; 5 | import org.objectweb.asm.tree.LocalVariableNode; 6 | import org.objectweb.asm.tree.MethodNode; 7 | 8 | public class SpriteAtlasTextureFix implements ClassFixer { 9 | 10 | private String stitchName = RemappingUtils.getMethodName("class_1059", "method_18163", "(Lnet/minecraft/class_3300;Ljava/util/stream/Stream;Lnet/minecraft/class_3695;I)Lnet/minecraft/class_1059$class_4007;"); 11 | 12 | @Override 13 | public void fix(ClassNode optifine, ClassNode minecraft) { 14 | for (MethodNode methodNode : optifine.methods) { 15 | if (methodNode.name.equals(stitchName)) { 16 | for (LocalVariableNode localVariable : methodNode.localVariables) { 17 | if (localVariable.name.equals("locsEmissive")) { 18 | //Make this a HashSet and not just a Set so mixin only has 1 target 19 | localVariable.desc = "Ljava/util/HashSet;"; 20 | } 21 | } 22 | } 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/fabricrendererapi/RendererMixinPlugin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.fabricrendererapi; 2 | 3 | import org.objectweb.asm.tree.ClassNode; 4 | 5 | import org.spongepowered.asm.mixin.extensibility.IMixinInfo; 6 | import org.spongepowered.asm.mixin.transformer.ClassInfo; 7 | 8 | import me.modmuss50.optifabric.compat.EmptyMixinPlugin; 9 | import me.modmuss50.optifabric.util.MixinUtils; 10 | 11 | public class RendererMixinPlugin extends EmptyMixinPlugin { 12 | @Override 13 | public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { 14 | switch (mixinInfo.getName()) { 15 | case "BlockModelRendererMixin": 16 | case "BlockRenderManagerMixin": 17 | case "BlockModelRendererNewMixin": 18 | case "BlockRenderManagerNewMixin":{ 19 | ClassInfo info = ClassInfo.forName(targetClassName); 20 | MixinUtils.completeClassInfo(info, targetClass.methods); 21 | break; 22 | } 23 | } 24 | } 25 | 26 | @Override 27 | public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { 28 | } 29 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/indigo/mixin/ChunkCacheOFNewMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.indigo.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Final; 4 | import org.spongepowered.asm.mixin.Mixin; 5 | import org.spongepowered.asm.mixin.Pseudo; 6 | import org.spongepowered.asm.mixin.Shadow; 7 | 8 | import net.minecraft.client.render.chunk.ChunkRendererRegion; 9 | 10 | import net.fabricmc.fabric.impl.client.indigo.renderer.accessor.AccessChunkRendererRegion; 11 | import net.fabricmc.fabric.impl.client.indigo.renderer.render.TerrainRenderContext; 12 | 13 | @Pseudo 14 | @Mixin(targets = "net/optifine/override/ChunkCacheOF", remap = false) 15 | abstract class ChunkCacheOFNewMixin implements AccessChunkRendererRegion { 16 | @Shadow 17 | private @Final ChunkRendererRegion chunkCache; 18 | 19 | @Override 20 | public TerrainRenderContext fabric_getRenderer() { 21 | return ((AccessChunkRendererRegion) chunkCache).fabric_getRenderer(); 22 | } 23 | 24 | @Override 25 | public void fabric_setRenderer(TerrainRenderContext renderer) { 26 | ((AccessChunkRendererRegion) chunkCache).fabric_setRenderer(renderer); 27 | } 28 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/nowplaying/mixin/WorldRendererMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.nowplaying.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.At; 5 | import org.spongepowered.asm.mixin.injection.Redirect; 6 | 7 | import net.minecraft.client.gui.hud.InGameHud; 8 | import net.minecraft.client.render.WorldRenderer; 9 | import net.minecraft.text.Text; 10 | 11 | import me.modmuss50.optifabric.compat.InterceptingMixin; 12 | import me.modmuss50.optifabric.compat.Shim; 13 | 14 | @Mixin(WorldRenderer.class) 15 | @InterceptingMixin("com/github/scotsguy/nowplaying/mixin/WorldRendererMixin") 16 | abstract class WorldRendererMixin { 17 | @Shim 18 | private native void modifyRecordPlayingOverlay(InGameHud hud, Text text); 19 | 20 | @Redirect(method = "playRecord", 21 | at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/InGameHud;setRecordPlayingOverlay(Lnet/minecraft/text/Text;)V", remap = true), 22 | remap = false) 23 | private void doModifyRecordPlayingOverlay(InGameHud hud, Text text) { 24 | modifyRecordPlayingOverlay(hud, text); 25 | } 26 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/dawn/mixin/ItemRendererMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.dawn.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.At; 5 | import org.spongepowered.asm.mixin.injection.Redirect; 6 | 7 | import net.minecraft.client.render.item.ItemRenderer; 8 | import net.minecraft.item.ItemStack; 9 | 10 | import me.modmuss50.optifabric.compat.InterceptingMixin; 11 | import me.modmuss50.optifabric.compat.Shim; 12 | 13 | @Mixin(ItemRenderer.class) 14 | @InterceptingMixin("com/hugman/dawn/mod/mixin/ItemRendererMixin") 15 | abstract class ItemRendererMixin { 16 | @Redirect(method = "renderGuiItemOverlay(Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/item/ItemStack;IILjava/lang/String;)V", 17 | at = @At(value = "INVOKE", target = "Lnet/optifine/reflect/ReflectorForge;isItemDamaged(Lnet/minecraft/item/ItemStack;)Z")) 18 | private boolean optifabric_appearsDamaged(ItemStack stack) { 19 | return dawn_appearsDamaged(stack); //No real need to fallback on the presumably missing Forge hook 20 | } 21 | 22 | @Shim 23 | public native boolean dawn_appearsDamaged(ItemStack stack); 24 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/mixin/ParticleManagerMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.Pseudo; 5 | import org.spongepowered.asm.mixin.injection.At; 6 | import org.spongepowered.asm.mixin.injection.Coerce; 7 | import org.spongepowered.asm.mixin.injection.Inject; 8 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 9 | 10 | import net.minecraft.block.BlockState; 11 | import net.minecraft.client.particle.Particle; 12 | import net.minecraft.util.math.BlockPos; 13 | import net.minecraft.world.BlockRenderView; 14 | 15 | @Pseudo 16 | @Mixin(targets = "net/minecraft/client/particle/ParticleManager") 17 | public abstract class ParticleManagerMixin { 18 | @Inject(method = "updateTerrainParticleColor", at = @At("HEAD"), cancellable = true, remap = true, require = 0) 19 | private static void updateTerrainParticleColor(Particle particle, BlockState state, BlockRenderView world, BlockPos pos, @Coerce Object renderEnv, CallbackInfo call) { 20 | // guard this optifine function against calls with null `renderEnv` 21 | if (renderEnv == null) call.cancel(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/mubble/mixin/ItemRendererMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.mubble.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.At; 5 | import org.spongepowered.asm.mixin.injection.Redirect; 6 | 7 | import net.minecraft.client.render.item.ItemRenderer; 8 | import net.minecraft.item.ItemStack; 9 | 10 | import me.modmuss50.optifabric.compat.InterceptingMixin; 11 | import me.modmuss50.optifabric.compat.Shim; 12 | 13 | @Mixin(ItemRenderer.class) 14 | @InterceptingMixin("com/hugman/mubble/mixin/client/ItemRendererMixin") 15 | abstract class ItemRendererMixin { 16 | @Redirect(method = "renderGuiItemOverlay(Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/item/ItemStack;IILjava/lang/String;)V", 17 | at = @At(value = "INVOKE", target = "Lnet/optifine/reflect/ReflectorForge;isItemDamaged(Lnet/minecraft/item/ItemStack;)Z")) 18 | private boolean optifabric_appearsDamaged(ItemStack stack) { 19 | return mubble_appearsDamaged(stack); //No real need to fallback on the presumably missing Forge hook 20 | } 21 | 22 | @Shim 23 | public native boolean mubble_appearsDamaged(ItemStack stack); 24 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/dawn/mixin/old/ItemRendererOldMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.dawn.mixin.old; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.At; 5 | import org.spongepowered.asm.mixin.injection.Redirect; 6 | 7 | import net.minecraft.client.render.item.ItemRenderer; 8 | import net.minecraft.item.ItemStack; 9 | 10 | import me.modmuss50.optifabric.compat.InterceptingMixin; 11 | import me.modmuss50.optifabric.compat.Shim; 12 | 13 | @Mixin(ItemRenderer.class) 14 | @InterceptingMixin("com/hugman/dawn/mod/mixin/client/ItemRendererMixin") 15 | abstract class ItemRendererMixin { 16 | @Redirect(method = "renderGuiItemOverlay(Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/item/ItemStack;IILjava/lang/String;)V", 17 | at = @At(value = "INVOKE", target = "Lnet/optifine/reflect/ReflectorForge;isItemDamaged(Lnet/minecraft/item/ItemStack;)Z")) 18 | private boolean optifabric_appearsDamaged(ItemStack stack) { 19 | return dawn_appearsDamaged(stack); //No real need to fallback on the presumably missing Forge hook 20 | } 21 | 22 | @Shim 23 | public native boolean dawn_appearsDamaged(ItemStack stack); 24 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/dawn/mixin/older/ItemRendererOldMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.dawn.mixin.older; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.At; 5 | import org.spongepowered.asm.mixin.injection.Redirect; 6 | 7 | import net.minecraft.client.render.item.ItemRenderer; 8 | import net.minecraft.item.ItemStack; 9 | 10 | import me.modmuss50.optifabric.compat.InterceptingMixin; 11 | import me.modmuss50.optifabric.compat.Shim; 12 | 13 | @Mixin(ItemRenderer.class) 14 | @InterceptingMixin("com/hugman/dawn/mod/mixin/client/ItemRendererMixin") 15 | abstract class ItemRendererMixin { 16 | @Redirect(method = "renderGuiItemOverlay(Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/item/ItemStack;IILjava/lang/String;)V", 17 | at = @At(value = "INVOKE", target = "Lnet/optifine/reflect/ReflectorForge;isItemDamaged(Lnet/minecraft/item/ItemStack;)Z")) 18 | private boolean optifabric_appearsDamaged(ItemStack stack) { 19 | return mubble_appearsDamaged(stack); //No real need to fallback on the presumably missing Forge hook 20 | } 21 | 22 | @Shim 23 | public native boolean mubble_appearsDamaged(ItemStack stack); 24 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/fabricrendering/mixin/ShaderProgramMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.fabricrendering.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.At; 5 | import org.spongepowered.asm.mixin.injection.ModifyVariable; 6 | 7 | import net.minecraft.class_5944; 8 | import net.minecraft.util.Identifier; 9 | 10 | import me.modmuss50.optifabric.compat.InterceptingMixin; 11 | import me.modmuss50.optifabric.compat.Shim; 12 | 13 | @Mixin(class_5944.class) 14 | @InterceptingMixin("net/fabricmc/fabric/mixin/client/rendering/shader/ShaderProgramMixin") 15 | abstract class ShaderProgramMixin { 16 | @Shim 17 | private native String modifyProgramId(String id); 18 | 19 | @ModifyVariable(method = "(Lnet/minecraft/class_5912;Lnet/minecraft/util/Identifier;Lnet/minecraft/client/render/VertexFormat;)V", 20 | at = @At(value = "INVOKE", target = "Lnet/minecraft/util/Identifier;getNamespace()Ljava/lang/String;", ordinal = 0), argsOnly = true, allow = 1) 21 | private Identifier modifyProgramID(Identifier id) { 22 | String in = id.toString(); 23 | String out = modifyProgramId(in); 24 | return in != out ? new Identifier(out) : id; 25 | } 26 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/stacc/mixin/PacketByteBufMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.stacc.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.At; 5 | import org.spongepowered.asm.mixin.injection.Inject; 6 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 7 | 8 | import net.minecraft.item.ItemStack; 9 | import net.minecraft.network.PacketByteBuf; 10 | 11 | import me.modmuss50.optifabric.compat.InterceptingMixin; 12 | import me.modmuss50.optifabric.compat.Shim; 13 | 14 | @Mixin(PacketByteBuf.class) 15 | @InterceptingMixin("net/devtech/stacc/mixin/DesyncFixin") 16 | abstract class PacketByteBufMixin { 17 | @Inject(method = "writeItemStack(Lnet/minecraft/item/ItemStack;Z)Lnet/minecraft/network/PacketByteBuf;", 18 | at = @At(value = "INVOKE", target = "Lnet/minecraft/network/PacketByteBuf;writeCompoundTag(Lnet/minecraft/nbt/CompoundTag;)Lnet/minecraft/network/PacketByteBuf;")) 19 | private void write(ItemStack stack, boolean limitedTag, CallbackInfoReturnable call) { 20 | write(stack, call); 21 | } 22 | 23 | @Shim 24 | private native void write(ItemStack stack, CallbackInfoReturnable call); 25 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/mixin/MixinReflectorClass.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.Pseudo; 5 | import org.spongepowered.asm.mixin.Shadow; 6 | import org.spongepowered.asm.mixin.injection.At; 7 | import org.spongepowered.asm.mixin.injection.Inject; 8 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 9 | 10 | //Suppresses some warnings in the log 11 | @Pseudo 12 | @Mixin(targets = "net.optifine.reflect.ReflectorClass", remap = false) 13 | public class MixinReflectorClass { 14 | 15 | @Shadow 16 | private String targetClassName; 17 | 18 | @Shadow 19 | private boolean checked; 20 | 21 | @Inject(method = "getTargetClass", at = @At("HEAD"), cancellable = true, remap = false) 22 | private void getTargetClass(CallbackInfoReturnable> infoReturnable) { 23 | if (!checked) {//Only check the target if it hasn't been done yet 24 | String name = targetClassName.replaceAll("/", "."); 25 | if (name.startsWith("net.minecraft.launchwrapper") || name.startsWith("net.minecraftforge") || "optifine.OptiFineClassTransformer".equals(name)) { 26 | checked = true; 27 | } 28 | } 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/charm/mixin/old/UtilMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.charm.mixin.old; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.At; 5 | import org.spongepowered.asm.mixin.injection.Inject; 6 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 7 | 8 | import com.mojang.datafixers.DSL.TypeReference; 9 | import com.mojang.datafixers.types.Type; 10 | 11 | import net.minecraft.util.Util; 12 | 13 | import me.modmuss50.optifabric.compat.InterceptingMixin; 14 | import me.modmuss50.optifabric.compat.Shim; 15 | 16 | @Mixin(Util.class) 17 | @InterceptingMixin("svenhjol/charm/mixin/UtilMixin") 18 | abstract class UtilMixin { 19 | @Inject(method = "getChoiceTypeInternal", at = @At(value = "INVOKE", target = "Lorg/apache/logging/log4j/Logger;debug(Ljava/lang/String;Ljava/lang/Object;)V", remap = false), cancellable = true) 20 | private static void optifabric_hookAttemptDataFixInternal(TypeReference type, String id, CallbackInfoReturnable> call) { 21 | hookAttemptDataFixInternal(type, id, call); 22 | } 23 | 24 | @Shim 25 | private static native void hookAttemptDataFixInternal(TypeReference type, String id, CallbackInfoReturnable> call); 26 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/util/ASMUtils.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.util; 2 | 3 | import java.io.File; 4 | import java.io.FileInputStream; 5 | import java.io.IOException; 6 | import java.io.InputStream; 7 | import java.util.Objects; 8 | import java.util.zip.ZipEntry; 9 | import java.util.zip.ZipFile; 10 | 11 | import org.objectweb.asm.ClassReader; 12 | import org.objectweb.asm.tree.ClassNode; 13 | 14 | public class ASMUtils { 15 | public static ClassNode readClass(byte[] bytes) { 16 | return readClass(new ClassReader(Objects.requireNonNull(bytes, "Cannot read null class bytes"))); 17 | } 18 | 19 | public static ClassNode readClass(File file) throws IOException { 20 | try (InputStream in = new FileInputStream(Objects.requireNonNull(file, "Cannot read null file"))) { 21 | return readClass(new ClassReader(in)); 22 | } 23 | } 24 | 25 | public static ClassNode readClass(ZipFile jar, ZipEntry entry) throws IOException { 26 | try (InputStream in = jar.getInputStream(entry)) { 27 | return readClass(new ClassReader(Objects.requireNonNull(in, "Entry not present in jar"))); 28 | } 29 | } 30 | 31 | private static ClassNode readClass(ClassReader reader) { 32 | ClassNode node = new ClassNode(); 33 | reader.accept(node, ClassReader.SKIP_FRAMES); 34 | return node; 35 | } 36 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/patcher/Lambda.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2020 Chocohead 3 | * 4 | * This Source Code Form is subject to the terms of the Mozilla Public 5 | * License, v. 2.0. If a copy of the MPL was not distributed with this 6 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. 7 | */ 8 | package me.modmuss50.optifabric.patcher; 9 | 10 | import java.util.Objects; 11 | 12 | class Lambda { 13 | public final String owner, name, desc; 14 | public final String method; 15 | 16 | public Lambda(String owner, String name, String desc, String method) { 17 | this.owner = owner; 18 | this.name = name; 19 | this.desc = desc; 20 | this.method = method; 21 | } 22 | 23 | public String getFullName() { 24 | return owner + '#' + name + desc; 25 | } 26 | 27 | public String getName() { 28 | return name.concat(desc); 29 | } 30 | 31 | @Override 32 | public int hashCode() { 33 | return Objects.hash(owner, name, desc, method); 34 | } 35 | 36 | @Override 37 | public boolean equals(Object obj) { 38 | if (this == obj) return true; 39 | if (!(obj instanceof Lambda)) return false; 40 | 41 | Lambda that = (Lambda) obj; 42 | return Objects.equals(owner, that.owner) && Objects.equals(name, that.name) && Objects.equals(desc, that.desc) && Objects.equals(method, that.method); 43 | } 44 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/stacc/mixin/old/PacketByteBufMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.stacc.mixin.old; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.At; 5 | import org.spongepowered.asm.mixin.injection.Inject; 6 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 7 | 8 | import net.minecraft.item.ItemStack; 9 | import net.minecraft.network.PacketByteBuf; 10 | 11 | import me.modmuss50.optifabric.compat.InterceptingMixin; 12 | import me.modmuss50.optifabric.compat.Shim; 13 | 14 | @Mixin(PacketByteBuf.class) 15 | @InterceptingMixin("net/devtech/stacc/mixin/optifabric/OptifabricDesyncFixin") 16 | abstract class PacketByteBufMixin { 17 | @Inject(method = "writeItemStack(Lnet/minecraft/item/ItemStack;Z)Lnet/minecraft/network/PacketByteBuf;", 18 | at = @At(value = "INVOKE", target = "Lnet/minecraft/network/PacketByteBuf;writeCompoundTag(Lnet/minecraft/nbt/CompoundTag;)Lnet/minecraft/network/PacketByteBuf;")) 19 | private void write(ItemStack stack, boolean limitedTag, CallbackInfoReturnable call) { 20 | write(stack, call); 21 | write(stack, call); //Stacc double injects this Mixin from a bug 22 | } 23 | 24 | @Shim 25 | private native void write(ItemStack stack, CallbackInfoReturnable call); 26 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/aether/mixin/BackgroundRendererMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.aether.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.At; 5 | import org.spongepowered.asm.mixin.injection.Inject; 6 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 7 | 8 | import net.minecraft.client.render.BackgroundRenderer; 9 | import net.minecraft.client.render.BackgroundRenderer.FogType; 10 | import net.minecraft.client.render.Camera; 11 | 12 | import me.modmuss50.optifabric.compat.InterceptingMixin; 13 | import me.modmuss50.optifabric.compat.Shim; 14 | 15 | @Mixin(BackgroundRenderer.class) 16 | @InterceptingMixin("com/aether/mixin/client/BackgroundRendererMixin") 17 | abstract class BackgroundRendererMixin { 18 | @Inject(method = "setupFog", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/systems/RenderSystem;fogDensity(F)V"), cancellable = true, remap = false) 19 | private static void dontChangeFogDensity(Camera camera, FogType fogType, float viewDistance, boolean thickFog, float partialTicks, CallbackInfo call) { 20 | dontChangeFogDensity(camera, fogType, viewDistance, thickFog, call); 21 | } 22 | 23 | @Shim 24 | private static native void dontChangeFogDensity(Camera camera, FogType fogType, float viewDistance, boolean thickFog, CallbackInfo call); 25 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/mixin/VideoOptionsScreenMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.mixin; 2 | 3 | import org.objectweb.asm.Opcodes; 4 | 5 | import org.spongepowered.asm.mixin.Mixin; 6 | import org.spongepowered.asm.mixin.injection.At; 7 | import org.spongepowered.asm.mixin.injection.Inject; 8 | import org.spongepowered.asm.mixin.injection.Slice; 9 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 10 | 11 | import net.minecraft.client.gui.screen.option.VideoOptionsScreen; 12 | 13 | import net.fabricmc.loader.api.FabricLoader; 14 | 15 | @Mixin(VideoOptionsScreen.class) 16 | class VideoOptionsScreenMixin { 17 | @Inject(method = "actionPerformed(Lnet/optifine/gui/GuiButtonOF;I)V", 18 | slice = @Slice(from = @At(value = "CONSTANT", args = "intValue=231"), to = @At(value = "NEW", target = "net/optifine/shaders/gui/GuiShaders")), 19 | at = @At(value = "FIELD", target = "Lnet/minecraft/client/gui/screen/option/VideoOptionsScreen;client:Lnet/minecraft/client/MinecraftClient;", opcode = Opcodes.GETFIELD, remap = true), 20 | cancellable = true, remap = false) 21 | private void actionPerformed(CallbackInfo call) { 22 | if (FabricLoader.getInstance().isModLoaded("satin")) { 23 | Config.callShowGuiMessage("Shaders are not compatible with the Satin mod", "Please remove this mod to enable Shaders"); 24 | call.cancel(); 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/astromine/mixin/GameRendererMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.astromine.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.At; 5 | import org.spongepowered.asm.mixin.injection.Inject; 6 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 7 | 8 | import net.minecraft.client.render.Camera; 9 | import net.minecraft.client.render.GameRenderer; 10 | import net.minecraft.client.util.math.MatrixStack; 11 | 12 | import me.modmuss50.optifabric.compat.InterceptingMixin; 13 | import me.modmuss50.optifabric.compat.Shim; 14 | 15 | @Mixin(GameRenderer.class) 16 | @InterceptingMixin("com/github/chainmailstudios/astromine/mixin/GameRendererMixin") 17 | abstract class GameRendererMixin { 18 | @Shim 19 | private native void onRenderWorld(MatrixStack matrices, Camera camera, float tickDelta, CallbackInfo call); 20 | 21 | @Inject(method = "renderHand", remap = false, 22 | at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/GameRenderer;bobViewWhenHurt(Lnet/minecraft/client/util/math/MatrixStack;F)V", remap = true)) 23 | private void onRenderWorld(MatrixStack matrices, Camera camera, float tickDelta, boolean renderItem, boolean renderOverlay, boolean renderTranslucent, CallbackInfo call) { 24 | onRenderWorld(matrices, camera, tickDelta, call); 25 | } 26 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/carpet/mixin/LevelRendererExtraMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.carpet.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.At; 5 | import org.spongepowered.asm.mixin.injection.ModifyVariable; 6 | 7 | import net.minecraft.client.render.WorldRenderer; 8 | 9 | import me.modmuss50.optifabric.compat.InterceptingMixin; 10 | import me.modmuss50.optifabric.compat.Shim; 11 | 12 | @Mixin(WorldRenderer.class) 13 | @InterceptingMixin("carpet/mixins/LevelRenderer_pausedShakeMixin") 14 | abstract class LevelRendererExtraMixin { 15 | @ModifyVariable(method = "render", argsOnly = true, ordinal = 0, require = 3, allow = 3, 16 | at = @At(value = "INVOKE", 17 | target = "Lnet/minecraft/client/particle/ParticleManager;render(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider$Immediate;Lnet/minecraft/client/render/LightmapTextureManager;Lnet/minecraft/client/render/Camera;FLnet/minecraft/client/render/Frustum;)V", 18 | shift = At.Shift.BEFORE)) 19 | private float doNewChangeTickPhaseBack(float previous) { 20 | return changeTickPhaseBack(previous); 21 | } 22 | 23 | @Shim 24 | private native float changeTickPhaseBack(float previous); 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/mod/OptifineResources.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.mod; 2 | 3 | import java.io.IOException; 4 | import java.io.InputStream; 5 | import java.io.UncheckedIOException; 6 | import java.util.zip.ZipEntry; 7 | import java.util.zip.ZipError; 8 | import java.util.zip.ZipException; 9 | import java.util.zip.ZipFile; 10 | 11 | import org.apache.commons.lang3.StringUtils; 12 | 13 | public enum OptifineResources { 14 | INSTANCE; 15 | 16 | private OptifineResources() { 17 | try { 18 | zip = new ZipFile(OptifabricSetup.optifineRuntimeJar); 19 | } catch (ZipException | ZipError e) { 20 | //Would've thought the classloader would have caught this sooner but whatever 21 | throw new RuntimeException("Error opening Optifine jar, probably corrupt?", e); 22 | } catch (IOException e) { 23 | throw new UncheckedIOException("Error opening Optifine jar", e); 24 | } 25 | } 26 | 27 | private ZipEntry getEntry(String path) { 28 | return StringUtils.isNotBlank(path) ? zip.getEntry(path.charAt(0) == '/' ? path.substring(1) : path) : null; 29 | } 30 | 31 | public boolean hasResource(String path) { 32 | return getEntry(path) != null; 33 | } 34 | 35 | public InputStream getResource(String path) throws IOException { 36 | ZipEntry entry = getEntry(path); 37 | return entry != null ? zip.getInputStream(entry) : null; 38 | } 39 | 40 | private final ZipFile zip; 41 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/borderlessmining/mixin/OptionFullscreenResolutionNewMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.borderlessmining.mixin; 2 | 3 | import me.modmuss50.optifabric.compat.borderlessmining.MagicMixinBridge; 4 | import net.minecraft.client.MinecraftClient; 5 | import net.minecraft.client.gui.screen.Screen; 6 | import net.minecraft.client.gui.screen.option.VideoOptionsScreen; 7 | import org.spongepowered.asm.mixin.Mixin; 8 | import org.spongepowered.asm.mixin.Pseudo; 9 | import org.spongepowered.asm.mixin.injection.At; 10 | import org.spongepowered.asm.mixin.injection.ModifyArgs; 11 | import org.spongepowered.asm.mixin.injection.invoke.arg.Args; 12 | 13 | @Pseudo 14 | @Mixin(targets = "net.optifine.gui.OptionFullscreenResolution", remap = false) 15 | abstract class OptionFullscreenResolutionNewMixin { 16 | @ModifyArgs(method = "make", 17 | at = @At(value = "INVOKE", target = "Lnet/minecraft/class_7172;(Ljava/lang/String;Lnet/minecraft/class_7172$class_7307;Lnet/minecraft/class_7172$class_7277;Lnet/minecraft/class_7172$class_7178;Ljava/lang/Object;Ljava/util/function/Consumer;)V", remap = true)) 18 | private static void modifyOption(Args args) { 19 | Screen screen = MinecraftClient.getInstance().currentScreen; 20 | ((MagicMixinBridge) (screen instanceof MagicMixinBridge ? screen : new VideoOptionsScreen(screen, MinecraftClient.getInstance().options))).optifabric£modifyFullscreenButton(args); 21 | } 22 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/mixin/MixinOptifineConfig.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.Pseudo; 5 | import org.spongepowered.asm.mixin.Shadow; 6 | import org.spongepowered.asm.mixin.injection.At; 7 | import org.spongepowered.asm.mixin.injection.Inject; 8 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 9 | 10 | import net.minecraft.client.option.GameOptions; 11 | 12 | @Pseudo 13 | @Mixin(targets = "net.optifine.Config", remap = false) 14 | public class MixinOptifineConfig { 15 | 16 | @Shadow 17 | private static GameOptions gameSettings; 18 | 19 | @Inject(method = {"isAnimatedTerrain", "isAnimatedTextures", "isSwampColors", "isRandomEntities", "isSmoothBiome", "isCustomColors", "isCustomSky", "isCustomFonts", "isShowCapes", "isConnectedTextures", "isNaturalTextures", "isEmissiveTextures", "isConnectedTexturesFancy", "isFastRender", "isTranslucentBlocksFancy", "isSmoothWorld", "isLazyChunkLoading", "isDynamicFov", "isAlternateBlocks", "isCustomItems", "isDynamicLights", "isDynamicLightsFast", "isCustomEntityModels", "isCustomGuis", "isSmoothFps", "isShowGlErrors"}, 20 | at = @At("HEAD"), cancellable = true, remap = false) 21 | private static void isRandomEntities(CallbackInfoReturnable returnable) { 22 | if (gameSettings == null) { 23 | returnable.setReturnValue(false); 24 | } 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/borderlessmining/mixin/OptionFullscreenResolutionMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.borderlessmining.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.Pseudo; 5 | import org.spongepowered.asm.mixin.injection.At; 6 | import org.spongepowered.asm.mixin.injection.ModifyArgs; 7 | import org.spongepowered.asm.mixin.injection.invoke.arg.Args; 8 | 9 | import net.minecraft.client.MinecraftClient; 10 | import net.minecraft.client.gui.screen.Screen; 11 | import net.minecraft.client.gui.screen.option.VideoOptionsScreen; 12 | 13 | import me.modmuss50.optifabric.compat.borderlessmining.MagicMixinBridge; 14 | 15 | @Pseudo 16 | @Mixin(targets = "net.optifine.gui.OptionFullscreenResolution", remap = false) 17 | abstract class OptionFullscreenResolutionMixin { 18 | @ModifyArgs(method = "make", 19 | at = @At(value = "INVOKE", target = "Lnet/minecraft/class_7172;(Ljava/lang/String;Lnet/minecraft/class_7172$class_7307;Lnet/minecraft/class_7172$class_7303;Lnet/minecraft/class_7172$class_7178;Ljava/lang/Object;Ljava/util/function/Consumer;)V", remap = true)) 20 | private static void modifyOption(Args args) { 21 | Screen screen = MinecraftClient.getInstance().currentScreen; 22 | ((MagicMixinBridge) (screen instanceof MagicMixinBridge ? screen : new VideoOptionsScreen(screen, MinecraftClient.getInstance().options))).optifabric£modifyFullscreenButton(args); 23 | } 24 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/indigo/mixin/BridgedChunkRendererRegionMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.indigo.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Final; 4 | import org.spongepowered.asm.mixin.Mixin; 5 | import org.spongepowered.asm.mixin.Shadow; 6 | 7 | import net.minecraft.client.render.chunk.BlockBufferBuilderStorage; 8 | import net.minecraft.client.render.chunk.ChunkBuilder.BuiltChunk; 9 | import net.minecraft.client.render.chunk.ChunkBuilder.ChunkData; 10 | 11 | import net.fabricmc.fabric.impl.client.indigo.renderer.render.TerrainRenderContext; 12 | 13 | import me.modmuss50.optifabric.compat.frex.BridgedChunkRendererRegion; 14 | import me.modmuss50.optifabric.compat.frex.mixin.ChunkCacheOF; 15 | import me.modmuss50.optifabric.compat.indigo.ChunkRendererRegionAccess; 16 | 17 | @Mixin(value = BridgedChunkRendererRegion.class, remap = false) 18 | abstract class BridgedChunkRendererRegionMixin implements ChunkRendererRegionAccess { 19 | @Shadow 20 | private @Final ChunkCacheOF wrapped; 21 | 22 | @Override 23 | public TerrainRenderContext fabric_getRenderer() { 24 | return ((ChunkRendererRegionAccess) wrapped).fabric_getRenderer(); 25 | } 26 | 27 | @Override 28 | public void optifabric_setRenderer(TerrainRenderContext renderContext, BuiltChunk chunk, ChunkData data, BlockBufferBuilderStorage buffer) { 29 | ((ChunkRendererRegionAccess) wrapped).optifabric_setRenderer(renderContext, chunk, data, buffer); 30 | } 31 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/dawn/mixin/BackgroundRendererMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.dawn.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.At; 5 | import org.spongepowered.asm.mixin.injection.Redirect; 6 | 7 | import net.minecraft.client.render.BackgroundRenderer; 8 | import net.minecraft.client.render.BackgroundRenderer.FogType; 9 | import net.minecraft.client.render.Camera; 10 | import net.minecraft.entity.LivingEntity; 11 | import net.minecraft.entity.effect.StatusEffect; 12 | 13 | import me.modmuss50.optifabric.compat.InterceptingMixin; 14 | import me.modmuss50.optifabric.compat.Shim; 15 | 16 | @Mixin(BackgroundRenderer.class) 17 | @InterceptingMixin("com/hugman/dawn/mod/mixin/BackgroundRendererMixin") 18 | abstract class BackgroundRendererMixin { 19 | @Redirect(method = "setupFog", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;hasStatusEffect(Lnet/minecraft/entity/effect/StatusEffect;)Z", remap = true), remap = false) 20 | private static boolean optifabric_hasStatusEffect(LivingEntity entity, StatusEffect effect, Camera camera, FogType fogType, float viewDistance, boolean thickFog) { 21 | return dawn_hasStatusEffect(entity, effect, camera, fogType, viewDistance, thickFog); 22 | } 23 | 24 | @Shim 25 | private static boolean dawn_hasStatusEffect(LivingEntity entity, StatusEffect effect, Camera camera, FogType fogType, float viewDistance, boolean thickFog) { 26 | throw new AssertionError("Unexpectedly reached code path"); 27 | } 28 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/replaymod/mixin/KeyboardNewerMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.replaymod.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 5 | 6 | import net.minecraft.client.Keyboard; 7 | import net.minecraft.client.gui.screen.Screen; 8 | 9 | import me.modmuss50.optifabric.compat.InterceptingMixin; 10 | import me.modmuss50.optifabric.compat.PlacatingSurrogate; 11 | import me.modmuss50.optifabric.compat.Shim; 12 | 13 | @Mixin(Keyboard.class) 14 | @InterceptingMixin("com/replaymod/lib/de/johni0702/minecraft/gui/versions/mixin/MixinKeyboardListener") 15 | abstract class KeyboardNewerMixin { 16 | @Shim 17 | private native void keyPressed(int action, Screen screen, boolean[] handled, int keyCode, int scanCode, int modifiers, CallbackInfo call); 18 | 19 | @PlacatingSurrogate 20 | private void keyPressed(int action, boolean[] handled, Screen screen, int keyCode, int scanCode, int modifiers, CallbackInfo call) { 21 | keyPressed(action, screen, handled, keyCode, scanCode, modifiers, call); 22 | } 23 | 24 | @Shim 25 | private native void keyReleased(int action, Screen screen, boolean[] handled, int keyCode, int scanCode, int modifiers, CallbackInfo call); 26 | 27 | @PlacatingSurrogate 28 | private void keyReleased(int action, boolean[] handled, Screen screen, int keyCode, int scanCode, int modifiers, CallbackInfo call) { 29 | keyReleased(action, screen, handled, keyCode, scanCode, modifiers, call); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/sandwichable/mixin/BuiltinModelItemRendererMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.sandwichable.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.At; 5 | import org.spongepowered.asm.mixin.injection.Inject; 6 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 7 | 8 | import net.minecraft.client.render.VertexConsumerProvider; 9 | import net.minecraft.client.render.item.BuiltinModelItemRenderer; 10 | import net.minecraft.client.render.model.json.ModelTransformation.Mode; 11 | import net.minecraft.client.util.math.MatrixStack; 12 | import net.minecraft.item.ItemStack; 13 | 14 | import me.modmuss50.optifabric.compat.InterceptingMixin; 15 | import me.modmuss50.optifabric.compat.Shim; 16 | 17 | @Mixin(BuiltinModelItemRenderer.class) 18 | @InterceptingMixin("io/github/foundationgames/sandwichable/mixin/BuiltinModelItemRendererMixin") 19 | abstract class BuiltinModelItemRendererMixin { 20 | @Shim 21 | private native void renderSandwichGui(ItemStack stack, Mode mode, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay, CallbackInfo call); 22 | 23 | @Inject(method = "renderRaw", remap = false, 24 | at = @At(value = "INVOKE", target = "Lnet/minecraft/item/BlockItem;getBlock()Lnet/minecraft/block/Block;", shift = At.Shift.AFTER, remap = true)) 25 | private void sandwich_render(ItemStack stack, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay, CallbackInfo call) { 26 | renderSandwichGui(stack, Mode.GROUND, matrices, vertexConsumers, light, overlay, call); 27 | } 28 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/sandwichable/mixin/old/BuiltinModelItemRendererMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.sandwichable.mixin.old; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.At; 5 | import org.spongepowered.asm.mixin.injection.Inject; 6 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 7 | 8 | import net.minecraft.client.render.VertexConsumerProvider; 9 | import net.minecraft.client.render.item.BuiltinModelItemRenderer; 10 | import net.minecraft.client.render.model.json.ModelTransformation.Mode; 11 | import net.minecraft.client.util.math.MatrixStack; 12 | import net.minecraft.item.ItemStack; 13 | 14 | import me.modmuss50.optifabric.compat.InterceptingMixin; 15 | import me.modmuss50.optifabric.compat.Shim; 16 | 17 | @Mixin(BuiltinModelItemRenderer.class) 18 | @InterceptingMixin("io/github/foundationgames/sandwichable/mixin/BuiltinModelItemRendererMixin") 19 | abstract class BuiltinModelItemRendererMixin { 20 | @Shim 21 | private native void sandwich_render(ItemStack stack, Mode mode, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay, CallbackInfo call); 22 | 23 | @Inject(method = "renderRaw", remap = false, 24 | at = @At(value = "INVOKE", target = "Lnet/minecraft/item/BlockItem;getBlock()Lnet/minecraft/block/Block;", shift = At.Shift.AFTER, remap = true)) 25 | private void sandwich_render(ItemStack stack, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay, CallbackInfo call) { 26 | sandwich_render(stack, Mode.GROUND, matrices, vertexConsumers, light, overlay, call); 27 | } 28 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/uglyscoreboardfix/InGameHudFix.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.uglyscoreboardfix; 2 | 3 | import java.util.ListIterator; 4 | 5 | import org.objectweb.asm.tree.ClassNode; 6 | import org.objectweb.asm.tree.MethodNode; 7 | 8 | import me.modmuss50.optifabric.patcher.fixes.ClassFixer; 9 | import me.modmuss50.optifabric.util.RemappingUtils; 10 | 11 | public class InGameHudFix implements ClassFixer { 12 | //Recompiling causes OptiFine to move some (but not all) of the local variables around 13 | //It's not actually changed other than that though so we can just put the old method back 14 | 15 | @Override 16 | public void fix(ClassNode optifine, ClassNode minecraft) { 17 | String renderScoreboardSidebarDesc = "(Lnet/minecraft/class_4587;Lnet/minecraft/class_266;)V"; //(MatrixStack, ScoreboardObjective) 18 | String renderScoreboardSidebar = RemappingUtils.getMethodName("class_329", "method_1757", renderScoreboardSidebarDesc); 19 | renderScoreboardSidebarDesc = RemappingUtils.mapMethodDescriptor(renderScoreboardSidebarDesc); // ^ InGameHud, renderScoreboardSidebar 20 | 21 | for (ListIterator it = optifine.methods.listIterator(); it.hasNext();) { 22 | MethodNode method = it.next(); 23 | 24 | if (renderScoreboardSidebar.equals(method.name) && renderScoreboardSidebarDesc.equals(method.desc)) { 25 | for (MethodNode original : minecraft.methods) { 26 | if (renderScoreboardSidebar.equals(original.name) && renderScoreboardSidebarDesc.equals(original.desc)) { 27 | it.set(original); 28 | break; 29 | } 30 | } 31 | 32 | break; 33 | } 34 | } 35 | } 36 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/sandwichable/mixin/BuiltinModelItemRendererNewMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.sandwichable.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.At; 5 | import org.spongepowered.asm.mixin.injection.Inject; 6 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 7 | 8 | import net.minecraft.client.render.VertexConsumerProvider; 9 | import net.minecraft.client.render.item.BuiltinModelItemRenderer; 10 | import net.minecraft.client.render.model.json.ModelTransformation.Mode; 11 | import net.minecraft.client.util.math.MatrixStack; 12 | import net.minecraft.item.ItemStack; 13 | 14 | import me.modmuss50.optifabric.compat.InterceptingMixin; 15 | import me.modmuss50.optifabric.compat.Shim; 16 | 17 | @Mixin(BuiltinModelItemRenderer.class) 18 | @InterceptingMixin("io/github/foundationgames/sandwichable/mixin/BuiltinModelItemRendererMixin") 19 | abstract class BuiltinModelItemRendererNewMixin { 20 | @Shim 21 | private native void sandwichable$renderSandwichGui(ItemStack stack, Mode mode, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay, CallbackInfo call); 22 | 23 | @Inject(method = "renderRaw", remap = false, 24 | at = @At(value = "INVOKE", target = "Lnet/minecraft/item/BlockItem;getBlock()Lnet/minecraft/block/Block;", shift = At.Shift.AFTER, remap = true)) 25 | private void sandwich_render(ItemStack stack, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay, CallbackInfo call) { 26 | sandwichable$renderSandwichGui(stack, Mode.GROUND, matrices, vertexConsumers, light, overlay, call); 27 | } 28 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/apoli/ApoliMixinPlugin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.apoli; 2 | 3 | import org.objectweb.asm.Opcodes; 4 | import org.objectweb.asm.tree.AbstractInsnNode; 5 | import org.objectweb.asm.tree.InsnList; 6 | import org.objectweb.asm.tree.InsnNode; 7 | import org.objectweb.asm.tree.LdcInsnNode; 8 | import org.objectweb.asm.tree.MethodInsnNode; 9 | 10 | import net.fabricmc.tinyremapper.IMappingProvider.Member; 11 | 12 | import me.modmuss50.optifabric.compat.origins.OriginsMixinPlugin; 13 | import me.modmuss50.optifabric.util.RemappingUtils; 14 | 15 | public class ApoliMixinPlugin extends OriginsMixinPlugin { 16 | @Override 17 | protected void addFocusedEntity(InsnList extra, Member getFocusedEntity) { 18 | extra.add(new InsnNode(Opcodes.ACONST_NULL)); 19 | extra.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, getFocusedEntity.owner, getFocusedEntity.name, getFocusedEntity.desc, false)); 20 | extra.add(new InsnNode(Opcodes.POP)); 21 | extra.add(new InsnNode(Opcodes.ACONST_NULL)); 22 | extra.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, getFocusedEntity.owner, getFocusedEntity.name, getFocusedEntity.desc, false)); 23 | } 24 | 25 | @Override 26 | protected String fogStart() { 27 | return "setShaderFogStart"; 28 | } 29 | 30 | @Override 31 | protected String fogEnd() { 32 | return "setShaderFogEnd"; 33 | } 34 | 35 | @Override 36 | protected AbstractInsnNode getFogTarget() { 37 | return new LdcInsnNode(0.25F); 38 | } 39 | 40 | @Override 41 | protected Member getElytraMixinTarget() {//ItemStack, isOf, (Item) 42 | return RemappingUtils.mapMethod("class_1799", "method_31574", "(Lnet/minecraft/class_1792;)Z"); 43 | } 44 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/fabricrendering/mixin/WorldRendererMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.fabricrendering.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.At; 5 | import org.spongepowered.asm.mixin.injection.Inject; 6 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 7 | 8 | import net.minecraft.client.render.WorldRenderer; 9 | 10 | import me.modmuss50.optifabric.compat.InterceptingMixin; 11 | import me.modmuss50.optifabric.compat.Shim; 12 | 13 | @Mixin(WorldRenderer.class) 14 | @InterceptingMixin({"net/fabricmc/fabric/mixin/client/rendering/MixinWorldRenderer", "net/fabricmc/fabric/mixin/client/rendering/WorldRendererMixin"}) 15 | abstract class WorldRendererMixin { 16 | @Inject(method = "render", require = 2, 17 | at = {@At(value = "INVOKE", 18 | target = "Lnet/minecraft/client/particle/ParticleManager;renderParticles(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider$Immediate;Lnet/minecraft/client/render/LightmapTextureManager;Lnet/minecraft/client/render/Camera;FLnet/minecraft/client/render/Frustum;)V"), 19 | @At(value = "INVOKE", 20 | target = "Lnet/minecraft/client/particle/ParticleManager;render(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider$Immediate;Lnet/minecraft/client/render/LightmapTextureManager;Lnet/minecraft/client/render/Camera;FLnet/minecraft/client/render/Frustum;)V")}) 21 | private void onReallyRenderParticles(CallbackInfo call) { 22 | onRenderParticles(call); 23 | } 24 | 25 | @Shim 26 | private native void onRenderParticles(CallbackInfo call); 27 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/mixin/MixinDefaultResourcePack.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.mixin; 2 | 3 | import java.io.IOException; 4 | import java.io.InputStream; 5 | 6 | import org.spongepowered.asm.mixin.Mixin; 7 | import org.spongepowered.asm.mixin.Shadow; 8 | import org.spongepowered.asm.mixin.injection.At; 9 | import org.spongepowered.asm.mixin.injection.Inject; 10 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 11 | 12 | import net.minecraft.resource.DefaultResourcePack; 13 | import net.minecraft.resource.ResourceType; 14 | import net.minecraft.util.Identifier; 15 | 16 | import me.modmuss50.optifabric.mod.OptifineResources; 17 | 18 | @Mixin(value = DefaultResourcePack.class, priority = 400) 19 | abstract class MixinDefaultResourcePack { 20 | @Shadow 21 | private static native String getPath(ResourceType type, Identifier id); 22 | 23 | @Inject(method = "findInputStream", at = @At("HEAD"), cancellable = true) 24 | protected void onFindInputStream(ResourceType type, Identifier id, CallbackInfoReturnable callback) { 25 | String path = getPath(type, id); 26 | 27 | try { 28 | InputStream stream = OptifineResources.INSTANCE.getResource(path); 29 | if (stream != null) callback.setReturnValue(stream); 30 | } catch (IOException e) { 31 | //Optifine does this if it goes wrong so we will too 32 | e.printStackTrace(); 33 | } 34 | } 35 | 36 | @Inject(method = "contains", at = @At("HEAD"), cancellable = true) 37 | public void doesContain(ResourceType type, Identifier id, CallbackInfoReturnable callback) { 38 | String path = getPath(type, id); 39 | 40 | if (OptifineResources.INSTANCE.hasResource(path)) callback.setReturnValue(true); 41 | } 42 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/customfog/mixin/BackgroundRendererMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.customfog.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.At; 5 | import org.spongepowered.asm.mixin.injection.Inject; 6 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 7 | 8 | import net.minecraft.client.render.BackgroundRenderer; 9 | import net.minecraft.client.render.BackgroundRenderer.FogType; 10 | import net.minecraft.client.render.Camera; 11 | import net.minecraft.entity.Entity; 12 | import net.minecraft.fluid.FluidState; 13 | 14 | import me.modmuss50.optifabric.compat.InterceptingMixin; 15 | import me.modmuss50.optifabric.compat.PlacatingSurrogate; 16 | import me.modmuss50.optifabric.compat.Shim; 17 | 18 | @Mixin(BackgroundRenderer.class) 19 | @InterceptingMixin("setadokalo/customfog/mixin/RendererMixin") 20 | abstract class BackgroundRendererMixin { 21 | @PlacatingSurrogate 22 | private static void setFogFalloff(Camera camera, FogType fogType, float viewDistance, boolean thickFog, CallbackInfo call) { 23 | } 24 | 25 | @Inject(method = "setupFog", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/systems/RenderSystem;setupNvFogDistance()V"), remap = false) 26 | private static void setFogFalloff(Camera camera, FogType fogType, float viewDistance, boolean thickFog, float partialTicks, CallbackInfo call) { 27 | setFogFalloff(camera, fogType, viewDistance, thickFog, call, camera.getSubmergedFluidState(), camera.getFocusedEntity()); 28 | } 29 | 30 | @Shim 31 | private static native void setFogFalloff(Camera camera, FogType fogType, float viewDistance, boolean thickFog, CallbackInfo call, FluidState state, Entity entity); 32 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/multiconnect/mixin/ModelLoaderMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.multiconnect.mixin; 2 | 3 | import java.util.Iterator; 4 | import java.util.Set; 5 | 6 | import org.spongepowered.asm.mixin.Mixin; 7 | import org.spongepowered.asm.mixin.injection.At; 8 | import org.spongepowered.asm.mixin.injection.Redirect; 9 | 10 | import net.minecraft.block.Block; 11 | import net.minecraft.client.render.model.ModelLoader; 12 | import net.minecraft.util.Identifier; 13 | import net.minecraft.util.registry.DefaultedRegistry; 14 | 15 | import me.modmuss50.optifabric.compat.InterceptingMixin; 16 | import me.modmuss50.optifabric.compat.Shim; 17 | 18 | @Mixin(ModelLoader.class) 19 | @InterceptingMixin("net/earthcomputer/multiconnect/mixin/bridge/MixinModelLoader") 20 | abstract class ModelLoaderMixin { 21 | @Redirect(method = "processLoading", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/registry/DefaultedRegistry;getIds()Ljava/util/Set;", remap = true), remap = false) 22 | private Set redirectGetIDs(DefaultedRegistry registry) { 23 | return redirectGetIds(registry); 24 | } 25 | 26 | @Shim 27 | private native Set redirectGetIds(DefaultedRegistry registry); 28 | 29 | @Redirect(method = "processLoading", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/registry/DefaultedRegistry;iterator()Ljava/util/Iterator;", remap = true), remap = false) 30 | private Iterator doRedirectBlockRegistryIterator(DefaultedRegistry registry) { 31 | return redirectBlockRegistryIterator(registry); 32 | } 33 | 34 | @Shim 35 | private native Iterator redirectBlockRegistryIterator(DefaultedRegistry registry); 36 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/full_slabs/mixin/BlockRenderManagerMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.full_slabs.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.At; 5 | import org.spongepowered.asm.mixin.injection.Coerce; 6 | import org.spongepowered.asm.mixin.injection.Inject; 7 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 8 | 9 | import net.minecraft.block.BlockState; 10 | import net.minecraft.client.render.VertexConsumer; 11 | import net.minecraft.client.render.block.BlockRenderManager; 12 | import net.minecraft.client.util.math.MatrixStack; 13 | import net.minecraft.util.math.BlockPos; 14 | import net.minecraft.world.BlockRenderView; 15 | 16 | import me.modmuss50.optifabric.compat.InterceptingMixin; 17 | import me.modmuss50.optifabric.compat.Shim; 18 | 19 | @Mixin(BlockRenderManager.class) 20 | @InterceptingMixin("dev/micalobia/full_slabs/mixin/client/render/block/BlockRenderManagerMixin") 21 | abstract class BlockRenderManagerMixin { 22 | @Inject(method = "renderBlockDamage", remap = false, cancellable = true, 23 | at = @At(value = "INVOKE", remap = true, 24 | target = "Lnet/minecraft/client/render/block/BlockModels;getModel(Lnet/minecraft/block/BlockState;)Lnet/minecraft/client/render/model/BakedModel;")) 25 | private void renderSlabDamage(BlockState state, BlockPos pos, BlockRenderView world, MatrixStack matrices, VertexConsumer vertices, @Coerce Object modelData, CallbackInfo call) { 26 | renderSlabDamage(state, pos, world, matrices, vertices, call); 27 | } 28 | 29 | @Shim 30 | public abstract void renderSlabDamage(BlockState state, BlockPos pos, BlockRenderView world, MatrixStack matrices, VertexConsumer vertices, CallbackInfo call); 31 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/origins/mixin/ElytraFeatureRendererMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.origins.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.At; 5 | import org.spongepowered.asm.mixin.injection.Inject; 6 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 7 | 8 | import net.minecraft.client.render.VertexConsumerProvider; 9 | import net.minecraft.client.render.entity.feature.ElytraFeatureRenderer; 10 | import net.minecraft.client.util.math.MatrixStack; 11 | import net.minecraft.entity.LivingEntity; 12 | import net.minecraft.item.Item; 13 | import net.minecraft.item.ItemStack; 14 | import net.minecraft.item.Items; 15 | 16 | import me.modmuss50.optifabric.compat.InterceptingMixin; 17 | import me.modmuss50.optifabric.compat.Shim; 18 | 19 | @Mixin(ElytraFeatureRenderer.class) 20 | @InterceptingMixin("io/github/apace100/origins/mixin/ElytraFeatureRendererMixin") 21 | abstract class ElytraFeatureRendererMixin { 22 | @Shim 23 | private native Item modifyEquippedStackToElytra(ItemStack stack, MatrixStack matrices, VertexConsumerProvider vertexConsumerProvider, int light, LivingEntity entity, 24 | float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch); 25 | 26 | @Inject(method = "shouldRender", at = @At("HEAD"), remap = false, cancellable = true) 27 | public void shouldRender(ItemStack stack, LivingEntity entity, CallbackInfoReturnable call) { 28 | if (modifyEquippedStackToElytra(stack, null, null, 0, entity, 0, 0, 0, 0, 0, 0) == Items.ELYTRA) { 29 | call.setReturnValue(true); //Let's take the positive approach that those parameters are never needed 30 | } 31 | } 32 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/apoli/mixin/ElytraFeatureRendererMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.apoli.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.At; 5 | import org.spongepowered.asm.mixin.injection.Inject; 6 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 7 | 8 | import net.minecraft.client.render.VertexConsumerProvider; 9 | import net.minecraft.client.render.entity.feature.ElytraFeatureRenderer; 10 | import net.minecraft.client.util.math.MatrixStack; 11 | import net.minecraft.entity.LivingEntity; 12 | import net.minecraft.item.Item; 13 | import net.minecraft.item.ItemStack; 14 | import net.minecraft.item.Items; 15 | 16 | import me.modmuss50.optifabric.compat.InterceptingMixin; 17 | import me.modmuss50.optifabric.compat.Shim; 18 | 19 | @Mixin(ElytraFeatureRenderer.class) 20 | @InterceptingMixin("io/github/apace100/apoli/mixin/ElytraFeatureRendererMixin") 21 | abstract class ElytraFeatureRendererMixin { 22 | @Shim 23 | private native boolean modifyEquippedStackToElytra(ItemStack stack, Item item, MatrixStack matrices, VertexConsumerProvider vertexConsumerProvider, int light, LivingEntity entity, 24 | float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch); 25 | 26 | @Inject(method = "shouldRender", at = @At("HEAD"), remap = false, cancellable = true) 27 | public void shouldRender(ItemStack stack, LivingEntity entity, CallbackInfoReturnable call) { 28 | if (modifyEquippedStackToElytra(stack, Items.ELYTRA, null, null, 0, entity, 0, 0, 0, 0, 0, 0)) { 29 | call.setReturnValue(true); //Let's take the positive approach that those parameters are never needed 30 | } 31 | } 32 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/customfog/CustomFogMixinPlugin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.customfog; 2 | 3 | import org.objectweb.asm.Opcodes; 4 | import org.objectweb.asm.tree.ClassNode; 5 | import org.objectweb.asm.tree.InsnList; 6 | import org.objectweb.asm.tree.JumpInsnNode; 7 | import org.objectweb.asm.tree.LabelNode; 8 | import org.objectweb.asm.tree.MethodInsnNode; 9 | import org.objectweb.asm.tree.MethodNode; 10 | 11 | import org.spongepowered.asm.mixin.extensibility.IMixinInfo; 12 | 13 | import me.modmuss50.optifabric.compat.InterceptingMixinPlugin; 14 | import me.modmuss50.optifabric.util.RemappingUtils; 15 | 16 | public class CustomFogMixinPlugin extends InterceptingMixinPlugin { 17 | @Override 18 | public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { 19 | if ("BackgroundRendererMixin".equals(mixinInfo.getName())) { 20 | //BackgroundRenderer, applyFog, (Camera, BackgroundRenderer$FogType) 21 | String applyFog = RemappingUtils.getMethodName("class_758", "method_3211", "(Lnet/minecraft/class_4184;Lnet/minecraft/class_758$class_4596;FZ)V"); 22 | 23 | for (MethodNode method : targetClass.methods) { 24 | if (applyFog.equals(method.name)) { 25 | LabelNode skip = new LabelNode(); 26 | 27 | InsnList extra = new InsnList(); 28 | extra.add(new JumpInsnNode(Opcodes.GOTO, skip)); 29 | extra.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "com/mojang/blaze3d/systems/RenderSystem", "setupNvFogDistance", "()V", false)); 30 | extra.add(skip); 31 | 32 | method.instructions.insertBefore(method.instructions.getLast(), extra); 33 | } 34 | } 35 | } 36 | 37 | super.preApply(targetClassName, targetClass, mixinClassName, mixinInfo); 38 | } 39 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/fabricrendererapi/mixin/ConnectedTexturesMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.fabricrendererapi.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.Pseudo; 5 | import org.spongepowered.asm.mixin.injection.At; 6 | import org.spongepowered.asm.mixin.injection.Inject; 7 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 8 | import org.spongepowered.asm.mixin.injection.callback.LocalCapture; 9 | 10 | import net.minecraft.block.BlockState; 11 | import net.minecraft.client.render.model.BakedModel; 12 | import net.minecraft.client.texture.Sprite; 13 | import net.minecraft.util.math.BlockPos; 14 | import net.minecraft.world.BlockView; 15 | 16 | import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel; 17 | 18 | @Pseudo 19 | @Mixin(targets = "net.optifine.ConnectedTextures", remap = false) 20 | abstract class ConnectedTexturesMixin { 21 | @Inject(method = "getNeighbourIcon", 22 | at = @At(value = "INVOKE_ASSIGN", 23 | target = "Lnet/minecraft/client/render/block/BlockModels;getModel(Lnet/minecraft/block/BlockState;)Lnet/minecraft/client/render/model/BakedModel;", 24 | remap = true), 25 | locals = LocalCapture.CAPTURE_FAILEXCEPTION, //Avoid crashing completely when it can be mitigated turning off connected textures 26 | cancellable = true) 27 | private static void skipNeighbourIcon(BlockView world, BlockState state, BlockPos pos, BlockState neighbourState, int side, CallbackInfoReturnable call, BakedModel model) { 28 | if (model instanceof FabricBakedModel && !((FabricBakedModel) model).isVanillaAdapter()) { 29 | call.setReturnValue(null); //Could attempt to handle properly via FabricBakedModel#emitBlockQuads... 30 | } 31 | } 32 | } -------------------------------------------------------------------------------- /src/main/resources/fabric.mod.json: -------------------------------------------------------------------------------- 1 | { 2 | "schemaVersion": 1, 3 | "id": "optifabric", 4 | "version": "${version}", 5 | 6 | "name": "OptiFabric", 7 | "description": "OptiFabric is a mod that loads OptiFine into Fabric", 8 | "authors": [ 9 | "Modmuss50", 10 | "Chocohead" 11 | ], 12 | "contact": { 13 | "homepage": "https://www.curseforge.com/minecraft/mc-mods/optifabric", 14 | "sources": "https://github.com/Chocohead/OptiFabric", 15 | "issues": "https://github.com/Chocohead/OptiFabric/issues" 16 | }, 17 | "mixins": [ 18 | "optifabric.mixins.json" 19 | ], 20 | "license": "MPL-2.0", 21 | "icon": "assets/optifabric/icon.png", 22 | "environment": "client", 23 | "entrypoints": { 24 | "mm:early_risers": [ 25 | "me.modmuss50.optifabric.mod.TextSetup", 26 | "me.modmuss50.optifabric.mod.RegistriesSetup", 27 | "me.modmuss50.optifabric.mod.OptifabricSetup", 28 | "me.modmuss50.optifabric.mod.DrawContextSetup" 29 | ], 30 | "preLaunch": [ 31 | "me.modmuss50.optifabric.mod.OptifabricLoadGuard" 32 | ] 33 | }, 34 | "custom": { 35 | "fabric-renderer-indigo:force_compatibility" : true 36 | }, 37 | "depends": { 38 | "fabricloader": ">=0.8.0", 39 | "minecraft": ["1.16.1", "1.16.2", "1.16.3", "1.16.4", "1.16.5", "1.17-alpha.21.8.b", "1.17-beta.4", "1.17", "1.17.1", "1.18-beta.1", "1.18", "1.18.1", "1.18.2", "1.19", "1.19.1", "1.19.2", "1.19.3", "1.19.4", "1.20", "1.20.1", "1.20.2", "1.20.4"], 40 | "mm": ">=2.0" 41 | }, 42 | "conflicts": { 43 | "sodium": "*" 44 | }, 45 | "breaks": { 46 | "no_fog": "*", 47 | "thallium": "*", 48 | "xradiation": "*", 49 | "cardinal-components-item": "<2.4.2", 50 | "architectury": ">1.2.72 <1.3.77", 51 | "meteor-client": ">=0.4.1" 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/mod/Preloader.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.mod; 2 | 3 | import javax.lang.model.SourceVersion; 4 | 5 | import net.fabricmc.loader.api.FabricLoader; 6 | 7 | import net.fabricmc.tinyremapper.ClassInstance; 8 | import net.fabricmc.tinyremapper.InputTag; 9 | import net.fabricmc.tinyremapper.MemberInstance; 10 | import net.fabricmc.tinyremapper.api.TrMember.MemberType; 11 | 12 | public class Preloader { 13 | public static void preloadTinyRemapper() { 14 | ClassInstance.class.getClass(); 15 | InputTag.class.getClass(); 16 | MemberInstance.class.getClass(); 17 | MemberType.class.getClass(); 18 | SourceVersion.class.getClass(); //Classes in javax don't get the special treatment java ones do 19 | 20 | ClassLoader classLoader = Preloader.class.getClassLoader(); 21 | for (String type : new String[] { 22 | "net.fabricmc.tinyremapper.AsmClassRemapper$AsmAnnotationRemapper", 23 | "net.fabricmc.tinyremapper.AsmClassRemapper$AsmAnnotationRemapper$AsmArrayAttributeAnnotationRemapper", 24 | "net.fabricmc.tinyremapper.AsmClassRemapper$AsmRecordComponentRemapper", 25 | "net.fabricmc.tinyremapper.AsmClassRemapper$AsmFieldRemapper", 26 | "net.fabricmc.tinyremapper.AsmClassRemapper$AsmMethodRemapper", 27 | "net.fabricmc.tinyremapper.Propagator", 28 | "net.fabricmc.tinyremapper.TinyRemapper$2", 29 | "net.fabricmc.tinyremapper.TinyRemapper$Direction", 30 | "net.fabricmc.tinyremapper.VisitTrackingClassRemapper$VisitKind", 31 | }) { 32 | try { 33 | Class.forName(type, false, classLoader); 34 | } catch (ClassNotFoundException e) { 35 | System.err.println("Failed to preload " + type); 36 | if (FabricLoader.getInstance().isDevelopmentEnvironment()) { 37 | e.printStackTrace(); 38 | } 39 | } 40 | } 41 | } 42 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/fabricrendering/mixin/WorldRendererNewMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.fabricrendering.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.At; 5 | import org.spongepowered.asm.mixin.injection.Inject; 6 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 7 | 8 | import net.minecraft.client.render.WorldRenderer; 9 | 10 | import me.modmuss50.optifabric.compat.InterceptingMixin; 11 | import me.modmuss50.optifabric.compat.Shim; 12 | 13 | @Mixin(WorldRenderer.class) 14 | @InterceptingMixin("net/fabricmc/fabric/mixin/client/rendering/WorldRendererMixin") 15 | abstract class WorldRendererNewMixin { 16 | @Inject(method = "render(Lnet/minecraft/client/util/math/MatrixStack;FJZLnet/minecraft/client/render/Camera;Lnet/minecraft/client/render/GameRenderer;Lnet/minecraft/client/render/LightmapTextureManager;Lorg/joml/Matrix4f;)V", require = 2, 17 | at = {@At(value = "INVOKE", 18 | target = "Lnet/minecraft/client/particle/ParticleManager;renderParticles(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider$Immediate;Lnet/minecraft/client/render/LightmapTextureManager;Lnet/minecraft/client/render/Camera;FLnet/minecraft/client/render/Frustum;)V"), 19 | @At(value = "INVOKE", 20 | target = "Lnet/minecraft/client/particle/ParticleManager;render(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider$Immediate;Lnet/minecraft/client/render/LightmapTextureManager;Lnet/minecraft/client/render/Camera;FLnet/minecraft/client/render/Frustum;)V")}) 21 | private void onReallyRenderParticles(CallbackInfo call) { 22 | onRenderParticles(call); 23 | } 24 | 25 | @Shim 26 | private native void onRenderParticles(CallbackInfo call); 27 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/images/mixin/older/BuiltinModelItemRendererMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.images.mixin.older; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.At; 5 | import org.spongepowered.asm.mixin.injection.Inject; 6 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 7 | 8 | import net.minecraft.client.render.VertexConsumerProvider; 9 | import net.minecraft.client.render.item.BuiltinModelItemRenderer; 10 | import net.minecraft.client.render.model.json.ModelTransformation.Mode; 11 | import net.minecraft.client.util.math.MatrixStack; 12 | import net.minecraft.item.ItemStack; 13 | 14 | import me.modmuss50.optifabric.compat.InterceptingMixin; 15 | import me.modmuss50.optifabric.compat.Shim; 16 | 17 | @Mixin(BuiltinModelItemRenderer.class) 18 | @InterceptingMixin("net/sorenon/images/mixin/BuiltinModelItemRendererMixin") 19 | abstract class BuiltinModelItemRendererMixin { 20 | @Shim 21 | private native void inject_render(ItemStack stack, Mode mode, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay, CallbackInfo call); 22 | 23 | @Inject(method = "renderRaw", remap = false, 24 | at = @At(value = "INVOKE", 25 | target = "Lnet/minecraft/client/render/block/entity/BannerBlockEntityRenderer;renderCanvas(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;IILnet/minecraft/client/model/ModelPart;Lnet/minecraft/client/util/SpriteIdentifier;ZLjava/util/List;Z)V", 26 | remap = true)) 27 | private void inject_render(ItemStack stack, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay, CallbackInfo call) { 28 | inject_render(stack, /* Hopefully not used */ null, matrices, vertexConsumers, light, overlay, call); 29 | } 30 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/aether/AetherMixinPlugin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.aether; 2 | 3 | import org.objectweb.asm.Opcodes; 4 | import org.objectweb.asm.tree.ClassNode; 5 | import org.objectweb.asm.tree.InsnList; 6 | import org.objectweb.asm.tree.InsnNode; 7 | import org.objectweb.asm.tree.JumpInsnNode; 8 | import org.objectweb.asm.tree.LabelNode; 9 | import org.objectweb.asm.tree.MethodInsnNode; 10 | import org.objectweb.asm.tree.MethodNode; 11 | 12 | import org.spongepowered.asm.mixin.extensibility.IMixinInfo; 13 | 14 | import me.modmuss50.optifabric.compat.InterceptingMixinPlugin; 15 | import me.modmuss50.optifabric.util.RemappingUtils; 16 | 17 | public class AetherMixinPlugin extends InterceptingMixinPlugin { 18 | @Override 19 | public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { 20 | if ("BackgroundRendererMixin".equals(mixinInfo.getName())) { 21 | //BackgroundRenderer, applyFog, (Camera, BackgroundRenderer$FogType) 22 | String applyFog = RemappingUtils.getMethodName("class_758", "method_3211", "(Lnet/minecraft/class_4184;Lnet/minecraft/class_758$class_4596;FZ)V"); 23 | 24 | for (MethodNode method : targetClass.methods) { 25 | if (applyFog.equals(method.name)) { 26 | LabelNode skip = new LabelNode(); 27 | 28 | InsnList extra = new InsnList(); 29 | extra.add(new JumpInsnNode(Opcodes.GOTO, skip)); 30 | extra.add(new InsnNode(Opcodes.FCONST_0)); 31 | extra.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "com/mojang/blaze3d/systems/RenderSystem", "fogDensity", "(F)V", false)); 32 | extra.add(skip); 33 | 34 | method.instructions.insertBefore(method.instructions.getLast(), extra); 35 | } 36 | } 37 | } 38 | 39 | super.preApply(targetClassName, targetClass, mixinClassName, mixinInfo); 40 | } 41 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/images/mixin/old/BuiltinModelItemRendererMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.images.mixin.old; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.At; 5 | import org.spongepowered.asm.mixin.injection.Inject; 6 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 7 | 8 | import net.minecraft.client.render.VertexConsumerProvider; 9 | import net.minecraft.client.render.item.BuiltinModelItemRenderer; 10 | import net.minecraft.client.render.model.json.ModelTransformation.Mode; 11 | import net.minecraft.client.util.math.MatrixStack; 12 | import net.minecraft.item.ItemStack; 13 | 14 | import me.modmuss50.optifabric.compat.InterceptingMixin; 15 | import me.modmuss50.optifabric.compat.Shim; 16 | 17 | @Mixin(BuiltinModelItemRenderer.class) 18 | @InterceptingMixin("net/sorenon/images/mixin/client/BuiltinModelItemRendererMixin") 19 | abstract class BuiltinModelItemRendererMixin { 20 | @Shim 21 | private native void inject_render(ItemStack stack, Mode mode, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay, CallbackInfo call); 22 | 23 | @Inject(method = "renderRaw", remap = false, 24 | at = @At(value = "INVOKE", 25 | target = "Lnet/minecraft/client/render/block/entity/BannerBlockEntityRenderer;renderCanvas(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;IILnet/minecraft/client/model/ModelPart;Lnet/minecraft/client/util/SpriteIdentifier;ZLjava/util/List;Z)V", 26 | remap = true)) 27 | private void inject_render(ItemStack stack, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay, CallbackInfo call) { 28 | inject_render(stack, /* Hopefully not used */ null, matrices, vertexConsumers, light, overlay, call); 29 | } 30 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/enhancedcelestials/mixin/LightmapTextureManagerMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.enhancedcelestials.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.At; 5 | import org.spongepowered.asm.mixin.injection.Inject; 6 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 7 | import org.spongepowered.asm.mixin.injection.callback.LocalCapture; 8 | 9 | import net.minecraft.client.render.LightmapTextureManager; 10 | import net.minecraft.client.world.ClientWorld; 11 | import net.minecraft.util.math.Vec3f; 12 | 13 | import me.modmuss50.optifabric.compat.InterceptingMixin; 14 | import me.modmuss50.optifabric.compat.PlacatingSurrogate; 15 | import me.modmuss50.optifabric.compat.Shim; 16 | 17 | @Mixin(LightmapTextureManager.class) 18 | @InterceptingMixin("corgitaco/enchancedcelestials/mixin/MixinLightMapTexture") 19 | abstract class LightmapTextureManagerMixin { 20 | @PlacatingSurrogate 21 | private void doOurLightMap(float partialTicks, CallbackInfo call, ClientWorld world, float skyLight, float lightingTint, float underwaterEffect, float extraShift) { 22 | } 23 | 24 | @Inject(method = "update", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/math/Vector3f;lerp(Lnet/minecraft/util/math/Vec3f;F)V", ordinal = 0), locals = LocalCapture.CAPTURE_FAILHARD) 25 | private void doOurLightMap(float partialTicks, CallbackInfo call, ClientWorld world, float skyLight, float lightingTint, float underwaterEffect, float extraShift, Vec3f skyVector) { 26 | doOurLightMap(partialTicks, call, world, skyLight, lightingTint, extraShift, skyVector); 27 | } 28 | 29 | @Shim 30 | private native void doOurLightMap(float partialTicks, CallbackInfo call, ClientWorld world, float skyLight, float lightingTint, float extraShift, Vec3f skyVector); 31 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/images/mixin/BuiltinModelItemRendererMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.images.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.At; 5 | import org.spongepowered.asm.mixin.injection.Inject; 6 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 7 | 8 | import net.minecraft.client.render.VertexConsumerProvider; 9 | import net.minecraft.client.render.item.BuiltinModelItemRenderer; 10 | import net.minecraft.client.render.model.json.ModelTransformation.Mode; 11 | import net.minecraft.client.util.math.MatrixStack; 12 | import net.minecraft.item.ItemStack; 13 | 14 | import me.modmuss50.optifabric.compat.InterceptingMixin; 15 | import me.modmuss50.optifabric.compat.Shim; 16 | 17 | @Mixin(BuiltinModelItemRenderer.class) 18 | @InterceptingMixin("net/sorenon/images/mixin/client/BuiltinModelItemRendererMixin") 19 | abstract class BuiltinModelItemRendererMixin { 20 | @Shim 21 | private native void inject_renderShield(ItemStack stack, Mode mode, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay, CallbackInfo call); 22 | 23 | @Inject(method = "renderRaw", remap = false, 24 | at = @At(value = "INVOKE", 25 | target = "Lnet/minecraft/client/render/block/entity/BannerBlockEntityRenderer;renderCanvas(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;IILnet/minecraft/client/model/ModelPart;Lnet/minecraft/client/util/SpriteIdentifier;ZLjava/util/List;Z)V", 26 | remap = true)) 27 | private void inject_renderShield(ItemStack stack, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay, CallbackInfo call) { 28 | inject_renderShield(stack, /* Hopefully not used */ null, matrices, vertexConsumers, light, overlay, call); 29 | } 30 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/enhancedcelestials/mixin/LightmapTextureManagerNewMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.enhancedcelestials.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.At; 5 | import org.spongepowered.asm.mixin.injection.Inject; 6 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 7 | import org.spongepowered.asm.mixin.injection.callback.LocalCapture; 8 | 9 | import net.minecraft.client.render.LightmapTextureManager; 10 | import net.minecraft.client.world.ClientWorld; 11 | import net.minecraft.util.math.Vec3f; 12 | 13 | import me.modmuss50.optifabric.compat.InterceptingMixin; 14 | import me.modmuss50.optifabric.compat.PlacatingSurrogate; 15 | import me.modmuss50.optifabric.compat.Shim; 16 | 17 | @Mixin(LightmapTextureManager.class) 18 | @InterceptingMixin("corgitaco/enhancedcelestials/mixin/client/MixinLightMapTexture") 19 | abstract class LightmapTextureManagerNewMixin { 20 | @PlacatingSurrogate 21 | private void doOurLightMap(float partialTicks, CallbackInfo call, ClientWorld world, float skyLight, float lightingTint, float underwaterEffect, float extraShift) { 22 | } 23 | 24 | @Inject(method = "update", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/math/Vector3f;lerp(Lnet/minecraft/util/math/Vec3f;F)V", ordinal = 0), locals = LocalCapture.CAPTURE_FAILHARD) 25 | private void doOurLightMap(float partialTicks, CallbackInfo call, ClientWorld world, float skyLight, float lightingTint, float underwaterEffect, float extraShift, Vec3f skyVector) { 26 | doOurLightMap(partialTicks, call, world, skyLight, lightingTint, extraShift, skyVector); 27 | } 28 | 29 | @Shim 30 | private native void doOurLightMap(float partialTicks, CallbackInfo call, ClientWorld world, float skyLight, float lightingTint, float extraShift, Vec3f skyVector); 31 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/bannerpp/mixin/BuiltinModelItemRendererMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.bannerpp.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.At; 5 | import org.spongepowered.asm.mixin.injection.Inject; 6 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 7 | 8 | import net.minecraft.client.render.VertexConsumerProvider; 9 | import net.minecraft.client.render.item.BuiltinModelItemRenderer; 10 | import net.minecraft.client.render.model.json.ModelTransformation.Mode; 11 | import net.minecraft.client.util.math.MatrixStack; 12 | import net.minecraft.item.ItemStack; 13 | 14 | import me.modmuss50.optifabric.compat.InterceptingMixin; 15 | import me.modmuss50.optifabric.compat.Shim; 16 | 17 | @Mixin(BuiltinModelItemRenderer.class) 18 | @InterceptingMixin("io/github/fablabsmc/fablabs/mixin/bannerpattern/client/BuiltinModelItemRendererMixin") 19 | abstract class BuiltinModelItemRendererMixin { 20 | @Inject(method = "renderRaw", remap = false, 21 | at = @At(value = "INVOKE", remap = true, 22 | target = "Lnet/minecraft/client/render/block/entity/BannerBlockEntityRenderer;renderCanvas(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;IILnet/minecraft/client/model/ModelPart;Lnet/minecraft/client/util/SpriteIdentifier;ZLjava/util/List;Z)V")) 23 | private void setBppLoomPatterns(ItemStack stack, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay, CallbackInfo call) { 24 | setBppLoomPatterns(stack, /* Hopefully not used */ null, matrices, vertexConsumers, light, overlay, call); 25 | } 26 | 27 | @Shim 28 | private native void setBppLoomPatterns(ItemStack stack, Mode mode, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay, CallbackInfo call); 29 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/cloth/mixin/GameRendererNewMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.cloth.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.At; 5 | import org.spongepowered.asm.mixin.injection.At.Shift; 6 | import org.spongepowered.asm.mixin.injection.Inject; 7 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 8 | import org.spongepowered.asm.mixin.injection.callback.LocalCapture; 9 | 10 | import net.minecraft.client.render.GameRenderer; 11 | import net.minecraft.client.util.Window; 12 | import net.minecraft.client.util.math.MatrixStack; 13 | import net.minecraft.util.math.Matrix4f; 14 | 15 | import me.modmuss50.optifabric.compat.InterceptingMixin; 16 | import me.modmuss50.optifabric.compat.PlacatingSurrogate; 17 | import me.modmuss50.optifabric.compat.Shim; 18 | 19 | @Mixin(GameRenderer.class) 20 | @InterceptingMixin("me/shedaniel/cloth/mixin/client/events/MixinGameRenderer") 21 | abstract class GameRendererNewMixin { 22 | @Inject(method = "render(FJZ)V", locals = LocalCapture.CAPTURE_FAILEXCEPTION, 23 | at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/Screen;render(Lnet/minecraft/client/util/math/MatrixStack;IIF)V", shift = Shift.AFTER, ordinal = 0)) 24 | private void optifabric_renderScreen(float tickDelta, long startTime, boolean tick, CallbackInfo ci, int mouseX, int mouseY, Window window, Matrix4f projection, MatrixStack modelView, MatrixStack matrices) { 25 | renderScreen(tickDelta, startTime, tick, ci, mouseX, mouseY, matrices); 26 | } 27 | 28 | @Shim 29 | public abstract void renderScreen(float tickDelta, long startTime, boolean tick, CallbackInfo ci, int mouseX, int mouseY, MatrixStack matrices); 30 | 31 | @PlacatingSurrogate 32 | private void renderScreen(float tickDelta, long startTime, boolean tick, CallbackInfo ci, int mouseX, int mouseY, Window window) { 33 | } 34 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/fabriclifecycleevents/mixin/ClientChunkManagerNewMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.fabriclifecycleevents.mixin; 2 | 3 | import java.util.function.Consumer; 4 | 5 | import org.spongepowered.asm.mixin.Mixin; 6 | import org.spongepowered.asm.mixin.injection.At; 7 | import org.spongepowered.asm.mixin.injection.At.Shift; 8 | import org.spongepowered.asm.mixin.injection.Inject; 9 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 10 | import org.spongepowered.asm.mixin.injection.callback.LocalCapture; 11 | 12 | import net.minecraft.client.world.ClientChunkManager; 13 | import net.minecraft.nbt.NbtCompound; 14 | import net.minecraft.network.PacketByteBuf; 15 | import net.minecraft.util.math.ChunkPos; 16 | import net.minecraft.world.chunk.WorldChunk; 17 | 18 | import me.modmuss50.optifabric.compat.InterceptingMixin; 19 | import me.modmuss50.optifabric.compat.Shim; 20 | 21 | @Mixin(ClientChunkManager.class) 22 | @InterceptingMixin("net/fabricmc/fabric/mixin/event/lifecycle/client/ClientChunkManagerMixin") 23 | abstract class ClientChunkManagerNewMixin { 24 | @Inject(method = {"loadChunkFromPacket", "method_16020(IILnet/minecraft/class_2540;Lnet/minecraft/class_2487;Ljava/util/function/Consumer;)Lnet/minecraft/class_2818;"}, 25 | at = @At(value = "NEW", target = "net/optifine/ChunkOF", remap = false, shift = Shift.BEFORE), locals = LocalCapture.CAPTURE_FAILHARD) 26 | private void onOFChunkUnload(int x, int z, PacketByteBuf buf, NbtCompound tag, Consumer beVisitor, CallbackInfoReturnable call, int index, WorldChunk chunk, ChunkPos pos) { 27 | onChunkUnload(x, z, buf, tag, beVisitor, call, index, chunk, pos); 28 | } 29 | 30 | @Shim 31 | private native void onChunkUnload(int x, int z, PacketByteBuf buf, NbtCompound tag, Consumer beVisitor, CallbackInfoReturnable call, int index, WorldChunk chunk, ChunkPos pos); 32 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/fabricblockview/mixin/ChunkRendererRegionBuilderMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.fabricblockview.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.At; 5 | import org.spongepowered.asm.mixin.injection.Inject; 6 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 7 | import org.spongepowered.asm.mixin.injection.callback.LocalCapture; 8 | 9 | import net.minecraft.class_6850; 10 | import net.minecraft.class_6850.class_6851; 11 | import net.minecraft.client.render.chunk.ChunkRendererRegion; 12 | import net.minecraft.util.math.BlockPos; 13 | import net.minecraft.world.World; 14 | 15 | import me.modmuss50.optifabric.compat.InterceptingMixin; 16 | import me.modmuss50.optifabric.compat.PlacatingSurrogate; 17 | import me.modmuss50.optifabric.compat.Shim; 18 | 19 | @Mixin(class_6850.class) 20 | @InterceptingMixin("net/fabricmc/fabric/mixin/blockview/client/ChunkRendererRegionBuilderMixin") 21 | abstract class ChunkRendererRegionBuilderMixin { 22 | @PlacatingSurrogate 23 | private void createDataMap(World world, BlockPos startPos, BlockPos endPos, int chunkRadius, CallbackInfoReturnable call) { 24 | } 25 | 26 | @Inject(at = @At("RETURN"), method = "createRegion", remap = false, locals = LocalCapture.CAPTURE_FAILHARD) 27 | private void createOF(World world, BlockPos startPos, BlockPos endPos, int offset, boolean checkEmpty, CallbackInfoReturnable call, int startX, int startZ, int endX, int endZ, class_6851[][] chunks) { 28 | createDataMap(world, startPos, endPos, offset, call, startX, endX, startZ, endZ, chunks); 29 | } 30 | 31 | @Shim 32 | private native void createDataMap(World world, BlockPos startPos, BlockPos endPos, int offset, CallbackInfoReturnable call, int startX, int startZ, int endX, int endZ, class_6851[][] chunks); 33 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/cloth/mixin/GameRendererNewerMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.cloth.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.At; 5 | import org.spongepowered.asm.mixin.injection.At.Shift; 6 | import org.spongepowered.asm.mixin.injection.Inject; 7 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 8 | import org.spongepowered.asm.mixin.injection.callback.LocalCapture; 9 | 10 | import net.minecraft.client.render.GameRenderer; 11 | import net.minecraft.client.util.Window; 12 | import net.minecraft.client.util.math.MatrixStack; 13 | import net.minecraft.util.math.Matrix4f; 14 | 15 | import me.modmuss50.optifabric.compat.InterceptingMixin; 16 | import me.modmuss50.optifabric.compat.PlacatingSurrogate; 17 | import me.modmuss50.optifabric.compat.Shim; 18 | 19 | @Mixin(GameRenderer.class) 20 | @InterceptingMixin("me/shedaniel/cloth/mixin/client/events/MixinGameRenderer") 21 | abstract class GameRendererNewerMixin { 22 | @Inject(method = "render(FJZ)V", locals = LocalCapture.CAPTURE_FAILEXCEPTION, 23 | at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/Screen;render(Lnet/minecraft/client/util/math/MatrixStack;IIF)V", shift = Shift.AFTER, ordinal = 0)) 24 | private void optifabric_renderScreen(float tickDelta, long startTime, boolean tick, CallbackInfo call, int mouseX, int mouseY, Window window, float guiFarPlane, Matrix4f projection, MatrixStack modelView, MatrixStack matrices) { 25 | renderScreen(tickDelta, startTime, tick, call, mouseX, mouseY, matrices); 26 | } 27 | 28 | @Shim 29 | public abstract void renderScreen(float tickDelta, long startTime, boolean tick, CallbackInfo call, int mouseX, int mouseY, MatrixStack matrices); 30 | 31 | @PlacatingSurrogate 32 | private void renderScreen(float tickDelta, long startTime, boolean tick, CallbackInfo call, int mouseX, int mouseY, Window window) { 33 | } 34 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/fabricrenderingdata/mixin/ChunkRendererRegionMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.fabricrenderingdata.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.At; 5 | import org.spongepowered.asm.mixin.injection.Inject; 6 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 7 | import org.spongepowered.asm.mixin.injection.callback.LocalCapture; 8 | 9 | import net.minecraft.client.render.chunk.ChunkRendererRegion; 10 | import net.minecraft.util.math.BlockPos; 11 | import net.minecraft.world.World; 12 | import net.minecraft.world.chunk.WorldChunk; 13 | 14 | import me.modmuss50.optifabric.compat.InterceptingMixin; 15 | import me.modmuss50.optifabric.compat.PlacatingSurrogate; 16 | import me.modmuss50.optifabric.compat.Shim; 17 | 18 | @Mixin(ChunkRendererRegion.class) 19 | @InterceptingMixin({"net/fabricmc/fabric/mixin/rendering/data/attachment/client/MixinChunkRendererRegion", "net/fabricmc/fabric/mixin/rendering/data/attachment/client/ChunkRendererRegionMixin"}) 20 | abstract class ChunkRendererRegionMixin { 21 | @PlacatingSurrogate 22 | private static void init(World world, BlockPos startPos, BlockPos endPos, int chunkRadius, CallbackInfoReturnable call) { 23 | } 24 | 25 | @Inject(at = @At("RETURN"), method = "generateCache", remap = false, locals = LocalCapture.CAPTURE_FAILHARD) 26 | private static void initOF(World world, BlockPos startPos, BlockPos endPos, int chunkRadius, boolean checkEmpty, CallbackInfoReturnable call, int i, int j, int k, int l, WorldChunk[][] chunks) { 27 | init(world, startPos, endPos, chunkRadius, call, i, k, j, l, chunks); 28 | } 29 | 30 | @Shim 31 | private native static void init(World world, BlockPos startPos, BlockPos endPos, int chunkRadius, CallbackInfoReturnable call, int i, int j, int k, int l, WorldChunk[][] chunks); 32 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/carpet/mixin/WorldRendererExtraMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.carpet.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.At; 5 | import org.spongepowered.asm.mixin.injection.Group; 6 | import org.spongepowered.asm.mixin.injection.ModifyVariable; 7 | 8 | import net.minecraft.client.render.WorldRenderer; 9 | 10 | import me.modmuss50.optifabric.compat.InterceptingMixin; 11 | import me.modmuss50.optifabric.compat.Shim; 12 | 13 | @Mixin(WorldRenderer.class) 14 | @InterceptingMixin("carpet/mixins/WorldRenderer_pausedShakeMixin") 15 | abstract class WorldRendererExtraMixin { 16 | @Group(min = 2, max = 3) 17 | @ModifyVariable(method = "render", argsOnly = true, ordinal = 0, 18 | at = @At(value = "INVOKE", 19 | target = "Lnet/minecraft/client/particle/ParticleManager;renderParticles(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider$Immediate;Lnet/minecraft/client/render/LightmapTextureManager;Lnet/minecraft/client/render/Camera;FLnet/minecraft/client/render/Frustum;)V", 20 | shift = At.Shift.BEFORE)) 21 | private float doChangeTickPhaseBack(float previous) { 22 | return changeTickPhaseBack(previous); 23 | } 24 | 25 | @Group(min = 2, max = 3) 26 | @ModifyVariable(method = "render", argsOnly = true, ordinal = 0, 27 | at = @At(value = "INVOKE", 28 | target = "Lnet/minecraft/client/particle/ParticleManager;render(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider$Immediate;Lnet/minecraft/client/render/LightmapTextureManager;Lnet/minecraft/client/render/Camera;FLnet/minecraft/client/render/Frustum;)V", 29 | shift = At.Shift.BEFORE)) 30 | private float doNewChangeTickPhaseBack(float previous) { 31 | return changeTickPhaseBack(previous); 32 | } 33 | 34 | @Shim 35 | private native float changeTickPhaseBack(float previous); 36 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/cloth/mixin/DummyMixinGameRenderer.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.cloth.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.At; 5 | import org.spongepowered.asm.mixin.injection.Inject; 6 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 7 | import org.spongepowered.asm.mixin.injection.callback.LocalCapture; 8 | 9 | import net.minecraft.client.render.GameRenderer; 10 | import net.minecraft.client.util.Window; 11 | import net.minecraft.client.util.math.MatrixStack; 12 | 13 | import me.modmuss50.optifabric.compat.InterceptingMixin; 14 | import me.modmuss50.optifabric.compat.PlacatingSurrogate; 15 | import me.modmuss50.optifabric.compat.Shim; 16 | 17 | @Mixin(GameRenderer.class) 18 | @InterceptingMixin("me/shedaniel/cloth/mixin/client/events/MixinGameRenderer") 19 | public class DummyMixinGameRenderer { 20 | // Taken from https://github.com/shedaniel/cloth-api/blob/3913836e59e1df9058ece3e791ee0f5993b8bc00/cloth-client-events-v0/src/main/java/me/shedaniel/cloth/mixin/client/events/MixinGameRenderer.java#L49 21 | @Inject(method = "render(FJZ)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/Screen;render(Lnet/minecraft/client/util/math/MatrixStack;IIF)V", shift = At.Shift.AFTER, ordinal = 0), locals = LocalCapture.CAPTURE_FAILEXCEPTION) 22 | public void optifabric_renderScreen(float tickDelta, long startTime, boolean tick, CallbackInfo ci, int mouseX, int mouseY, Window window, MatrixStack matrices) { 23 | renderScreen(tickDelta, startTime, tick, ci, mouseX, mouseY, matrices); 24 | } 25 | 26 | @Shim 27 | public native void renderScreen(float tickDelta, long startTime, boolean tick, CallbackInfo ci, int mouseX, int mouseY, MatrixStack matrices); 28 | 29 | @PlacatingSurrogate 30 | private void renderScreen(float tickDelta, long startTime, boolean tick, CallbackInfo ci, int mouseX, int mouseY, Window window) { 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/frex/BridgedChunkRendererRegion.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.frex; 2 | 3 | import net.minecraft.block.BlockState; 4 | import net.minecraft.block.entity.BlockEntity; 5 | import net.minecraft.client.render.chunk.ChunkRendererRegion; 6 | import net.minecraft.fluid.FluidState; 7 | import net.minecraft.util.math.BlockPos; 8 | import net.minecraft.util.math.Direction; 9 | import net.minecraft.world.chunk.WorldChunk; 10 | import net.minecraft.world.chunk.WorldChunk.CreationType; 11 | import net.minecraft.world.chunk.light.LightingProvider; 12 | import net.minecraft.world.level.ColorResolver; 13 | 14 | import me.modmuss50.optifabric.compat.frex.mixin.ChunkCacheOF; 15 | 16 | public class BridgedChunkRendererRegion extends ChunkRendererRegion { 17 | private final ChunkCacheOF wrapped; 18 | 19 | public BridgedChunkRendererRegion(ChunkCacheOF wrapped) { 20 | super(null, 0, 0, new WorldChunk[0][0], BlockPos.ORIGIN, BlockPos.ORIGIN); 21 | 22 | this.wrapped = wrapped; 23 | } 24 | 25 | @Override 26 | public BlockState getBlockState(BlockPos pos) { 27 | return wrapped.getBlockState(pos); 28 | } 29 | 30 | @Override 31 | public FluidState getFluidState(BlockPos pos) { 32 | return wrapped.getFluidState(pos); 33 | } 34 | 35 | @Override 36 | public float getBrightness(Direction direction, boolean shaded) { 37 | return wrapped.getBrightness(direction, shaded); 38 | } 39 | 40 | @Override 41 | public LightingProvider getLightingProvider() { 42 | return wrapped.getLightingProvider(); 43 | } 44 | 45 | @Override 46 | public BlockEntity getBlockEntity(BlockPos pos) { 47 | return wrapped.getBlockEntity(pos); 48 | } 49 | 50 | @Override 51 | public BlockEntity getBlockEntity(BlockPos pos, CreationType creation) { 52 | return wrapped.getBlockEntity(pos, creation); 53 | } 54 | 55 | @Override 56 | public int getColor(BlockPos pos, ColorResolver colorResolver) { 57 | return wrapped.getColor(pos, colorResolver); 58 | } 59 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/fabricrenderingdata/mixin/ChunkRendererRegionBuilderMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.fabricrenderingdata.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.At; 5 | import org.spongepowered.asm.mixin.injection.Inject; 6 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 7 | import org.spongepowered.asm.mixin.injection.callback.LocalCapture; 8 | 9 | import net.minecraft.class_6850; 10 | import net.minecraft.class_6850.class_6851; 11 | import net.minecraft.client.render.chunk.ChunkRendererRegion; 12 | import net.minecraft.util.math.BlockPos; 13 | import net.minecraft.world.World; 14 | 15 | import me.modmuss50.optifabric.compat.InterceptingMixin; 16 | import me.modmuss50.optifabric.compat.PlacatingSurrogate; 17 | import me.modmuss50.optifabric.compat.Shim; 18 | 19 | @Mixin(class_6850.class) 20 | @InterceptingMixin({"net/fabricmc/fabric/mixin/rendering/data/attachment/client/MixinChunkRendererRegionBuilder", "net/fabricmc/fabric/mixin/rendering/data/attachment/client/ChunkRendererRegionBuilderMixin"}) 21 | abstract class ChunkRendererRegionBuilderMixin { 22 | @PlacatingSurrogate 23 | private void create(World world, BlockPos startPos, BlockPos endPos, int chunkRadius, CallbackInfoReturnable call) { 24 | } 25 | 26 | @Inject(at = @At("RETURN"), method = "createRegion", remap = false, locals = LocalCapture.CAPTURE_FAILHARD) 27 | private void createOF(World world, BlockPos startPos, BlockPos endPos, int chunkRadius, boolean checkEmpty, CallbackInfoReturnable call, int i, int j, int k, int l, class_6851[][] chunks) { 28 | create(world, startPos, endPos, chunkRadius, call, i, k, j, l, chunks); 29 | } 30 | 31 | @Shim 32 | private native void create(World world, BlockPos startPos, BlockPos endPos, int chunkRadius, CallbackInfoReturnable call, int i, int j, int k, int l, class_6851[][] chunks); 33 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/mod/ContextualMappingContext.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.mod; 2 | 3 | import java.util.Objects; 4 | 5 | import net.fabricmc.tinyremapper.IMappingProvider; 6 | 7 | public interface ContextualMappingContext { 8 | final class Member { 9 | public final String owner, name, desc; 10 | 11 | public Member(String owner, String name) { 12 | this.owner = Objects.requireNonNull(owner); 13 | this.name = Objects.requireNonNull(name); 14 | this.desc = null; 15 | } 16 | 17 | public Member(IMappingProvider.Member member) { 18 | this(member.owner, member.name, member.desc); 19 | } 20 | 21 | public Member(String owner, String name, String desc) { 22 | this.owner = Objects.requireNonNull(owner); 23 | this.name = Objects.requireNonNull(name); 24 | this.desc = Objects.requireNonNull(desc); 25 | } 26 | 27 | public boolean isNaive() { 28 | return desc == null; 29 | } 30 | 31 | public IMappingProvider.Member toTR() { 32 | return new IMappingProvider.Member(owner, name, desc); 33 | } 34 | 35 | @Override 36 | public int hashCode() { 37 | final int prime = 31; 38 | int result = 1; 39 | result = prime * result + owner.hashCode(); 40 | result = prime * result + name.hashCode(); 41 | result = prime * result + Objects.hashCode(desc); 42 | return result; 43 | } 44 | 45 | @Override 46 | public boolean equals(Object obj) { 47 | if (this == obj) return true; 48 | if (obj == null || getClass() != obj.getClass()) return false; 49 | Member that = (Member) obj; 50 | if (!owner.equals(that.owner)) return false; 51 | if (!name.equals(that.name)) return false; 52 | return isNaive() ? that.isNaive() : desc.equals(that.desc); 53 | } 54 | } 55 | 56 | String unmapClass(String name); 57 | 58 | String mapClass(String name); 59 | 60 | Member unmapMethod(Member method); 61 | 62 | String mapMethod(Member method); 63 | 64 | Member unmapField(Member field); 65 | 66 | String mapField(Member field); 67 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/charm/mixin/SpriteAtlasTextureNewMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.charm.mixin; 2 | 3 | import java.util.Set; 4 | import java.util.stream.Stream; 5 | 6 | import org.spongepowered.asm.mixin.Mixin; 7 | import org.spongepowered.asm.mixin.injection.At; 8 | import org.spongepowered.asm.mixin.injection.Inject; 9 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 10 | import org.spongepowered.asm.mixin.injection.callback.LocalCapture; 11 | 12 | import net.minecraft.client.texture.SpriteAtlasTexture; 13 | import net.minecraft.client.texture.SpriteAtlasTexture.Data; 14 | import net.minecraft.resource.ResourceManager; 15 | import net.minecraft.util.Identifier; 16 | import net.minecraft.util.profiler.Profiler; 17 | 18 | import me.modmuss50.optifabric.compat.InterceptingMixin; 19 | import me.modmuss50.optifabric.compat.PlacatingSurrogate; 20 | import me.modmuss50.optifabric.compat.Shim; 21 | 22 | @Mixin(SpriteAtlasTexture.class) 23 | @InterceptingMixin("svenhjol/charm/mixin/event/StitchTextureMixin") 24 | class SpriteAtlasTextureNewMixin { 25 | @PlacatingSurrogate 26 | private void hookStitch(ResourceManager resourceManager, Stream idStream, Profiler profiler, int mipmapLevel, CallbackInfoReturnable call, int mipmapLevels) { 27 | } 28 | 29 | @Inject(method = "stitch", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/profiler/Profiler;swap(Ljava/lang/String;)V", ordinal = 0), locals = LocalCapture.CAPTURE_FAILHARD) 30 | private void hookStitch(ResourceManager resourceManager, Stream idStream, Profiler profiler, int mipmapLevel, CallbackInfoReturnable call, int mipmapLevels, Set set) { 31 | hookStitch(resourceManager, idStream, profiler, mipmapLevels, call, set); 32 | } 33 | 34 | @Shim 35 | private native void hookStitch(ResourceManager resourceManager, Stream idStream, Profiler profiler, int mipmapLevel, CallbackInfoReturnable call, Set set); 36 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/charm/mixin/old/SpriteAtlasTextureMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.charm.mixin.old; 2 | 3 | import java.util.Set; 4 | import java.util.stream.Stream; 5 | 6 | import org.spongepowered.asm.mixin.Mixin; 7 | import org.spongepowered.asm.mixin.injection.At; 8 | import org.spongepowered.asm.mixin.injection.Inject; 9 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 10 | import org.spongepowered.asm.mixin.injection.callback.LocalCapture; 11 | 12 | import net.minecraft.client.texture.SpriteAtlasTexture; 13 | import net.minecraft.client.texture.SpriteAtlasTexture.Data; 14 | import net.minecraft.resource.ResourceManager; 15 | import net.minecraft.util.Identifier; 16 | import net.minecraft.util.profiler.Profiler; 17 | 18 | import me.modmuss50.optifabric.compat.InterceptingMixin; 19 | import me.modmuss50.optifabric.compat.PlacatingSurrogate; 20 | import me.modmuss50.optifabric.compat.Shim; 21 | 22 | @Mixin(SpriteAtlasTexture.class) 23 | @InterceptingMixin("svenhjol/charm/mixin/SpriteAtlasTextureMixin") 24 | class SpriteAtlasTextureMixin { 25 | @PlacatingSurrogate 26 | private void hookStitch(ResourceManager resourceManager, Stream idStream, Profiler profiler, int mipmapLevel, CallbackInfoReturnable call, int mipmapLevels) { 27 | } 28 | 29 | @Inject(method = "stitch", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/profiler/Profiler;swap(Ljava/lang/String;)V", ordinal = 0), locals = LocalCapture.CAPTURE_FAILHARD) 30 | private void hookStitch(ResourceManager resourceManager, Stream idStream, Profiler profiler, int mipmapLevel, CallbackInfoReturnable call, int mipmapLevels, Set set) { 31 | hookStitch(resourceManager, idStream, profiler, mipmapLevels, call, set); 32 | } 33 | 34 | @Shim 35 | private native void hookStitch(ResourceManager resourceManager, Stream idStream, Profiler profiler, int mipmapLevel, CallbackInfoReturnable call, Set set); 36 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/indigo/mixin/ChunkCacheOFMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.indigo.mixin; 2 | 3 | import java.util.function.Supplier; 4 | 5 | import org.spongepowered.asm.mixin.Final; 6 | import org.spongepowered.asm.mixin.Mixin; 7 | import org.spongepowered.asm.mixin.Pseudo; 8 | import org.spongepowered.asm.mixin.Shadow; 9 | import org.spongepowered.asm.mixin.Unique; 10 | import org.spongepowered.asm.mixin.injection.At; 11 | import org.spongepowered.asm.mixin.injection.Inject; 12 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 13 | 14 | import com.google.common.base.Suppliers; 15 | 16 | import net.minecraft.client.render.chunk.BlockBufferBuilderStorage; 17 | import net.minecraft.client.render.chunk.ChunkBuilder.BuiltChunk; 18 | import net.minecraft.client.render.chunk.ChunkBuilder.ChunkData; 19 | import net.minecraft.client.render.chunk.ChunkRendererRegion; 20 | 21 | import net.fabricmc.fabric.impl.client.indigo.renderer.render.TerrainRenderContext; 22 | 23 | import me.modmuss50.optifabric.compat.indigo.ChunkRendererRegionAccess; 24 | 25 | @Pseudo 26 | @Mixin(targets = "net/optifine/override/ChunkCacheOF", remap = false) 27 | abstract class ChunkCacheOFMixin implements ChunkRendererRegionAccess { 28 | @Shadow 29 | private @Final ChunkRendererRegion chunkCache; 30 | @Unique 31 | private Supplier optifabric_renderContextFactory; 32 | 33 | @Override 34 | public void optifabric_setRenderer(TerrainRenderContext renderContext, BuiltChunk chunk, ChunkData data, BlockBufferBuilderStorage buffer) { 35 | optifabric_renderContextFactory = Suppliers.memoize(() -> renderContext.prepare(chunkCache, chunk, data, buffer)); 36 | } 37 | 38 | @Override 39 | public TerrainRenderContext fabric_getRenderer() { 40 | return optifabric_renderContextFactory.get(); 41 | } 42 | 43 | @Inject(method = "renderFinish()V", at = @At("RETURN")) 44 | private void cleanup(CallbackInfo call) { 45 | optifabric_renderContextFactory = null; 46 | } 47 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/charm/mixin/SpriteAtlasTextureMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.charm.mixin; 2 | 3 | import java.util.Set; 4 | import java.util.stream.Stream; 5 | 6 | import org.spongepowered.asm.mixin.Mixin; 7 | import org.spongepowered.asm.mixin.injection.At; 8 | import org.spongepowered.asm.mixin.injection.Inject; 9 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 10 | import org.spongepowered.asm.mixin.injection.callback.LocalCapture; 11 | 12 | import net.minecraft.client.texture.SpriteAtlasTexture; 13 | import net.minecraft.client.texture.SpriteAtlasTexture.Data; 14 | import net.minecraft.resource.ResourceManager; 15 | import net.minecraft.util.Identifier; 16 | import net.minecraft.util.profiler.Profiler; 17 | 18 | import me.modmuss50.optifabric.compat.InterceptingMixin; 19 | import me.modmuss50.optifabric.compat.PlacatingSurrogate; 20 | import me.modmuss50.optifabric.compat.Shim; 21 | 22 | @Mixin(SpriteAtlasTexture.class) 23 | @InterceptingMixin("svenhjol/charm/mixin/callback/StitchTextureCallbackMixin") 24 | class SpriteAtlasTextureMixin { 25 | @PlacatingSurrogate 26 | private void hookStitch(ResourceManager resourceManager, Stream idStream, Profiler profiler, int mipmapLevel, CallbackInfoReturnable call, int mipmapLevels) { 27 | } 28 | 29 | @Inject(method = "stitch", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/profiler/Profiler;swap(Ljava/lang/String;)V", ordinal = 0), locals = LocalCapture.CAPTURE_FAILHARD) 30 | private void hookStitch(ResourceManager resourceManager, Stream idStream, Profiler profiler, int mipmapLevel, CallbackInfoReturnable call, int mipmapLevels, Set set) { 31 | hookStitch(resourceManager, idStream, profiler, mipmapLevels, call, set); 32 | } 33 | 34 | @Shim 35 | private native void hookStitch(ResourceManager resourceManager, Stream idStream, Profiler profiler, int mipmapLevel, CallbackInfoReturnable call, Set set); 36 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/charm/mixin/older/SpriteAtlasTextureMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.charm.mixin.older; 2 | 3 | import java.util.Set; 4 | import java.util.stream.Stream; 5 | 6 | import org.spongepowered.asm.mixin.Mixin; 7 | import org.spongepowered.asm.mixin.injection.At; 8 | import org.spongepowered.asm.mixin.injection.Inject; 9 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 10 | import org.spongepowered.asm.mixin.injection.callback.LocalCapture; 11 | 12 | import net.minecraft.client.texture.SpriteAtlasTexture; 13 | import net.minecraft.client.texture.SpriteAtlasTexture.Data; 14 | import net.minecraft.resource.ResourceManager; 15 | import net.minecraft.util.Identifier; 16 | import net.minecraft.util.profiler.Profiler; 17 | 18 | import me.modmuss50.optifabric.compat.InterceptingMixin; 19 | import me.modmuss50.optifabric.compat.PlacatingSurrogate; 20 | import me.modmuss50.optifabric.compat.Shim; 21 | 22 | @Mixin(SpriteAtlasTexture.class) 23 | @InterceptingMixin("svenhjol/meson/mixin/SpriteAtlasTextureMixin") 24 | class SpriteAtlasTextureMixin { 25 | @PlacatingSurrogate 26 | private void hookStitch(ResourceManager resourceManager, Stream idStream, Profiler profiler, int mipmapLevel, CallbackInfoReturnable call, int mipmapLevels) { 27 | } 28 | 29 | @Inject(method = "stitch", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/profiler/Profiler;swap(Ljava/lang/String;)V", ordinal = 0), locals = LocalCapture.CAPTURE_FAILHARD) 30 | private void hookStitch(ResourceManager resourceManager, Stream idStream, Profiler profiler, int mipmapLevel, CallbackInfoReturnable call, int mipmapLevels, Set set) { 31 | hookStitch(resourceManager, idStream, profiler, mipmapLevels, call, set); 32 | } 33 | 34 | @Shim 35 | private native void hookStitch(ResourceManager resourceManager, Stream idStream, Profiler profiler, int mipmapLevel, CallbackInfoReturnable call, Set set); 36 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/mod/TextSetup.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.mod; 2 | 3 | import org.objectweb.asm.Opcodes; 4 | import org.objectweb.asm.tree.AbstractInsnNode; 5 | import org.objectweb.asm.tree.InsnList; 6 | import org.objectweb.asm.tree.InsnNode; 7 | import org.objectweb.asm.tree.MethodInsnNode; 8 | import org.objectweb.asm.tree.MethodNode; 9 | import org.objectweb.asm.tree.VarInsnNode; 10 | 11 | import net.fabricmc.tinyremapper.IMappingProvider.Member; 12 | 13 | import me.modmuss50.optifabric.util.RemappingUtils; 14 | 15 | import com.chocohead.mm.api.ClassTinkerers; 16 | 17 | public class TextSetup implements Runnable { 18 | @Override 19 | public void run() { 20 | if (OptifabricSetup.isPresent("minecraft", ">=1.19")) { 21 | ClassTinkerers.addTransformation("me/modmuss50/optifabric/mod/Text", node -> { 22 | String mutableText = RemappingUtils.getClassName("class_5250"); 23 | 24 | for (MethodNode method : node.methods) { 25 | if ("literal".equals(method.name) && method.desc.startsWith("(Ljava/lang/String;)")) { 26 | InsnList instructions = new InsnList(); 27 | 28 | instructions.add(new VarInsnNode(Opcodes.ALOAD, 0)); 29 | Member literal = RemappingUtils.mapMethod("class_2561", "method_43470", "(Ljava/lang/String;)Lnet/minecraft/class_5250;"); 30 | instructions.add(new MethodInsnNode(Opcodes.INVOKESTATIC, literal.owner, literal.name, literal.desc, true)); 31 | instructions.add(new InsnNode(Opcodes.ARETURN)); 32 | 33 | method.instructions = instructions; 34 | } else { 35 | for (AbstractInsnNode insn : method.instructions) { 36 | if (insn.getType() == AbstractInsnNode.METHOD_INSN) { 37 | MethodInsnNode minsn = ((MethodInsnNode) insn); 38 | 39 | if (mutableText.equals(minsn.owner)) { 40 | if (minsn.getOpcode() != Opcodes.INVOKESTATIC) minsn.setOpcode(Opcodes.INVOKEVIRTUAL); 41 | minsn.itf = false; 42 | } 43 | } 44 | } 45 | } 46 | } 47 | }); 48 | } 49 | } 50 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/charm/CharmMixinPlugin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.charm; 2 | 3 | import org.objectweb.asm.Opcodes; 4 | import org.objectweb.asm.tree.ClassNode; 5 | import org.objectweb.asm.tree.InsnList; 6 | import org.objectweb.asm.tree.InsnNode; 7 | import org.objectweb.asm.tree.JumpInsnNode; 8 | import org.objectweb.asm.tree.LabelNode; 9 | import org.objectweb.asm.tree.MethodInsnNode; 10 | import org.objectweb.asm.tree.MethodNode; 11 | 12 | import org.spongepowered.asm.mixin.extensibility.IMixinInfo; 13 | 14 | import me.modmuss50.optifabric.compat.InterceptingMixinPlugin; 15 | import me.modmuss50.optifabric.util.RemappingUtils; 16 | 17 | public class CharmMixinPlugin extends InterceptingMixinPlugin { 18 | @Override 19 | public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { 20 | if ("UtilMixin".equals(mixinInfo.getName())) { 21 | String desc = "(Lcom/mojang/datafixers/DSL$TypeReference;Ljava/lang/String;)Lcom/mojang/datafixers/types/Type;"; 22 | String getChoiceTypeInternal = RemappingUtils.getMethodName("class_156", "method_29191", desc); //Util, getChoiceTypeInternal 23 | 24 | for (MethodNode method : targetClass.methods) { 25 | if (getChoiceTypeInternal.equals(method.name) && desc.equals(method.desc)) { 26 | LabelNode skip = new LabelNode(); 27 | 28 | InsnList extra = new InsnList(); 29 | extra.add(new JumpInsnNode(Opcodes.GOTO, skip)); 30 | extra.add(new InsnNode(Opcodes.ACONST_NULL)); 31 | extra.add(new InsnNode(Opcodes.ACONST_NULL)); 32 | extra.add(new InsnNode(Opcodes.ACONST_NULL)); 33 | extra.add(new MethodInsnNode(Opcodes.INVOKEINTERFACE, "org/apache/logging/log4j/Logger", "error", "(Ljava/lang/String;Ljava/lang/Object;)V", true)); 34 | extra.add(skip); 35 | 36 | method.instructions.insertBefore(method.instructions.getLast(), extra); 37 | break; 38 | } 39 | } 40 | } 41 | 42 | super.preApply(targetClassName, targetClass, mixinClassName, mixinInfo); 43 | } 44 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/fabriclifecycleevents/mixin/ClientChunkManagerMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.fabriclifecycleevents.mixin; 2 | 3 | import java.util.BitSet; 4 | 5 | import org.spongepowered.asm.mixin.Mixin; 6 | import org.spongepowered.asm.mixin.injection.At; 7 | import org.spongepowered.asm.mixin.injection.At.Shift; 8 | import org.spongepowered.asm.mixin.injection.Inject; 9 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 10 | import org.spongepowered.asm.mixin.injection.callback.LocalCapture; 11 | 12 | import net.minecraft.client.world.ClientChunkManager; 13 | import net.minecraft.nbt.NbtCompound; 14 | import net.minecraft.network.PacketByteBuf; 15 | import net.minecraft.util.math.ChunkPos; 16 | import net.minecraft.world.biome.source.BiomeArray; 17 | import net.minecraft.world.chunk.WorldChunk; 18 | 19 | import me.modmuss50.optifabric.compat.InterceptingMixin; 20 | import me.modmuss50.optifabric.compat.Shim; 21 | 22 | @Mixin(ClientChunkManager.class) 23 | @InterceptingMixin("net/fabricmc/fabric/mixin/event/lifecycle/client/ClientChunkManagerMixin") 24 | abstract class ClientChunkManagerMixin { 25 | @Inject(method = {"loadChunkFromPacket", "method_16020(IILnet/minecraft/class_4548;Lnet/minecraft/class_2540;Lnet/minecraft/class_2487;Ljava/util/BitSet;)Lnet/minecraft/class_2818;"}, 26 | at = @At(value = "NEW", target = "net/optifine/ChunkOF", remap = false, shift = Shift.BEFORE), locals = LocalCapture.CAPTURE_FAILHARD) 27 | private void onOFChunkUnload(int x, int z, BiomeArray biomes, PacketByteBuf buf, NbtCompound tag, BitSet verticalStripBitmask, CallbackInfoReturnable call, int index, WorldChunk chunk, ChunkPos pos) { 28 | onChunkUnload(x, z, biomes, buf, tag, verticalStripBitmask, call, index, chunk, pos); 29 | } 30 | 31 | @Shim 32 | private native void onChunkUnload(int x, int z, BiomeArray biomes, PacketByteBuf buf, NbtCompound tag, BitSet verticalStripBitmask, CallbackInfoReturnable call, int index, WorldChunk chunk, ChunkPos pos); 33 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/architectury/mixin/SpriteAtlasTextureMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.architectury.mixin; 2 | 3 | import java.util.Set; 4 | import java.util.stream.Stream; 5 | 6 | import org.spongepowered.asm.mixin.Mixin; 7 | import org.spongepowered.asm.mixin.injection.At; 8 | import org.spongepowered.asm.mixin.injection.Inject; 9 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 10 | import org.spongepowered.asm.mixin.injection.callback.LocalCapture; 11 | 12 | import net.minecraft.client.texture.SpriteAtlasTexture; 13 | import net.minecraft.client.texture.SpriteAtlasTexture.Data; 14 | import net.minecraft.resource.ResourceManager; 15 | import net.minecraft.util.Identifier; 16 | import net.minecraft.util.profiler.Profiler; 17 | 18 | import me.modmuss50.optifabric.compat.InterceptingMixin; 19 | import me.modmuss50.optifabric.compat.PlacatingSurrogate; 20 | import me.modmuss50.optifabric.compat.Shim; 21 | 22 | @Mixin(SpriteAtlasTexture.class) 23 | @InterceptingMixin("me/shedaniel/architectury/mixin/fabric/client/MixinTextureAtlas") 24 | abstract class SpriteAtlasTextureMixin { 25 | @PlacatingSurrogate 26 | private void preStitch(ResourceManager resourceManager, Stream idStream, Profiler profiler, int mipmapLevel, CallbackInfoReturnable call, int mipmapLevels) { 27 | } 28 | 29 | @Inject(method = "stitch", 30 | at = @At(value = "INVOKE", target = "Lnet/minecraft/util/profiler/Profiler;swap(Ljava/lang/String;)V", ordinal = 0), 31 | locals = LocalCapture.CAPTURE_FAILHARD) 32 | private void preStitch(ResourceManager resourceManager, Stream idStream, Profiler profiler, int mipmapLevel, CallbackInfoReturnable call, int mipmapLevels, Set set) { 33 | preStitch(resourceManager, idStream, profiler, mipmapLevels, call, set); 34 | } 35 | 36 | @Shim 37 | private native void preStitch(ResourceManager resourceManager, Stream idStream, Profiler profiler, int mipmapLevel, CallbackInfoReturnable call, Set set); 38 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/architectury/mixin/SpriteAtlasTextureNewMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.architectury.mixin; 2 | 3 | import java.util.Set; 4 | import java.util.stream.Stream; 5 | 6 | import org.spongepowered.asm.mixin.Mixin; 7 | import org.spongepowered.asm.mixin.injection.At; 8 | import org.spongepowered.asm.mixin.injection.Inject; 9 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 10 | import org.spongepowered.asm.mixin.injection.callback.LocalCapture; 11 | 12 | import net.minecraft.client.texture.SpriteAtlasTexture; 13 | import net.minecraft.client.texture.SpriteAtlasTexture.Data; 14 | import net.minecraft.resource.ResourceManager; 15 | import net.minecraft.util.Identifier; 16 | import net.minecraft.util.profiler.Profiler; 17 | 18 | import me.modmuss50.optifabric.compat.InterceptingMixin; 19 | import me.modmuss50.optifabric.compat.PlacatingSurrogate; 20 | import me.modmuss50.optifabric.compat.Shim; 21 | 22 | @Mixin(SpriteAtlasTexture.class) 23 | @InterceptingMixin("dev/architectury/mixin/fabric/client/MixinTextureAtlas") 24 | abstract class SpriteAtlasTextureNewMixin { 25 | @PlacatingSurrogate 26 | private void preStitch(ResourceManager resourceManager, Stream idStream, Profiler profiler, int mipmapLevel, CallbackInfoReturnable call, int mipmapLevels) { 27 | } 28 | 29 | @Inject(method = "stitch", locals = LocalCapture.CAPTURE_FAILHARD, 30 | at = @At(value = "INVOKE_STRING", target = "Lnet/minecraft/util/profiler/Profiler;swap(Ljava/lang/String;)V", args = "ldc=extracting_frames")) 31 | private void preStitch(ResourceManager resourceManager, Stream idStream, Profiler profiler, int mipmapLevel, CallbackInfoReturnable call, int mipmapLevels, Set set) { 32 | preStitch(resourceManager, idStream, profiler, mipmapLevels, call, set); 33 | } 34 | 35 | @Shim 36 | private native void preStitch(ResourceManager resourceManager, Stream idStream, Profiler profiler, int mipmapLevel, CallbackInfoReturnable call, Set set); 37 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/additionalentityattributes/AEAMixinPlugin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.additionalentityattributes; 2 | 3 | import org.objectweb.asm.Opcodes; 4 | import org.objectweb.asm.tree.ClassNode; 5 | import org.objectweb.asm.tree.InsnList; 6 | import org.objectweb.asm.tree.InsnNode; 7 | import org.objectweb.asm.tree.JumpInsnNode; 8 | import org.objectweb.asm.tree.LabelNode; 9 | import org.objectweb.asm.tree.LdcInsnNode; 10 | import org.objectweb.asm.tree.MethodNode; 11 | 12 | import org.spongepowered.asm.mixin.extensibility.IMixinInfo; 13 | 14 | import me.modmuss50.optifabric.compat.InterceptingMixinPlugin; 15 | import me.modmuss50.optifabric.util.RemappingUtils; 16 | 17 | public class AEAMixinPlugin extends InterceptingMixinPlugin { 18 | @Override 19 | public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { 20 | if ("BackgroundRendererMixin".equals(mixinInfo.getName())) { 21 | String applyFogDesc = "(Lnet/minecraft/class_4184;Lnet/minecraft/class_758$class_4596;FZ)V";//(Camera, BackgroundRenderer$FogType) 22 | String applyFog = RemappingUtils.getMethodName("class_758", "method_3211", applyFogDesc);//BackgroundRenderer, applyFog 23 | applyFogDesc = RemappingUtils.mapMethodDescriptor(applyFogDesc); 24 | 25 | for (MethodNode method : targetClass.methods) { 26 | if (applyFog.equals(method.name) && applyFogDesc.equals(method.desc)) { 27 | InsnList extra = new InsnList(); 28 | LabelNode skip = new LabelNode(); 29 | 30 | extra.add(new JumpInsnNode(Opcodes.GOTO, skip)); 31 | extra.add(new InsnNode(Opcodes.FCONST_0)); 32 | extra.add(new LdcInsnNode(0.25F)); 33 | extra.add(new InsnNode(Opcodes.FCONST_1)); 34 | extra.add(new LdcInsnNode(3F)); 35 | extra.add(new LdcInsnNode(96F)); 36 | extra.add(skip); 37 | 38 | method.instructions.insertBefore(method.instructions.getFirst(), extra); 39 | break; 40 | } 41 | } 42 | } 43 | 44 | super.preApply(targetClassName, targetClass, mixinClassName, mixinInfo); 45 | } 46 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/pswg/StarWarsMixinPlugin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.pswg; 2 | 3 | import org.objectweb.asm.Opcodes; 4 | import org.objectweb.asm.tree.ClassNode; 5 | import org.objectweb.asm.tree.InsnList; 6 | import org.objectweb.asm.tree.InsnNode; 7 | import org.objectweb.asm.tree.JumpInsnNode; 8 | import org.objectweb.asm.tree.LabelNode; 9 | import org.objectweb.asm.tree.MethodInsnNode; 10 | import org.objectweb.asm.tree.MethodNode; 11 | 12 | import org.spongepowered.asm.mixin.extensibility.IMixinInfo; 13 | 14 | import me.modmuss50.optifabric.compat.EmptyMixinPlugin; 15 | import me.modmuss50.optifabric.util.RemappingUtils; 16 | 17 | import net.fabricmc.tinyremapper.IMappingProvider.Member; 18 | 19 | public class StarWarsMixinPlugin extends EmptyMixinPlugin { 20 | @Override 21 | public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { 22 | if ("FrameBufferMixin".equals(mixinInfo.getName())) { 23 | Member texImage2D = RemappingUtils.mapMethod("class_4493", "method_21954", "(IIIIIIIILjava/nio/IntBuffer;)V"); //GlStateManager, texImage2D 24 | String initFbo = RemappingUtils.getMethodName("class_276", "method_1231", "(IIZ)V"); //FrameBuffer, initFbo 25 | 26 | for (MethodNode method : targetClass.methods) { 27 | if (initFbo.equals(method.name)) { 28 | LabelNode skip = new LabelNode(); 29 | 30 | InsnList extra = new InsnList(); 31 | extra.add(new JumpInsnNode(Opcodes.GOTO, skip)); 32 | for (byte i = 0; i < 8; i++) extra.add(new InsnNode(Opcodes.ICONST_0)); 33 | extra.add(new InsnNode(Opcodes.ACONST_NULL)); 34 | extra.add(new MethodInsnNode(Opcodes.INVOKESTATIC, texImage2D.owner, texImage2D.name, texImage2D.desc, false)); 35 | extra.add(new InsnNode(Opcodes.POP)); 36 | extra.add(skip); 37 | 38 | method.instructions.insertBefore(method.instructions.getFirst(), extra); 39 | break; 40 | } 41 | } 42 | } 43 | } 44 | 45 | @Override 46 | public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { 47 | } 48 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/fabricrendererapi/mixin/BlockRenderManagerMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.fabricrendererapi.mixin; 2 | 3 | import java.util.Random; 4 | 5 | import org.spongepowered.asm.mixin.Mixin; 6 | import org.spongepowered.asm.mixin.injection.At; 7 | import org.spongepowered.asm.mixin.injection.Coerce; 8 | import org.spongepowered.asm.mixin.injection.Inject; 9 | import org.spongepowered.asm.mixin.injection.At.Shift; 10 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 11 | import org.spongepowered.asm.mixin.injection.callback.LocalCapture; 12 | 13 | import net.minecraft.block.BlockState; 14 | import net.minecraft.client.render.VertexConsumer; 15 | import net.minecraft.client.render.block.BlockRenderManager; 16 | import net.minecraft.client.util.math.MatrixStack; 17 | import net.minecraft.util.crash.CrashReport; 18 | import net.minecraft.util.crash.CrashReportSection; 19 | import net.minecraft.util.math.BlockPos; 20 | import net.minecraft.world.BlockRenderView; 21 | 22 | @Mixin(BlockRenderManager.class) 23 | abstract class BlockRenderManagerMixin { 24 | @Inject(method = {"renderModel", "renderBatched"}, remap = false, locals = LocalCapture.CAPTURE_FAILSOFT, 25 | at = {@At(value = "INVOKE", shift = Shift.AFTER, remap = true, 26 | target = "Lnet/minecraft/util/crash/CrashReportSection;addBlockInfo(Lnet/minecraft/util/crash/CrashReportSection;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;)V"), 27 | @At(value = "INVOKE", shift = Shift.AFTER, remap = true, 28 | target = "Lnet/minecraft/util/crash/CrashReportSection;addBlockInfo(Lnet/minecraft/util/crash/CrashReportSection;" 29 | + "Lnet/minecraft/world/HeightLimitView;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;)V") 30 | }) 31 | private void addInfo(BlockState state, BlockPos pos, BlockRenderView world, MatrixStack matrix, VertexConsumer vertexConsumer, boolean cull, Random random, 32 | @Coerce Object modelData, CallbackInfoReturnable call, Throwable t, CrashReport crash, CrashReportSection blockInfo) { 33 | blockInfo.add("Block render type", state.getRenderType()); 34 | } 35 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/indigo/IndigoOldMixinPlugin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.indigo; 2 | 3 | import org.objectweb.asm.Opcodes; 4 | import org.objectweb.asm.tree.AbstractInsnNode; 5 | import org.objectweb.asm.tree.ClassNode; 6 | import org.objectweb.asm.tree.MethodInsnNode; 7 | import org.objectweb.asm.tree.MethodNode; 8 | import org.objectweb.asm.tree.VarInsnNode; 9 | 10 | import org.spongepowered.asm.mixin.extensibility.IMixinInfo; 11 | import org.spongepowered.asm.util.Bytecode; 12 | 13 | import me.modmuss50.optifabric.compat.InterceptingMixinPlugin; 14 | import me.modmuss50.optifabric.util.RemappingUtils; 15 | 16 | public class IndigoOldMixinPlugin extends InterceptingMixinPlugin { 17 | @Override 18 | public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { 19 | super.postApply(targetClassName, targetClass, mixinClassName, mixinInfo); 20 | 21 | if ("ChunkCacheOFMixin".equals(mixinInfo.getName())) { 22 | out: for (MethodNode method : targetClass.methods) { 23 | if (Bytecode.hasFlag(method, Opcodes.ACC_SYNTHETIC)) {//(ChunkRendererRegion, ChunkBuilder$BuiltChunk, ChunkBuilder$ChunkData, BlockBufferBuilderStorage) 24 | String desc = RemappingUtils.mapMethodDescriptor("(Lnet/minecraft/class_853;Lnet/minecraft/class_846$class_851;Lnet/minecraft/class_846$class_849;Lnet/minecraft/class_750;)Lnet/fabricmc/fabric/impl/client/indigo/renderer/render/TerrainRenderContext;"); 25 | 26 | for (AbstractInsnNode insn : method.instructions) { 27 | if (insn.getType() == AbstractInsnNode.METHOD_INSN && insn.getOpcode() == Opcodes.INVOKEVIRTUAL) { 28 | MethodInsnNode minsn = (MethodInsnNode) insn; 29 | if ("net/fabricmc/fabric/impl/client/indigo/renderer/render/TerrainRenderContext".equals(minsn.owner) && "prepare".equals(minsn.name) && desc.equals(minsn.desc)) { 30 | minsn.desc = Bytecode.changeDescriptorReturnType(desc, "V"); 31 | method.instructions.insert(insn, new VarInsnNode(Opcodes.ALOAD, 1)); //This return is gone, need to load the context back 32 | break out; 33 | } 34 | } 35 | } 36 | } 37 | } 38 | } 39 | } 40 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/borderlessmining/BorderlessMiningMixinPlugin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.borderlessmining; 2 | 3 | import org.objectweb.asm.Opcodes; 4 | import org.objectweb.asm.tree.ClassNode; 5 | import org.objectweb.asm.tree.InsnList; 6 | import org.objectweb.asm.tree.JumpInsnNode; 7 | import org.objectweb.asm.tree.LabelNode; 8 | import org.objectweb.asm.tree.MethodInsnNode; 9 | import org.objectweb.asm.tree.MethodNode; 10 | 11 | import org.spongepowered.asm.mixin.extensibility.IMixinInfo; 12 | 13 | import net.fabricmc.tinyremapper.IMappingProvider.Member; 14 | 15 | import me.modmuss50.optifabric.compat.InterceptingMixinPlugin; 16 | import me.modmuss50.optifabric.util.RemappingUtils; 17 | 18 | public class BorderlessMiningMixinPlugin extends InterceptingMixinPlugin { 19 | @Override 20 | public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { 21 | if ("VideoOptionsScreenMixin".equals(mixinInfo.getName())) { 22 | String init = RemappingUtils.getMethodName("class_446", "method_25426", "()V"); //VideoOptionsScreen, init 23 | 24 | for (MethodNode method : targetClass.methods) { 25 | if (init.equals(method.name) && "()V".equals(method.desc)) { 26 | Member createSimpleOption = RemappingUtils.mapMethod("class_7172", "", getCreateSimpleOptionInitDescriptor()); 27 | InsnList extra = new InsnList(); 28 | LabelNode skip = new LabelNode(); 29 | 30 | extra.add(new JumpInsnNode(Opcodes.GOTO, skip)); 31 | extra.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, createSimpleOption.owner, createSimpleOption.name, createSimpleOption.desc, false)); 32 | extra.add(skip); 33 | 34 | method.instructions.insertBefore(method.instructions.getFirst(), extra); 35 | break; 36 | } 37 | } 38 | } 39 | 40 | super.preApply(targetClassName, targetClass, mixinClassName, mixinInfo); 41 | } 42 | 43 | protected String getCreateSimpleOptionInitDescriptor() { 44 | return "(Ljava/lang/String;Lnet/minecraft/class_7172$class_7307;Lnet/minecraft/class_7172$class_7303;Lnet/minecraft/class_7172$class_7178;Ljava/lang/Object;Ljava/util/function/Consumer;)V"; 45 | } 46 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/nowplaying/NowPlayingMixinPlugin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.nowplaying; 2 | 3 | import org.objectweb.asm.Opcodes; 4 | import org.objectweb.asm.tree.ClassNode; 5 | import org.objectweb.asm.tree.InsnList; 6 | import org.objectweb.asm.tree.InsnNode; 7 | import org.objectweb.asm.tree.JumpInsnNode; 8 | import org.objectweb.asm.tree.LabelNode; 9 | import org.objectweb.asm.tree.MethodInsnNode; 10 | import org.objectweb.asm.tree.MethodNode; 11 | 12 | import org.spongepowered.asm.mixin.extensibility.IMixinInfo; 13 | 14 | import net.fabricmc.tinyremapper.IMappingProvider.Member; 15 | 16 | import me.modmuss50.optifabric.compat.InterceptingMixinPlugin; 17 | import me.modmuss50.optifabric.util.RemappingUtils; 18 | 19 | public class NowPlayingMixinPlugin extends InterceptingMixinPlugin { 20 | @Override 21 | public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { 22 | if ("WorldRendererMixin".equals(mixinInfo.getName())) {//InGameHud, setRecordPlayingOverlayDesc, (Text) 23 | Member setRecordPlayingOverlay = RemappingUtils.mapMethod("class_329", "method_1732", "(Lnet/minecraft/class_2561;)V"); 24 | //WorldRenderer, playSong, (SoundEvent, BlockPos) 25 | String playSong = RemappingUtils.getMethodName("class_761", "method_8562", "(Lnet/minecraft/class_3414;Lnet/minecraft/class_2338;)V"); 26 | 27 | for (MethodNode method : targetClass.methods) { 28 | if (playSong.equals(method.name)) {//Now Playing does this to all methods called playSong 29 | LabelNode skip = new LabelNode(); 30 | 31 | InsnList extra = new InsnList(); 32 | extra.add(new JumpInsnNode(Opcodes.GOTO, skip)); 33 | extra.add(new InsnNode(Opcodes.ACONST_NULL)); 34 | extra.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, setRecordPlayingOverlay.owner, setRecordPlayingOverlay.name, setRecordPlayingOverlay.desc, false)); 35 | extra.add(new InsnNode(Opcodes.POP)); 36 | extra.add(skip); 37 | 38 | method.instructions.insertBefore(method.instructions.getLast(), extra); 39 | } 40 | } 41 | } 42 | 43 | super.preApply(targetClassName, targetClass, mixinClassName, mixinInfo); 44 | } 45 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/amecs/mixin/GameOptionsMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.amecs.mixin; 2 | 3 | import java.io.PrintWriter; 4 | 5 | import org.spongepowered.asm.mixin.Mixin; 6 | import org.spongepowered.asm.mixin.injection.At; 7 | import org.spongepowered.asm.mixin.injection.Coerce; 8 | import org.spongepowered.asm.mixin.injection.Inject; 9 | import org.spongepowered.asm.mixin.injection.Slice; 10 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 11 | import org.spongepowered.asm.mixin.injection.callback.LocalCapture; 12 | 13 | import net.minecraft.client.option.GameOptions; 14 | import net.minecraft.client.option.KeyBinding; 15 | 16 | import me.modmuss50.optifabric.compat.InterceptingMixin; 17 | import me.modmuss50.optifabric.compat.LoudCoerce; 18 | import me.modmuss50.optifabric.compat.PlacatingSurrogate; 19 | import me.modmuss50.optifabric.compat.Shim; 20 | 21 | @Mixin(GameOptions.class) 22 | @InterceptingMixin("de/siphalor/amecs/impl/mixin/MixinGameOptions") 23 | abstract class GameOptionsMixin { 24 | @PlacatingSurrogate 25 | public void onKeyBindingWritten(CallbackInfo callbackInfo, PrintWriter printWriter, @LoudCoerce(value = "null", remap = false) Object closeException, 26 | KeyBinding[] keyBindings, int keyBindingsCount, int index) { 27 | } 28 | 29 | @Inject(method = "write", 30 | at = @At(value = "INVOKE", target = "Ljava/io/PrintWriter;println(Ljava/lang/String;)V", ordinal = 1, remap = false), 31 | slice = @Slice(from = @At(value = "FIELD", target = "Lnet/minecraft/client/option/GameOptions;keysAll:[Lnet/minecraft/client/option/KeyBinding;")), 32 | locals = LocalCapture.CAPTURE_FAILSOFT) 33 | private void onKeyBindingWritten(CallbackInfo callbackInfo, PrintWriter printWriter, @Coerce Object closeException, 34 | KeyBinding[] keyBindings, int keyBindingsCount, int index, KeyBinding keyBinding) { 35 | onKeyBindingWritten(callbackInfo, printWriter, keyBindings, keyBindingsCount, index, keyBinding); 36 | } 37 | 38 | @Shim 39 | public abstract void onKeyBindingWritten(CallbackInfo callbackInfo, PrintWriter printWriter, KeyBinding[] keyBindings, int keyBindingsCount, int index, KeyBinding keyBinding); 40 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/ae2/mixin/FaceRotatingModelMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.ae2.mixin; 2 | 3 | import java.util.List; 4 | import java.util.Random; 5 | 6 | import org.spongepowered.asm.mixin.Mixin; 7 | import org.spongepowered.asm.mixin.Pseudo; 8 | import org.spongepowered.asm.mixin.Unique; 9 | import org.spongepowered.asm.mixin.injection.At; 10 | import org.spongepowered.asm.mixin.injection.Inject; 11 | import org.spongepowered.asm.mixin.injection.ModifyArg; 12 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 13 | import org.spongepowered.asm.mixin.injection.callback.LocalCapture; 14 | 15 | import net.minecraft.block.BlockState; 16 | import net.minecraft.client.render.model.BakedQuad; 17 | import net.minecraft.client.texture.Sprite; 18 | import net.minecraft.util.math.Direction; 19 | 20 | import net.fabricmc.fabric.api.renderer.v1.model.ForwardingBakedModel; 21 | 22 | @Pseudo 23 | @Mixin(targets = "appeng/client/render/tesr/ChestTileEntityRenderer$FaceRotatingModel", remap = false) 24 | abstract class FaceRotatingModelMixin extends ForwardingBakedModel { 25 | @Unique 26 | private BakedQuad activeQuad; 27 | 28 | @Inject(method = "getQuads(Lnet/minecraft/block/BlockState;Lnet/minecraft/util/math/Direction;Ljava/util/Random;)Ljava/util/List;", 29 | at = @At(value = "NEW", target = "net/minecraft/client/render/model/BakedQuad"), locals = LocalCapture.CAPTURE_FAILEXCEPTION, 30 | remap = true) 31 | private void grabQuad(BlockState state, Direction side, Random rand, CallbackInfoReturnable> call, List quads, int i, BakedQuad quad) { 32 | activeQuad = quad; 33 | } 34 | 35 | @ModifyArg(method = "getQuads(Lnet/minecraft/block/BlockState;Lnet/minecraft/util/math/Direction;Ljava/util/Random;)Ljava/util/List;", 36 | at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/model/BakedQuad;([IILnet/minecraft/util/math/Direction;Lnet/minecraft/client/texture/Sprite;Z)V"), 37 | remap = true) 38 | private Sprite notSoNull(Sprite actuallyNull) { 39 | try { 40 | return actuallyNull != null ? actuallyNull : ((BakedQuadAccess) activeQuad).getSprite(); 41 | } finally { 42 | activeQuad = null; 43 | } 44 | } 45 | } -------------------------------------------------------------------------------- /src/main/java/me/modmuss50/optifabric/compat/replaymod/mixin/KeyboardNewMixin.java: -------------------------------------------------------------------------------- 1 | package me.modmuss50.optifabric.compat.replaymod.mixin; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 5 | 6 | import net.minecraft.client.Keyboard; 7 | import net.minecraft.client.gui.Element; 8 | import net.minecraft.client.gui.screen.Screen; 9 | 10 | import me.modmuss50.optifabric.compat.InterceptingMixin; 11 | import me.modmuss50.optifabric.compat.PlacatingSurrogate; 12 | import me.modmuss50.optifabric.compat.Shim; 13 | 14 | @Mixin(Keyboard.class) 15 | @InterceptingMixin("com/replaymod/lib/de/johni0702/minecraft/gui/versions/mixin/MixinKeyboardListener") 16 | abstract class KeyboardNewMixin { 17 | @Shim 18 | private native void keyPressed(int action, Screen screen, boolean[] handled, int keyCode, int scanCode, int modifiers, CallbackInfo call); 19 | 20 | @PlacatingSurrogate 21 | private void keyPressed(int action, boolean[] handled, int keyCode, int scanCode, int modifiers, Screen screen, CallbackInfo call) { 22 | keyPressed(action, screen, handled, keyCode, scanCode, modifiers, call); 23 | } 24 | 25 | @Shim 26 | private native void keyReleased(int action, Screen screen, boolean[] handled, int keyCode, int scanCode, int modifiers, CallbackInfo call); 27 | 28 | @PlacatingSurrogate 29 | private void keyReleased(int action, boolean[] handled, int keyCode, int scanCode, int modifiers, Screen screen, CallbackInfo call) { 30 | keyReleased(action, screen, handled, keyCode, scanCode, modifiers, call); 31 | } 32 | 33 | @Shim 34 | private static native void charTyped(Element element, int keyChar, int modifiers, CallbackInfo call); 35 | 36 | @PlacatingSurrogate 37 | private static void charTyped(Keyboard self, int keyChar, int modifiers, Element element, CallbackInfo call) { 38 | charTyped(element, keyChar, modifiers, call); 39 | } 40 | 41 | @Shim 42 | private static native void charTyped(Element element, char keyChar, int modifiers, CallbackInfo call); 43 | 44 | @PlacatingSurrogate 45 | private static void charTyped(Keyboard self, char keyChar, int modifiers, Element element, CallbackInfo call) { 46 | charTyped(element, keyChar, modifiers, call); 47 | } 48 | } --------------------------------------------------------------------------------