diff --git a/src/main/java/carpet/CarpetSettings.java b/src/main/java/carpet/CarpetSettings.java index 7bf32edf..b513fbea 100644 --- a/src/main/java/carpet/CarpetSettings.java +++ b/src/main/java/carpet/CarpetSettings.java @@ -155,6 +155,10 @@ public class CarpetSettings @Rule( desc = "Players absorb XP instantly, without delay", category = CREATIVE ) public static boolean xpNoCooldown = false; + @Rule( desc = "xpfix", category = SURVIVAL ) + public static boolean xpfix = false; + + @Rule( desc = "XP orbs combine with other into bigger orbs", category = FEATURE ) public static boolean combineXPOrbs = false; diff --git a/src/main/java/carpet/mixins/ExperienceOrbEntityMixin.java b/src/main/java/carpet/mixins/ExperienceOrbEntityMixin.java index 80c453b2..3e3df2d8 100644 --- a/src/main/java/carpet/mixins/ExperienceOrbEntityMixin.java +++ b/src/main/java/carpet/mixins/ExperienceOrbEntityMixin.java @@ -3,14 +3,19 @@ package carpet.mixins; import carpet.CarpetSettings; import carpet.fakes.ExperienceOrbInterface; import carpet.helpers.XPcombine; +import net.minecraft.entity.EquipmentSlot; import net.minecraft.entity.ExperienceOrbEntity; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; + +import java.util.Map; @Mixin(ExperienceOrbEntity.class) public abstract class ExperienceOrbEntityMixin implements ExperienceOrbInterface @@ -19,6 +24,10 @@ public abstract class ExperienceOrbEntityMixin implements ExperienceOrbInterface @Shadow private int field_27009; + @Shadow protected abstract int getMendingRepairCost(int repairAmount); + + @Shadow protected abstract int getMendingRepairAmount(int experienceAmount); + public void setAmount(int amount) { this.amount = amount; } public int combineDelay = 50; @@ -76,4 +85,21 @@ public abstract class ExperienceOrbEntityMixin implements ExperienceOrbInterface } } + // temporary until gets fixed game-side + @Inject(method = "onPlayerCollision", locals = LocalCapture.CAPTURE_FAILHARD, cancellable = true, at = @At( + value = "INVOKE", + target = "Lnet/minecraft/entity/ExperienceOrbEntity;getMendingRepairAmount(I)I" + )) + void cancelApplication(PlayerEntity player, CallbackInfo ci, Map.Entry entry, ItemStack itemStack) + { + if (CarpetSettings.xpfix && field_27009 > 1) + { + int i = Math.min(getMendingRepairAmount(this.amount), itemStack.getDamage()); + field_27009--; + itemStack.setDamage(itemStack.getDamage() - i); + // cancel effects of mending application + ci.cancel(); + } + } + }