Skip to content

Commit 8e07c18

Browse files
committed
use MixinExtras for most redirects to avoid mixin conflicts
1 parent 845437a commit 8e07c18

9 files changed

+54
-61
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,29 @@
11
package galena.oreganized.mixin;
22

3+
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
4+
import com.llamalad7.mixinextras.sugar.Local;
35
import galena.oreganized.content.entity.LeadBoltEntity;
46
import galena.oreganized.index.ODamageSources;
57
import net.minecraft.world.damagesource.DamageSource;
6-
import net.minecraft.world.damagesource.DamageSources;
78
import net.minecraft.world.entity.Entity;
89
import net.minecraft.world.entity.projectile.AbstractArrow;
910
import org.spongepowered.asm.mixin.Mixin;
1011
import org.spongepowered.asm.mixin.injection.At;
11-
import org.spongepowered.asm.mixin.injection.Redirect;
1212

1313
@Mixin(AbstractArrow.class)
1414
public class AbstractArrowMixin {
1515

16-
@Redirect(
16+
@ModifyExpressionValue(
1717
method = "onHitEntity(Lnet/minecraft/world/phys/EntityHitResult;)V",
1818
at = @At(value = "INVOKE", target = "Lnet/minecraft/world/damagesource/DamageSources;arrow(Lnet/minecraft/world/entity/projectile/AbstractArrow;Lnet/minecraft/world/entity/Entity;)Lnet/minecraft/world/damagesource/DamageSource;")
1919
)
20-
public DamageSource injectLeadBolt(DamageSources instance, AbstractArrow arrow, Entity user) {
21-
if (arrow instanceof LeadBoltEntity) {
22-
return instance.source(ODamageSources.LEAD_BOLT, arrow, user);
20+
public DamageSource injectLeadBolt(DamageSource original, @Local(ordinal = 1) Entity user) {
21+
var self = (AbstractArrow) (Object) this;
22+
if (self instanceof LeadBoltEntity) {
23+
return self.damageSources().source(ODamageSources.LEAD_BOLT, self, user);
2324
}
2425

25-
return instance.arrow(arrow, user);
26+
return original;
2627
}
2728

2829
}
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,34 @@
11
package galena.oreganized.mixin;
22

3+
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
4+
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
35
import com.llamalad7.mixinextras.sugar.Local;
46
import galena.oreganized.content.item.ScribeItem;
57
import net.minecraft.world.item.ItemStack;
6-
import net.minecraft.world.item.enchantment.Enchantment;
7-
import net.minecraft.world.item.enchantment.EnchantmentHelper;
88
import net.minecraft.world.item.enchantment.Enchantments;
99
import net.minecraft.world.level.block.Block;
1010
import net.minecraft.world.level.block.state.BlockState;
1111
import net.minecraft.world.level.storage.loot.LootParams;
1212
import net.minecraft.world.level.storage.loot.parameters.LootContextParams;
1313
import org.spongepowered.asm.mixin.Mixin;
1414
import org.spongepowered.asm.mixin.injection.At;
15-
import org.spongepowered.asm.mixin.injection.ModifyVariable;
16-
import org.spongepowered.asm.mixin.injection.Redirect;
15+
16+
import java.util.List;
1717

1818
@Mixin(Block.class)
1919
public class BlockMixin {
2020

21-
@ModifyVariable(
21+
@WrapOperation(
2222
method = "getDrops(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/entity/BlockEntity;Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/item/ItemStack;)Ljava/util/List;",
23-
at = @At(value = "STORE")
23+
at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/state/BlockState;getDrops(Lnet/minecraft/world/level/storage/loot/LootParams$Builder;)Ljava/util/List;")
2424
)
25-
private static LootParams.Builder modifyLootBuilder(LootParams.Builder builder, @Local BlockState state, @Local ItemStack stack) {
25+
private static List<ItemStack> modifyLootBuilder(BlockState state, LootParams.Builder builder, Operation<List<ItemStack>> original, @Local ItemStack stack) {
2626
if (stack.getItem() instanceof ScribeItem scribe && scribe.dropsLikeSilktouch(stack, state)) {
2727
var virtual = stack.copy();
2828
virtual.enchant(Enchantments.SILK_TOUCH, 1);
29-
return builder.withParameter(LootContextParams.TOOL, virtual);
29+
builder.withParameter(LootContextParams.TOOL, virtual);
3030
}
31-
return builder;
31+
return original.call(state, builder);
3232
}
3333

3434
}
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,32 @@
11
package galena.oreganized.mixin;
22

3+
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
4+
import com.llamalad7.mixinextras.sugar.Local;
35
import galena.oreganized.index.OEffects;
46
import net.minecraft.world.entity.player.Player;
57
import net.minecraft.world.food.FoodData;
68
import org.spongepowered.asm.mixin.Mixin;
79
import org.spongepowered.asm.mixin.injection.At;
8-
import org.spongepowered.asm.mixin.injection.Redirect;
910

1011
@Mixin(FoodData.class)
1112
public class FoodDataMixin {
1213

13-
@Redirect(
14+
@ModifyExpressionValue(
1415
method = "tick(Lnet/minecraft/world/entity/player/Player;)V",
15-
at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Player;heal(F)V")
16+
at = @At(value = "CONSTANT", args = "floatValue=6F", ordinal = 1)
1617
)
17-
private void modifyHealthAmount(Player player, float value) {
18-
if (player.hasEffect(OEffects.STUNNING.get())) player.heal(value / 2);
19-
else player.heal(value);
18+
private float modifyHealthAmount(float value, @Local Player player) {
19+
if (player.hasEffect(OEffects.STUNNING.get())) return value * 2;
20+
return value;
21+
}
22+
23+
@ModifyExpressionValue(
24+
method = "tick(Lnet/minecraft/world/entity/player/Player;)V",
25+
at = @At(value = "CONSTANT", args = "floatValue=1F", ordinal = 1)
26+
)
27+
private float modifyHealthAmount2(float value, @Local Player player) {
28+
if (player.hasEffect(OEffects.STUNNING.get())) return value / 2;
29+
return value;
2030
}
2131

2232
}
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,26 @@
11
package galena.oreganized.mixin;
22

3+
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
34
import com.llamalad7.mixinextras.sugar.Local;
45
import galena.oreganized.content.item.ScribeItem;
56
import net.minecraft.world.item.ItemStack;
6-
import net.minecraft.world.item.enchantment.Enchantment;
7-
import net.minecraft.world.item.enchantment.EnchantmentHelper;
8-
import net.minecraft.world.item.enchantment.Enchantments;
97
import net.minecraft.world.level.block.IceBlock;
108
import net.minecraft.world.level.block.state.BlockState;
119
import org.spongepowered.asm.mixin.Mixin;
1210
import org.spongepowered.asm.mixin.injection.At;
13-
import org.spongepowered.asm.mixin.injection.Redirect;
1411

1512
@Mixin(IceBlock.class)
1613
public class IceBlockMixin {
1714

18-
@Redirect(
15+
@ModifyExpressionValue(
1916
method = "playerDestroy(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/block/entity/BlockEntity;Lnet/minecraft/world/item/ItemStack;)V",
2017
at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/enchantment/EnchantmentHelper;getItemEnchantmentLevel(Lnet/minecraft/world/item/enchantment/Enchantment;Lnet/minecraft/world/item/ItemStack;)I")
2118
)
22-
private int modifyLootBuilder(Enchantment enchantment, ItemStack stack, @Local BlockState state) {
19+
private int modifyLootBuilder(int original, @Local ItemStack stack, @Local BlockState state) {
2320
if (stack.getItem() instanceof ScribeItem scribe && scribe.isCorrectToolForDrops(stack, state)) {
2421
return 1;
2522
}
26-
return EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, stack);
23+
return original;
2724
}
2825

2926
}
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
package galena.oreganized.mixin;
22

3+
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
34
import galena.oreganized.content.effect.StunningEffect;
45
import galena.oreganized.index.OEffects;
56
import net.minecraft.world.effect.MobEffectInstance;
67
import org.objectweb.asm.Opcodes;
78
import org.spongepowered.asm.mixin.Mixin;
89
import org.spongepowered.asm.mixin.injection.At;
9-
import org.spongepowered.asm.mixin.injection.Redirect;
1010

1111
@Mixin(MobEffectInstance.class)
1212
public class MobEffectInstanceMixin {
1313

14-
@Redirect(
14+
@ModifyExpressionValue(
1515
method = "update(Lnet/minecraft/world/effect/MobEffectInstance;)Z",
1616
at = @At(
1717
value = "FIELD",
@@ -20,9 +20,10 @@ public class MobEffectInstanceMixin {
2020
opcode = Opcodes.GETFIELD
2121
)
2222
)
23-
private int replaceStunning(MobEffectInstance instance) {
24-
if (instance.getEffect() == OEffects.STUNNING.get()) return StunningEffect.MAX_AMPLIFIER + 1;
25-
return instance.getAmplifier();
23+
private int replaceStunning(int original) {
24+
var self = (MobEffectInstance) (Object) this;
25+
if (self.getEffect() == OEffects.STUNNING.get()) return StunningEffect.MAX_AMPLIFIER + 1;
26+
return original;
2627
}
2728

2829
}

src/main/java/galena/oreganized/mixin/client/GuiAccessor.java

-14
This file was deleted.

src/main/java/galena/oreganized/mixin/client/GuiMixin.java

+5-6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package galena.oreganized.mixin.client;
22

3+
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
4+
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
35
import com.llamalad7.mixinextras.sugar.Local;
46
import galena.oreganized.client.render.gui.OGui;
57
import galena.oreganized.index.OEffects;
@@ -8,28 +10,25 @@
810
import net.minecraft.world.entity.player.Player;
911
import org.spongepowered.asm.mixin.Mixin;
1012
import org.spongepowered.asm.mixin.injection.At;
11-
import org.spongepowered.asm.mixin.injection.Redirect;
1213
import org.spongepowered.asm.mixin.injection.Slice;
1314

1415
@Mixin(Gui.class)
1516
public class GuiMixin {
1617

17-
@Redirect(
18+
@WrapOperation(
1819
method = "renderHearts(Lnet/minecraft/client/gui/GuiGraphics;Lnet/minecraft/world/entity/player/Player;IIIIFIIIZ)V",
1920
at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/Gui;renderHeart(Lnet/minecraft/client/gui/GuiGraphics;Lnet/minecraft/client/gui/Gui$HeartType;IIIZZ)V"),
2021
slice = @Slice(
2122
from = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/Gui;renderHeart(Lnet/minecraft/client/gui/GuiGraphics;Lnet/minecraft/client/gui/Gui$HeartType;IIIZZ)V", ordinal = 1),
2223
to = @At("TAIL")
2324
)
2425
)
25-
private void renderStunnedHeart(Gui instance, GuiGraphics graphics, Gui.HeartType type, int x, int y, int v, boolean blinking, boolean half, @Local Player player) {
26-
var accessor = (GuiAccessor) instance;
27-
26+
private void renderStunnedHeart(Gui instance, GuiGraphics graphics, Gui.HeartType type, int x, int y, int v, boolean blinking, boolean half, Operation<Void> original, @Local Player player) {
2827
if (player.hasEffect(OEffects.STUNNING.get()) && (type == Gui.HeartType.NORMAL || type == Gui.HeartType.POISIONED)) {
2928
var u = type.getX(half, blinking);
3029
OGui.renderStunnedHeart(graphics, u - 52, x, y, v / 5);
3130
} else {
32-
accessor.callRenderHeart(graphics, type, x, y, v, blinking, half);
31+
original.call(instance, graphics, type, x, y, v, blinking, half);
3332
}
3433
}
3534

src/main/java/galena/oreganized/mixin/compat/LogStrippingFakeRecipesMixin.java

+5-6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package galena.oreganized.mixin.compat;
22

3+
import com.llamalad7.mixinextras.injector.ModifyReturnValue;
34
import com.simibubi.create.content.kinetics.deployer.ManualApplicationRecipe;
45
import com.simibubi.create.content.processing.recipe.ProcessingOutput;
56
import com.simibubi.create.content.processing.recipe.ProcessingRecipeBuilder;
@@ -12,18 +13,16 @@
1213
import net.minecraft.world.item.crafting.Ingredient;
1314
import org.spongepowered.asm.mixin.Mixin;
1415
import org.spongepowered.asm.mixin.injection.At;
15-
import org.spongepowered.asm.mixin.injection.Inject;
16-
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
1716

1817
import java.util.ArrayList;
1918
import java.util.List;
2019

2120
@Mixin(value = LogStrippingFakeRecipes.class, remap = false)
2221
public class LogStrippingFakeRecipesMixin {
2322

24-
@Inject(method = "createRecipes", at = @At("RETURN"), require = 0, cancellable = true)
25-
private static void addGroovedRecipes(CallbackInfoReturnable<List<ManualApplicationRecipe>> cir) {
26-
var newList = new ArrayList<>(cir.getReturnValue());
23+
@ModifyReturnValue(method = "createRecipes", at = @At("RETURN"), require = 0)
24+
private static List<ManualApplicationRecipe> addGroovedRecipes(List<ManualApplicationRecipe> value) {
25+
var newList = new ArrayList<>(value);
2726

2827
ScribeItem.getGroovedBlocks().forEach(entry -> {
2928
var blockId = BuiltInRegistries.BLOCK.getKey(entry.getKey()).getPath();
@@ -36,7 +35,7 @@ private static void addGroovedRecipes(CallbackInfoReturnable<List<ManualApplicat
3635
);
3736
});
3837

39-
cir.setReturnValue(newList);
38+
return newList;
4039
}
4140

4241
}

src/main/resources/oreganized.mixins.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
"compat.LogStrippingFakeRecipesMixin"
1010
],
1111
"client": [
12-
"client.GuiAccessor", "client.GuiMixin", "client.HumanoidArmorLayerAccessor", "client.HumanoidArmorLayerMixin",
12+
"client.GuiMixin", "client.HumanoidArmorLayerAccessor", "client.HumanoidArmorLayerMixin",
1313
"client.HumanoidModelMixin"
1414
],
1515
"server": [],

0 commit comments

Comments
 (0)