Skip to content

Commit

Permalink
add player context to empower event
Browse files Browse the repository at this point in the history
  • Loading branch information
rlnt committed Oct 24, 2024
1 parent 799a148 commit 8b31946
Show file tree
Hide file tree
Showing 7 changed files with 91 additions and 5 deletions.
3 changes: 2 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
17 changes: 16 additions & 1 deletion src/main/java/com/almostreliable/kubeaa/event/EmpowerEvent.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,30 @@
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 {

private final ServerLevel level;
private final BlockPos pos;
private final BlockState state;
private final RecipeHolder<EmpowererRecipe> recipe;
@Nullable private final UUID playerId;

public EmpowerEvent(ServerLevel level, BlockPos pos, BlockState state, RecipeHolder<EmpowererRecipe> recipe) {
public EmpowerEvent(
ServerLevel level, BlockPos pos, BlockState state, RecipeHolder<EmpowererRecipe> recipe, @Nullable UUID playerId
) {
this.level = level;
this.pos = pos;
this.state = state;
this.recipe = recipe;
this.playerId = playerId;
}

public ServerLevel getLevel() {
Expand All @@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.almostreliable.kubeaa.extension;

import java.util.UUID;

public interface TileEntityEmpowererExtension {

void kjsaa$setPlayer(UUID uuid);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
@NonnullDefault
package com.almostreliable.kubeaa.extension;

import org.lwjgl.system.NonnullDefault;
Original file line number Diff line number Diff line change
@@ -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<ItemInteractionResult> cir,
@Local TileEntityInventoryBase blockEntity
) {
if (!isEmpowerer) return;
((TileEntityEmpowererExtension) blockEntity).kjsaa$setPlayer(player.getUUID());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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<UUID> 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 <T extends BlockEntity> void onResultSet(
Level level, BlockPos pos, BlockState state, T t, CallbackInfo ci, @Local RecipeHolder<EmpowererRecipe> 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);
}
}
1 change: 1 addition & 0 deletions src/main/resources/kubejs_actuallyadditions.mixins.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
"package": "com.almostreliable.kubeaa.mixin",
"compatibilityLevel": "JAVA_17",
"mixins": [
"BlockDisplayStandMixin",
"CrushingRecipeSerializerAccessor",
"TileEntityEmpowererMixin"
],
Expand Down

0 comments on commit 8b31946

Please sign in to comment.