Skip to content

Commit

Permalink
Add repair event
Browse files Browse the repository at this point in the history
  • Loading branch information
jaredlll08 committed May 25, 2023
1 parent 9ef9b7c commit b78c8d8
Show file tree
Hide file tree
Showing 10 changed files with 180 additions and 2 deletions.
Expand Up @@ -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"
}
@@ -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();

}
Expand Up @@ -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 {

Expand Down
@@ -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;
Expand Down Expand Up @@ -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);
}
Expand Down
@@ -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;
Expand All @@ -10,4 +11,6 @@ public interface IEventHelper {

Either<IValueEvent, Integer> fireValueEvent(Player player, int value);

Either<IRepairEvent, Integer> fireRepairEvent(Player player, int value);

}
Expand Up @@ -12,4 +12,11 @@ public class ClumpsEvents {
return null;
});

public static final Event<IEventHandler<RepairEvent, Void>> REPAIR_EVENT = EventFactory.createArrayBacked(IEventHandler.class, listeners -> event -> {
for(IEventHandler<RepairEvent, Void> listener : listeners) {
listener.handle(event);
}
return null;
});

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

}
@@ -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;
Expand All @@ -20,4 +22,15 @@ public Either<IValueEvent, Integer> fireValueEvent(Player player, int value) {
return Either.right(event.getValue());
}

@Override
public Either<IRepairEvent, Integer> 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());
}

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

}
@@ -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;
Expand All @@ -16,4 +18,12 @@ public Either<IValueEvent, Integer> fireValueEvent(Player player, int value) {
return Either.left(event);
}

@Override
public Either<IRepairEvent, Integer> fireRepairEvent(Player player, int value) {

RepairEvent event = new RepairEvent(player, value);
MinecraftForge.EVENT_BUS.post(event);
return Either.left(event);
}

}

0 comments on commit b78c8d8

Please sign in to comment.