Skip to content

Commit

Permalink
Fix mixin conflict with lithium and its forks (#1229)
Browse files Browse the repository at this point in the history
  • Loading branch information
IzzelAliz committed Mar 11, 2024
1 parent 8d86124 commit b9be849
Show file tree
Hide file tree
Showing 5 changed files with 34 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
import java.util.List;
import java.util.Optional;

@Mixin(PortalForcer.class)
@Mixin(value = PortalForcer.class, priority = 1500)
public abstract class PortalForcerMixin implements TeleporterBridge {

// @formatter:off
Expand All @@ -38,7 +38,7 @@ public abstract class PortalForcerMixin implements TeleporterBridge {
@Shadow public abstract Optional<BlockUtil.FoundRectangle> findPortalAround(BlockPos p_192986_, boolean p_192987_, WorldBorder p_192988_);
// @formatter:on

@ModifyVariable(method = "findPortalAround", index = 5, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/ai/village/poi/PoiManager;ensureLoadedAndValid(Lnet/minecraft/world/level/LevelReader;Lnet/minecraft/core/BlockPos;I)V"))
@ModifyVariable(method = "findPortalAround", ordinal = 0, at = @At(value = "STORE", ordinal = 0))
private int arclight$useSearchRadius(int i) {
return this.arclight$searchRadius == -1 ? i : this.arclight$searchRadius;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package io.izzel.arclight.common.mixin.optimization.general;

import io.izzel.arclight.common.mod.compat.ModIds;
import io.izzel.arclight.common.mod.mixins.annotation.LoadIfMod;
import net.minecraft.util.ClassInstanceMultiMap;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
Expand All @@ -17,6 +19,7 @@
import java.util.Map;

@Mixin(ClassInstanceMultiMap.class)
@LoadIfMod(modid = {ModIds.LITHIUM, ModIds.CANARY, ModIds.RADIUM}, condition = LoadIfMod.ModCondition.ABSENT)
public class ClassInheritanceMultiMapMixin<T> {

// @formatter:off
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,10 @@
public class ModIds {

public static final String IMMERSIVE_PORTALS = "immersive_portals";

// known lithium forks, so far
public static final String
LITHIUM = "lithium",
CANARY = "canary",
RADIUM = "radium";
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import org.objectweb.asm.tree.AnnotationNode;
import org.objectweb.asm.tree.ClassNode;

import java.util.List;
import java.util.Objects;

public class LoadIfModProcessor {
Expand All @@ -17,17 +18,32 @@ static boolean shouldApply(ClassNode node) {
if (ann.desc.equals(TYPE)) {
var loadIfModData = parse(ann);
return switch (loadIfModData.condition()) {
case ABSENT -> !ArclightCommon.api().isModLoaded(loadIfModData.modid());
case PRESENT -> ArclightCommon.api().isModLoaded(loadIfModData.modid());
case ABSENT -> {
for (var modid : loadIfModData.modids()) {
if (ArclightCommon.api().isModLoaded(modid)) {
yield false;
}
}
yield true;
}
case PRESENT -> {
for (var modid : loadIfModData.modids()) {
if (ArclightCommon.api().isModLoaded(modid)) {
yield true;
}
}
yield false;
}
};
}
}
return true;
}

@SuppressWarnings("unchecked")
private static LoadIfModData parse(AnnotationNode ann) {
LoadIfMod.ModCondition condition = null;
String modid = null;
List<String> modids = null;
for (int i = 0; i < ann.values.size(); i += 2) {
var name = ((String) ann.values.get(i));
var value = ann.values.get(i + 1);
Expand All @@ -36,13 +52,13 @@ private static LoadIfModData parse(AnnotationNode ann) {
var condName = ((String[]) value)[1];
condition = LoadIfMod.ModCondition.valueOf(condName);
}
case "modid" -> modid = ((String) value);
case "modid" -> modids = ((List<String>) value);
}
}
return new LoadIfModData(Objects.requireNonNull(condition, "condition"),
Objects.requireNonNull(modid, "modid"));
Objects.requireNonNull(modids, "modid"));
}

private record LoadIfModData(LoadIfMod.ModCondition condition, String modid) {
private record LoadIfModData(LoadIfMod.ModCondition condition, List<String> modids) {
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
@Retention(RetentionPolicy.CLASS)
public @interface LoadIfMod {

String modid();
String[] modid();

ModCondition condition();

Expand Down

0 comments on commit b9be849

Please sign in to comment.