diff --git a/src/main/java/me/youhavetrouble/quickerstacker/QuickerStacker.java b/src/main/java/me/youhavetrouble/quickerstacker/QuickerStacker.java index 0336986..be7bbb7 100644 --- a/src/main/java/me/youhavetrouble/quickerstacker/QuickerStacker.java +++ b/src/main/java/me/youhavetrouble/quickerstacker/QuickerStacker.java @@ -1,11 +1,23 @@ package me.youhavetrouble.quickerstacker; +import com.hypixel.hytale.component.Ref; +import com.hypixel.hytale.math.vector.Vector3i; +import com.hypixel.hytale.protocol.InteractionType; +import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType; +import com.hypixel.hytale.server.core.entity.InteractionContext; +import com.hypixel.hytale.server.core.entity.InteractionManager; +import com.hypixel.hytale.server.core.entity.entities.Player; +import com.hypixel.hytale.server.core.event.events.ecs.UseBlockEvent; +import com.hypixel.hytale.server.core.modules.interaction.InteractionSimulationHandler; import com.hypixel.hytale.server.core.modules.interaction.interaction.config.Interaction; import com.hypixel.hytale.server.core.plugin.JavaPlugin; import com.hypixel.hytale.server.core.plugin.JavaPluginInit; +import com.hypixel.hytale.server.core.universe.PlayerRef; +import com.hypixel.hytale.server.core.universe.world.World; import me.youhavetrouble.quickerstacker.interaction.QuickStackToChestInteraction; import org.checkerframework.checker.nullness.compatqual.NonNullDecl; +import com.hypixel.hytale.server.core.universe.world.storage.EntityStore; public class QuickerStacker extends JavaPlugin { @@ -18,4 +30,25 @@ public class QuickerStacker extends JavaPlugin { this.getCodecRegistry(Interaction.CODEC).register("Yht_QuickerStacker_QuickStackToChest", QuickStackToChestInteraction.class, QuickStackToChestInteraction.CODEC); } + /** + * Check if the player can interact with the block at the given position + * @param ref Player ref + * @param world World + * @param x x + * @param y y + * @param z z + * @return true if the player can interact with the block, false otherwise + */ + public static boolean canInteractWithBlock(Ref ref, World world, int x, int y, int z){ + Player player = ref.getStore().getComponent(ref, Player.getComponentType()); + if (player == null) return false; + PlayerRef playerRef = ref.getStore().getComponent(ref, PlayerRef.getComponentType()); + InteractionManager interactionManager = new InteractionManager(player, playerRef, new InteractionSimulationHandler()); + BlockType blockType = world.getBlockType(x, y, z); + if (blockType == null) return false; + var event = new UseBlockEvent.Pre(InteractionType.Use, InteractionContext.forProxyEntity(interactionManager, player, ref), new Vector3i(x, y, z), blockType); + ref.getStore().invoke(ref, event); + return !event.isCancelled(); + } + } diff --git a/src/main/java/me/youhavetrouble/quickerstacker/interaction/QuickStackToChestInteraction.java b/src/main/java/me/youhavetrouble/quickerstacker/interaction/QuickStackToChestInteraction.java index c7a8a3b..9e89418 100644 --- a/src/main/java/me/youhavetrouble/quickerstacker/interaction/QuickStackToChestInteraction.java +++ b/src/main/java/me/youhavetrouble/quickerstacker/interaction/QuickStackToChestInteraction.java @@ -16,11 +16,13 @@ import com.hypixel.hytale.server.core.inventory.transaction.ListTransaction; import com.hypixel.hytale.server.core.inventory.transaction.MoveTransaction; import com.hypixel.hytale.server.core.modules.interaction.interaction.CooldownHandler; import com.hypixel.hytale.server.core.modules.interaction.interaction.config.client.SimpleBlockInteraction; +import com.hypixel.hytale.server.core.universe.PlayerRef; import com.hypixel.hytale.server.core.universe.world.World; import com.hypixel.hytale.server.core.universe.world.chunk.WorldChunk; import com.hypixel.hytale.server.core.universe.world.meta.state.ItemContainerState; import com.hypixel.hytale.server.core.universe.world.storage.EntityStore; import com.hypixel.hytale.server.core.util.NotificationUtil; +import me.youhavetrouble.quickerstacker.QuickerStacker; import org.checkerframework.checker.nullness.compatqual.NonNullDecl; import org.checkerframework.checker.nullness.compatqual.NullableDecl; @@ -37,6 +39,7 @@ public class QuickStackToChestInteraction extends SimpleBlockInteraction { if (player == null) return; BlockPosition targetBlockPosition = interactionContext.getTargetBlock(); if (targetBlockPosition == null) return; + if (!QuickerStacker.canInteractWithBlock(ref, world, targetBlockPosition.x, targetBlockPosition.y, targetBlockPosition.z)) return; WorldChunk chunk = world.getChunk(ChunkUtil.indexChunkFromBlock(targetBlockPosition.x, targetBlockPosition.z)); if (chunk == null) return; var blockState = chunk.getState(targetBlockPosition.x, targetBlockPosition.y, targetBlockPosition.z); @@ -45,7 +48,9 @@ public class QuickStackToChestInteraction extends SimpleBlockInteraction { if (playerInventory == null) return; ListTransaction> transaction = playerInventory.getCombinedHotbarFirst().quickStackTo(containerState.getItemContainer()); if (transaction.size() <= 0) return; - NotificationUtil.sendNotification(player.getPlayerRef().getPacketHandler(), "Quick stacked "+ transaction.size() +" stacks"); + PlayerRef playerRef = ref.getStore().getComponent(ref, PlayerRef.getComponentType()); + if (playerRef == null) return; + NotificationUtil.sendNotification(playerRef.getPacketHandler(), "Quick stacked "+ transaction.size() +" stacks"); } @Override