Skip to content

Commit

Permalink
Remove 0.6 non-api compat
Browse files Browse the repository at this point in the history
  • Loading branch information
IThundxr committed Oct 2, 2024
1 parent 86ce69d commit f02b7db
Show file tree
Hide file tree
Showing 5 changed files with 56 additions and 53 deletions.
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -44,4 +44,4 @@ local.properties
/linkie-cache/

.DS_Store
/libs/
#/libs/
4 changes: 3 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ repositories {
content { includeGroup("com.jamieswhiteshirt") }
}
maven { url = "https://maven.ladysnake.org/releases" } // CCA, for Trinkets
flatDir { dirs "libs" }
}

dependencies {
Expand Down Expand Up @@ -102,7 +103,8 @@ def compat(DependencyHandler deps) {
deps.modCompileOnly("vazkii.botania:Botania:$botania_version") { transitive = false }
deps.modCompileOnly("com.terraformersmc:modmenu:$modmenu_version")
deps.modCompileOnly("maven.modrinth:sandwichable:$sandwichable_version")
deps.modCompileOnly("maven.modrinth:sodium:$sodium_version")
//deps.modCompileOnly("maven.modrinth:sodium:$sodium_version")
deps.modCompileOnly(":sodium-fabric-1.20.1-0.6.0-beta.3+mc1.20.1-slim")

deps.modCompileOnly("dev.emi:trinkets:$trinkets_version")
// for Trinkets
Expand Down
Binary file not shown.
101 changes: 51 additions & 50 deletions src/main/java/com/simibubi/create/compat/sodium/SodiumCompat.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,24 @@
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.function.Predicate;

import com.simibubi.create.Create;
import com.simibubi.create.compat.Mods;
import com.simibubi.create.foundation.utility.Components;

import me.jellysquid.mods.sodium.client.render.texture.SpriteUtil;
import net.caffeinemc.mods.sodium.api.texture.SpriteUtil;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents;
import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents;
import net.fabricmc.fabric.api.networking.v1.PacketSender;
import net.fabricmc.loader.api.FabricLoader;
import net.fabricmc.loader.api.ModContainer;
import net.fabricmc.loader.api.Version;
import net.fabricmc.loader.api.VersionParsingException;
import net.fabricmc.loader.api.metadata.version.VersionPredicate;
import net.minecraft.ChatFormatting;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ClientPacketListener;
Expand All @@ -42,18 +46,29 @@ public static void init() {
}

boolean compatInitialized = false;
for (SpriteUtilCompat value : SpriteUtilCompat.values()) {
if (value.doesWork.get()) {
Minecraft mc = Minecraft.getInstance();
WorldRenderEvents.START.register(ctx -> {
Function<ResourceLocation, TextureAtlasSprite> atlas = mc.getTextureAtlas(InventoryMenu.BLOCK_ATLAS);
TextureAtlasSprite sawSprite = atlas.apply(SAW_TEXTURE);
value.markSpriteAsActive.accept(sawSprite);
});
compatInitialized = true;
break;

Optional<ModContainer> containerOptional = FabricLoader.getInstance()
.getModContainer(Mods.SODIUM.id());

if (containerOptional.isPresent()) {
Version sodiumVersion = containerOptional.get()
.getMetadata()
.getVersion();

for (SpriteUtilCompat value : SpriteUtilCompat.values()) {
if (value.doesWork.test(sodiumVersion)) {
Minecraft mc = Minecraft.getInstance();
WorldRenderEvents.START.register(ctx -> {
Function<ResourceLocation, TextureAtlasSprite> atlas = mc.getTextureAtlas(InventoryMenu.BLOCK_ATLAS);
TextureAtlasSprite sawSprite = atlas.apply(SAW_TEXTURE);
value.markSpriteAsActive.accept(sawSprite);
});
compatInitialized = true;
break;
}
}
}

if (!compatInitialized) {
Create.LOGGER.error("Create's Sodium compat errored and has been partially disabled. Report this!");
}
Expand All @@ -80,65 +95,51 @@ public static void sendNoIndiumWarning(ClientPacketListener handler, PacketSende
}

private enum SpriteUtilCompat {
V0_5(() -> {
V0_5((version) -> {
try {
return checkMarkSpriteActiveSignature(SpriteUtil.class);
} catch (Throwable t) {
invokeOld(null);
return true;
} catch (Throwable ignored) {
return false;
}
}, (sawSprite) -> {
try {
SpriteUtil.markSpriteActive(sawSprite);
invokeOld(sawSprite);
} catch (Throwable ignored) {}
}),
V0_6(() -> {
V0_6_API((version) -> {
try {
return checkMarkSpriteActiveSignature(Class.forName("net.caffeinemc.mods.sodium.client.render.texture.SpriteUtil"));
} catch (Throwable t) {
return VersionPredicate.parse(">=0.6.0-beta.3").test(version);
} catch (VersionParsingException e) {
return false;
}
}, (sawSprite) -> {
try {
invokeMarkSpriteActive(Class.forName("net.caffeinemc.mods.sodium.client.render.texture.SpriteUtil"), sawSprite);
} catch (Throwable ignored) {}
}),
V0_6_API(() -> {
try {
Field field = Class.forName("net.caffeinemc.mods.sodium.api.texture.SpriteUtil")
.getDeclaredField("INSTANCE");
return checkMarkSpriteActiveSignature((Class<?>) field.get(null));
} catch (Throwable t) {
return false;
}
}, (sawSprite) -> {
try {
Field field = Class.forName("net.caffeinemc.mods.sodium.api.texture.SpriteUtil")
.getDeclaredField("INSTANCE");

invokeMarkSpriteActive((Class<?>) field.get(null), sawSprite);
SpriteUtil.INSTANCE.markSpriteActive(sawSprite);
} catch (Throwable ignored) {}
});

private final Supplier<Boolean> doesWork;
private static MethodHandle markSpriteActiveHandle;

private final Predicate<Version> doesWork;
private final Consumer<TextureAtlasSprite> markSpriteAsActive;

SpriteUtilCompat(Supplier<Boolean> doesWork, Consumer<TextureAtlasSprite> markSpriteAsActive) {
SpriteUtilCompat(Predicate<Version> doesWork, Consumer<TextureAtlasSprite> markSpriteAsActive) {
this.doesWork = doesWork;
this.markSpriteAsActive = markSpriteAsActive;
}

private static boolean checkMarkSpriteActiveSignature(Class<?> clazz) throws Throwable {
Method method = clazz.getMethod("markSpriteActive", TextureAtlasSprite.class);
if (method.getReturnType() != Void.TYPE)
throw new IllegalStateException("markSpriteActive's signature has changed");
return true;
}
static {
try {
Class<?> spriteUtil = Class.forName("nme.jellysquid.mods.sodium.client.render.texture.SpriteUtil");

private static void invokeMarkSpriteActive(Class<?> clazz, TextureAtlasSprite sawSprite) throws Throwable {
MethodType methodType = MethodType.methodType(Void.TYPE);
MethodHandle handle = lookup.findVirtual(clazz, "markSpriteActive", methodType);
MethodType methodType = MethodType.methodType(void.class, TextureAtlasSprite.class);
markSpriteActiveHandle = lookup.findStatic(spriteUtil, "markSpriteActive", methodType);
} catch (Throwable ignored) {}
}

handle.invoke(sawSprite);
public static void invokeOld(TextureAtlasSprite sawSprite) throws Throwable {
markSpriteActiveHandle.invoke(sawSprite);
}
}
}
2 changes: 1 addition & 1 deletion src/main/resources/fabric.mod.json
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@
"optifabric": "*",
"colormatic": "<=3.1.1",
"iris": "<=1.2.5",
"sodium": "<=0.4.10",
"sodium": ["<0.5.0", "~0.6.0- <0.6.0-beta.3"],
"sound_physics_remastered": ">1.20.1-1.4.0 <1.20.2-1.0.0",

"create_interactive": "*",
Expand Down

0 comments on commit f02b7db

Please sign in to comment.