Skip to content

Commit

Permalink
Update SodiumCompat
Browse files Browse the repository at this point in the history
  • Loading branch information
IThundxr committed Oct 9, 2024
1 parent 13cd9bf commit bb32a48
Showing 1 changed file with 34 additions and 35 deletions.
69 changes: 34 additions & 35 deletions src/main/java/com/simibubi/create/compat/sodium/SodiumCompat.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;

import com.simibubi.create.Create;
import com.simibubi.create.compat.Mods;
Expand Down Expand Up @@ -41,34 +41,39 @@ public class SodiumCompat {
public static final ResourceLocation SAW_TEXTURE = Create.asResource("block/saw_reversed");

public static void init() {
if (!Mods.INDIUM.isLoaded()) {
ModContainer container = FabricLoader.getInstance().getModContainer(Mods.SODIUM.id()).orElseThrow();
Version sodiumVersion = container.getMetadata().getVersion();

boolean supportsFRAPI = false;

try {
// Any 0.6.0 version or alpha/beta for it
supportsFRAPI = VersionPredicate.parse("~0.6.0-")
.test(sodiumVersion);
} catch (VersionParsingException ignored) {}

// If the sodium version is 0.6.0* then it natively supports FRAPI
if (!Mods.INDIUM.isLoaded() && !supportsFRAPI) {
ClientPlayConnectionEvents.JOIN.register(SodiumCompat::sendNoIndiumWarning);
}

boolean compatInitialized = false;

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;
}

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.get().accept(sawSprite);
});
compatInitialized = true;
break;
}
}


if (!compatInitialized) {
Create.LOGGER.error("Create's Sodium compat errored and has been partially disabled. Report this!");
}
Expand Down Expand Up @@ -102,29 +107,21 @@ private enum SpriteUtilCompat {
} catch (Throwable ignored) {
return false;
}
}, (sawSprite) -> {
try {
invokeOld(sawSprite);
} catch (Throwable ignored) {}
}),
}, () -> SpriteUtilCompat::invokeOld),
V0_6_API((version) -> {
try {
return VersionPredicate.parse(">=0.6.0-beta.3").test(version);
} catch (VersionParsingException e) {
return false;
}
}, (sawSprite) -> {
try {
SpriteUtil.INSTANCE.markSpriteActive(sawSprite);
} catch (Throwable ignored) {}
});
}, () -> SpriteUtil.INSTANCE::markSpriteActive);

private static MethodHandle markSpriteActiveHandle;

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

SpriteUtilCompat(Predicate<Version> doesWork, Consumer<TextureAtlasSprite> markSpriteAsActive) {
SpriteUtilCompat(Predicate<Version> doesWork, Supplier<Consumer<TextureAtlasSprite>> markSpriteAsActive) {
this.doesWork = doesWork;
this.markSpriteAsActive = markSpriteAsActive;
}
Expand All @@ -138,8 +135,10 @@ private enum SpriteUtilCompat {
} catch (Throwable ignored) {}
}

public static void invokeOld(TextureAtlasSprite sawSprite) throws Throwable {
markSpriteActiveHandle.invoke(sawSprite);
public static void invokeOld(TextureAtlasSprite sawSprite) {
try {
markSpriteActiveHandle.invoke(sawSprite);
} catch(Throwable ignored) {}
}
}
}

0 comments on commit bb32a48

Please sign in to comment.