From b78c8d819f2ed667363d39a1775982328cd86e4e Mon Sep 17 00:00:00 2001 From: Jared Date: Thu, 25 May 2023 19:59:51 +0200 Subject: [PATCH] Add repair event --- .../com/blamejared/clumps/gradle/Versions.kt | 2 +- .../clumps/api/events/IRepairEvent.java | 32 +++++++++++ .../clumps/api/events/IValueEvent.java | 3 ++ .../clumps/mixin/MixinExperienceOrb.java | 7 ++- .../clumps/platform/IEventHelper.java | 3 ++ .../clumps/api/events/ClumpsEvents.java | 7 +++ .../clumps/api/events/RepairEvent.java | 52 ++++++++++++++++++ .../clumps/platform/FabricEventHandler.java | 13 +++++ .../clumps/api/events/RepairEvent.java | 53 +++++++++++++++++++ .../clumps/platform/ForgeEventHandler.java | 10 ++++ 10 files changed, 180 insertions(+), 2 deletions(-) create mode 100644 common/src/main/java/com/blamejared/clumps/api/events/IRepairEvent.java create mode 100644 fabric/src/main/java/com/blamejared/clumps/api/events/RepairEvent.java create mode 100644 forge/src/main/java/com/blamejared/clumps/api/events/RepairEvent.java diff --git a/buildSrc/src/main/kotlin/com/blamejared/clumps/gradle/Versions.kt b/buildSrc/src/main/kotlin/com/blamejared/clumps/gradle/Versions.kt index 14420ba..ebed73f 100644 --- a/buildSrc/src/main/kotlin/com/blamejared/clumps/gradle/Versions.kt +++ b/buildSrc/src/main/kotlin/com/blamejared/clumps/gradle/Versions.kt @@ -6,5 +6,5 @@ object Versions { const val MINECRAFT = "1.19.4" const val FORGE = "45.0.4" const val FABRIC = "0.76.0+1.19.4" - const val FABRIC_LOADER = "0.14.17" + const val FABRIC_LOADER = "0.14.19" } \ No newline at end of file diff --git a/common/src/main/java/com/blamejared/clumps/api/events/IRepairEvent.java b/common/src/main/java/com/blamejared/clumps/api/events/IRepairEvent.java new file mode 100644 index 0000000..388137a --- /dev/null +++ b/common/src/main/java/com/blamejared/clumps/api/events/IRepairEvent.java @@ -0,0 +1,32 @@ +package com.blamejared.clumps.api.events; + +import net.minecraft.world.entity.player.Player; + +/** + * Fired before an item is repaired, allowing other mods to repair items before the vanilla inventory is repaired. + * If a repair is performed, then any leftover experience should be set back to this event using {@link #setValue(int)} + */ +public interface IRepairEvent { + + /** + * Sets the amount of experience left after repairing. + * + * @param value The new value to set. + */ + void setValue(int value); + + /** + * Gets the amount of experience to be used by the repair. + * + * @return The amount of experience to be used by the repair. + */ + int getValue(); + + /** + * Gets the player whose items are being repaired. + * + * @return The player whose items are being repaired. + */ + Player getPlayer(); + +} diff --git a/common/src/main/java/com/blamejared/clumps/api/events/IValueEvent.java b/common/src/main/java/com/blamejared/clumps/api/events/IValueEvent.java index e8fcdb6..934062f 100644 --- a/common/src/main/java/com/blamejared/clumps/api/events/IValueEvent.java +++ b/common/src/main/java/com/blamejared/clumps/api/events/IValueEvent.java @@ -4,6 +4,9 @@ /** * Used to mutate the value of experience before repairing player's items and giving the rest to the player. + * **NOTE** This mutates the actual value of the experience orb, it is fired once per *value*, not per orb inside the clumped orb. + * For example, given the orb: {5: 10}, which is an orb that has clumped 10 other orbs who had the value of 5, this even will fire once + * if this event is used to change that 5 to a 7, the orb will *effectively* turn into {7: 10} */ public interface IValueEvent { diff --git a/common/src/main/java/com/blamejared/clumps/mixin/MixinExperienceOrb.java b/common/src/main/java/com/blamejared/clumps/mixin/MixinExperienceOrb.java index 12387fa..2778318 100644 --- a/common/src/main/java/com/blamejared/clumps/mixin/MixinExperienceOrb.java +++ b/common/src/main/java/com/blamejared/clumps/mixin/MixinExperienceOrb.java @@ -1,6 +1,7 @@ package com.blamejared.clumps.mixin; import com.blamejared.clumps.ClumpsCommon; +import com.blamejared.clumps.api.events.IRepairEvent; import com.blamejared.clumps.api.events.IValueEvent; import com.blamejared.clumps.helper.IClumpedOrb; import com.blamejared.clumps.platform.Services; @@ -105,7 +106,11 @@ public void playerTouch(Player player, CallbackInfo ci) { int actualValue = result.map(IValueEvent::getValue, UnaryOperator.identity()); for(int i = 0; i < amount; i++) { - int leftOver = this.repairPlayerItems(player, actualValue); + int leftOver = Services.EVENT.fireRepairEvent(player, actualValue) + .map(IRepairEvent::getValue, UnaryOperator.identity()); + if(leftOver == actualValue) { + leftOver = this.repairPlayerItems(player, actualValue); + } if(leftOver > 0) { toGive.addAndGet(leftOver); } diff --git a/common/src/main/java/com/blamejared/clumps/platform/IEventHelper.java b/common/src/main/java/com/blamejared/clumps/platform/IEventHelper.java index 81444de..b7e543f 100644 --- a/common/src/main/java/com/blamejared/clumps/platform/IEventHelper.java +++ b/common/src/main/java/com/blamejared/clumps/platform/IEventHelper.java @@ -1,6 +1,7 @@ package com.blamejared.clumps.platform; +import com.blamejared.clumps.api.events.IRepairEvent; import com.blamejared.clumps.api.events.IValueEvent; import com.mojang.datafixers.util.Either; import net.minecraft.world.entity.player.Player; @@ -10,4 +11,6 @@ public interface IEventHelper { Either fireValueEvent(Player player, int value); + Either fireRepairEvent(Player player, int value); + } diff --git a/fabric/src/main/java/com/blamejared/clumps/api/events/ClumpsEvents.java b/fabric/src/main/java/com/blamejared/clumps/api/events/ClumpsEvents.java index 53ed9a7..6cae104 100644 --- a/fabric/src/main/java/com/blamejared/clumps/api/events/ClumpsEvents.java +++ b/fabric/src/main/java/com/blamejared/clumps/api/events/ClumpsEvents.java @@ -12,4 +12,11 @@ public class ClumpsEvents { return null; }); + public static final Event> REPAIR_EVENT = EventFactory.createArrayBacked(IEventHandler.class, listeners -> event -> { + for(IEventHandler listener : listeners) { + listener.handle(event); + } + return null; + }); + } diff --git a/fabric/src/main/java/com/blamejared/clumps/api/events/RepairEvent.java b/fabric/src/main/java/com/blamejared/clumps/api/events/RepairEvent.java new file mode 100644 index 0000000..1ed9948 --- /dev/null +++ b/fabric/src/main/java/com/blamejared/clumps/api/events/RepairEvent.java @@ -0,0 +1,52 @@ +package com.blamejared.clumps.api.events; + +import net.minecraft.world.entity.player.Player; + +/** + * Fired before an item is repaired, if a repair is performed, then any leftover experience should be set back to this event. + */ +public class RepairEvent implements IValueEvent { + + private final Player player; + private int value; + + public RepairEvent(Player player, int value) { + + this.player = player; + this.value = value; + } + + /** + * Sets the amount of experience left after repairing. + * + * @param value The new value to set. + */ + @Override + public void setValue(int value) { + + this.value = value; + } + + /** + * Gets the amount of experience to be used by the repair. + * + * @return The amount of experience to be used by the repair. + */ + @Override + public int getValue() { + + return this.value; + } + + /** + * Gets the player whose items are being repaired. + * + * @return The player whose items are being repaired. + */ + @Override + public Player getPlayer() { + + return this.player; + } + +} \ No newline at end of file diff --git a/fabric/src/main/java/com/blamejared/clumps/platform/FabricEventHandler.java b/fabric/src/main/java/com/blamejared/clumps/platform/FabricEventHandler.java index edbccfb..67dbec1 100644 --- a/fabric/src/main/java/com/blamejared/clumps/platform/FabricEventHandler.java +++ b/fabric/src/main/java/com/blamejared/clumps/platform/FabricEventHandler.java @@ -1,7 +1,9 @@ package com.blamejared.clumps.platform; import com.blamejared.clumps.api.events.ClumpsEvents; +import com.blamejared.clumps.api.events.IRepairEvent; import com.blamejared.clumps.api.events.IValueEvent; +import com.blamejared.clumps.api.events.RepairEvent; import com.blamejared.clumps.api.events.ValueEvent; import com.mojang.datafixers.util.Either; import net.fabricmc.loader.api.FabricLoader; @@ -20,4 +22,15 @@ public Either fireValueEvent(Player player, int value) { return Either.right(event.getValue()); } + @Override + public Either fireRepairEvent(Player player, int value) { + + RepairEvent event = new RepairEvent(player, value); + if(FabricLoader.getInstance().isModLoaded("fabric")) { + ClumpsEvents.REPAIR_EVENT.invoker().handle(event); + } + + return Either.right(event.getValue()); + } + } diff --git a/forge/src/main/java/com/blamejared/clumps/api/events/RepairEvent.java b/forge/src/main/java/com/blamejared/clumps/api/events/RepairEvent.java new file mode 100644 index 0000000..defc0e6 --- /dev/null +++ b/forge/src/main/java/com/blamejared/clumps/api/events/RepairEvent.java @@ -0,0 +1,53 @@ +package com.blamejared.clumps.api.events; + +import net.minecraft.world.entity.player.Player; +import net.minecraftforge.eventbus.api.Event; + +/** + * Fired before an item is repaired, if a repair is performed, then any leftover experience should be set back to this event. + */ +public class RepairEvent extends Event implements IRepairEvent { + + private final Player player; + private int value; + + public RepairEvent(Player player, int value) { + + this.player = player; + this.value = value; + } + + /** + * Sets the amount of experience left after repairing. + * + * @param value The new value to set. + */ + @Override + public void setValue(int value) { + + this.value = value; + } + + /** + * Gets the amount of experience to be used by the repair. + * + * @return The amount of experience to be used by the repair. + */ + @Override + public int getValue() { + + return this.value; + } + + /** + * Gets the player whose items are being repaired. + * + * @return The player whose items are being repaired. + */ + @Override + public Player getPlayer() { + + return this.player; + } + +} diff --git a/forge/src/main/java/com/blamejared/clumps/platform/ForgeEventHandler.java b/forge/src/main/java/com/blamejared/clumps/platform/ForgeEventHandler.java index 56eb2f7..c07385a 100644 --- a/forge/src/main/java/com/blamejared/clumps/platform/ForgeEventHandler.java +++ b/forge/src/main/java/com/blamejared/clumps/platform/ForgeEventHandler.java @@ -1,6 +1,8 @@ package com.blamejared.clumps.platform; +import com.blamejared.clumps.api.events.IRepairEvent; import com.blamejared.clumps.api.events.IValueEvent; +import com.blamejared.clumps.api.events.RepairEvent; import com.blamejared.clumps.api.events.ValueEvent; import com.mojang.datafixers.util.Either; import net.minecraft.world.entity.player.Player; @@ -16,4 +18,12 @@ public Either fireValueEvent(Player player, int value) { return Either.left(event); } + @Override + public Either fireRepairEvent(Player player, int value) { + + RepairEvent event = new RepairEvent(player, value); + MinecraftForge.EVENT_BUS.post(event); + return Either.left(event); + } + }