diff --git a/CHANGELOG.md b/CHANGELOG.md index e88a291..5d017f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,8 @@ All notable changes to this project will be documented in this file. ## Unreleased -- / + +- added player context to the empower event ## [0.1.0] - 2024-10-23 diff --git a/src/main/java/com/almostreliable/kubeaa/event/EmpowerEvent.java b/src/main/java/com/almostreliable/kubeaa/event/EmpowerEvent.java index 41a566a..74f9c39 100644 --- a/src/main/java/com/almostreliable/kubeaa/event/EmpowerEvent.java +++ b/src/main/java/com/almostreliable/kubeaa/event/EmpowerEvent.java @@ -5,8 +5,13 @@ import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.crafting.RecipeHolder; import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.Nullable; + +import java.util.UUID; public class EmpowerEvent implements KubeEvent { @@ -14,12 +19,16 @@ public class EmpowerEvent implements KubeEvent { private final BlockPos pos; private final BlockState state; private final RecipeHolder recipe; + @Nullable private final UUID playerId; - public EmpowerEvent(ServerLevel level, BlockPos pos, BlockState state, RecipeHolder recipe) { + public EmpowerEvent( + ServerLevel level, BlockPos pos, BlockState state, RecipeHolder recipe, @Nullable UUID playerId + ) { this.level = level; this.pos = pos; this.state = state; this.recipe = recipe; + this.playerId = playerId; } public ServerLevel getLevel() { @@ -41,4 +50,10 @@ public ResourceLocation getRecipeId() { public EmpowererRecipe getRecipe() { return recipe.value(); } + + @Nullable + public ServerPlayer getPlayer() { + Player player = playerId == null ? null : level.getPlayerByUUID(playerId); + return player instanceof ServerPlayer serverPlayer ? serverPlayer : null; + } } diff --git a/src/main/java/com/almostreliable/kubeaa/extension/TileEntityEmpowererExtension.java b/src/main/java/com/almostreliable/kubeaa/extension/TileEntityEmpowererExtension.java new file mode 100644 index 0000000..e0f8eb2 --- /dev/null +++ b/src/main/java/com/almostreliable/kubeaa/extension/TileEntityEmpowererExtension.java @@ -0,0 +1,8 @@ +package com.almostreliable.kubeaa.extension; + +import java.util.UUID; + +public interface TileEntityEmpowererExtension { + + void kjsaa$setPlayer(UUID uuid); +} diff --git a/src/main/java/com/almostreliable/kubeaa/extension/package-info.java b/src/main/java/com/almostreliable/kubeaa/extension/package-info.java new file mode 100644 index 0000000..9402584 --- /dev/null +++ b/src/main/java/com/almostreliable/kubeaa/extension/package-info.java @@ -0,0 +1,4 @@ +@NonnullDefault +package com.almostreliable.kubeaa.extension; + +import org.lwjgl.system.NonnullDefault; diff --git a/src/main/java/com/almostreliable/kubeaa/mixin/BlockDisplayStandMixin.java b/src/main/java/com/almostreliable/kubeaa/mixin/BlockDisplayStandMixin.java new file mode 100644 index 0000000..4c2273a --- /dev/null +++ b/src/main/java/com/almostreliable/kubeaa/mixin/BlockDisplayStandMixin.java @@ -0,0 +1,38 @@ +package com.almostreliable.kubeaa.mixin; + +import com.almostreliable.kubeaa.extension.TileEntityEmpowererExtension; +import com.llamalad7.mixinextras.sugar.Local; +import de.ellpeck.actuallyadditions.mod.blocks.BlockDisplayStand; +import de.ellpeck.actuallyadditions.mod.tile.TileEntityInventoryBase; +import net.minecraft.core.BlockPos; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.ItemInteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import org.spongepowered.asm.mixin.Final; +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.callback.CallbackInfoReturnable; + +@Mixin(BlockDisplayStand.class) +public class BlockDisplayStandMixin { + + @Shadow + @Final + private boolean isEmpowerer; + + @Inject(method = "useItemOn", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Player;isCreative()Z")) + private void onItemInsert( + ItemStack stack, BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, + BlockHitResult hitResult, CallbackInfoReturnable cir, + @Local TileEntityInventoryBase blockEntity + ) { + if (!isEmpowerer) return; + ((TileEntityEmpowererExtension) blockEntity).kjsaa$setPlayer(player.getUUID()); + } +} diff --git a/src/main/java/com/almostreliable/kubeaa/mixin/TileEntityEmpowererMixin.java b/src/main/java/com/almostreliable/kubeaa/mixin/TileEntityEmpowererMixin.java index b2714b0..b9c7a93 100644 --- a/src/main/java/com/almostreliable/kubeaa/mixin/TileEntityEmpowererMixin.java +++ b/src/main/java/com/almostreliable/kubeaa/mixin/TileEntityEmpowererMixin.java @@ -2,6 +2,7 @@ import com.almostreliable.kubeaa.KubePlugin; import com.almostreliable.kubeaa.event.EmpowerEvent; +import com.almostreliable.kubeaa.extension.TileEntityEmpowererExtension; import com.llamalad7.mixinextras.sugar.Local; import de.ellpeck.actuallyadditions.mod.crafting.EmpowererRecipe; import de.ellpeck.actuallyadditions.mod.tile.TileEntityEmpowerer; @@ -11,20 +12,38 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import java.lang.ref.WeakReference; +import java.util.UUID; + @Mixin(TileEntityEmpowerer.class) -public abstract class TileEntityEmpowererMixin { +public abstract class TileEntityEmpowererMixin implements TileEntityEmpowererExtension { + + @Unique + @Nullable + private WeakReference kjsaa$player; @Inject(method = "serverTick", at = @At(value = "INVOKE", target = "Lde/ellpeck/actuallyadditions/mod/util/ItemStackHandlerAA;setStackInSlot(ILnet/minecraft/world/item/ItemStack;)V", shift = At.Shift.AFTER)) private static void onResultSet( Level level, BlockPos pos, BlockState state, T t, CallbackInfo ci, @Local RecipeHolder holder ) { - if (level instanceof ServerLevel serverLevel) { - KubePlugin.Events.EMPOWER.post(new EmpowerEvent(serverLevel, pos, state, holder)); + if (level instanceof ServerLevel serverLevel && t instanceof TileEntityEmpowerer blockEntity) { + var be = (TileEntityEmpowererMixin) (Object) blockEntity; + UUID uuid = be.kjsaa$player == null ? null : be.kjsaa$player.get(); + KubePlugin.Events.EMPOWER.post(new EmpowerEvent(serverLevel, pos, state, holder, uuid)); + be.kjsaa$player = null; } } + + @Override + @Unique + public void kjsaa$setPlayer(UUID uuid) { + kjsaa$player = new WeakReference<>(uuid); + } } diff --git a/src/main/resources/kubejs_actuallyadditions.mixins.json b/src/main/resources/kubejs_actuallyadditions.mixins.json index eb9139a..fcddd14 100644 --- a/src/main/resources/kubejs_actuallyadditions.mixins.json +++ b/src/main/resources/kubejs_actuallyadditions.mixins.json @@ -4,6 +4,7 @@ "package": "com.almostreliable.kubeaa.mixin", "compatibilityLevel": "JAVA_17", "mixins": [ + "BlockDisplayStandMixin", "CrushingRecipeSerializerAccessor", "TileEntityEmpowererMixin" ],