Use ItemStack instead of BlockItem specifically
Some checks failed
Java CI with Gradle / build (push) Has been cancelled

This commit is contained in:
Adam 2025-04-24 00:29:56 +01:00
parent 91dd7f9811
commit b11561b7c8
6 changed files with 83 additions and 43 deletions

View File

@ -8,7 +8,7 @@ yarn_mappings=1.21.5+build.1
loader_version=0.16.13 loader_version=0.16.13
# Mod Properties # Mod Properties
mod_version = 0.1.3 mod_version = 0.1.4
maven_group = xyz.twokilohertz maven_group = xyz.twokilohertz
archives_base_name = HotbarReplace archives_base_name = HotbarReplace

View File

@ -5,7 +5,6 @@ import net.minecraft.client.MinecraftClient;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.player.PlayerInventory; import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemPlacementContext;
import net.minecraft.screen.slot.SlotActionType; import net.minecraft.screen.slot.SlotActionType;
import net.minecraft.util.Hand; import net.minecraft.util.Hand;
@ -24,12 +23,11 @@ public class HotbarReplace implements ClientModInitializer {
@Override @Override
public void onInitializeClient() { public void onInitializeClient() {
LOGGER.info("HotbarReplace v0.1.3 initialised"); LOGGER.info("HotbarReplace v0.1.4 initialised");
} }
public static void tryReplaceSlot(ItemPlacementContext context, Item item) { public static void tryReplaceSlot(PlayerEntity player, Hand hand, Item item) {
// Return immediately if player is a spectator or in creative // Return immediately if player is a spectator or in creative
PlayerEntity player = context.getPlayer();
if (player == null || player.isSpectator() || player.getAbilities().creativeMode) if (player == null || player.isSpectator() || player.getAbilities().creativeMode)
return; return;
@ -58,7 +56,7 @@ public class HotbarReplace implements ClientModInitializer {
client.interactionManager.clickSlot(player.currentScreenHandler.syncId, i, GLFW.GLFW_MOUSE_BUTTON_1, client.interactionManager.clickSlot(player.currentScreenHandler.syncId, i, GLFW.GLFW_MOUSE_BUTTON_1,
SlotActionType.PICKUP, player); SlotActionType.PICKUP, player);
int slot = (context.getHand() == Hand.OFF_HAND ? 9 : inventory.getSelectedSlot()); int slot = (hand == Hand.OFF_HAND ? 9 : inventory.getSelectedSlot());
scheduler.schedule(() -> { scheduler.schedule(() -> {
client.interactionManager.clickSlot(player.currentScreenHandler.syncId, client.interactionManager.clickSlot(player.currentScreenHandler.syncId,

View File

@ -1,35 +0,0 @@
package xyz.twokilohertz.mixin;
import net.minecraft.item.BlockItem;
import net.minecraft.item.Item;
import net.minecraft.item.ItemPlacementContext;
import net.minecraft.util.ActionResult;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import xyz.twokilohertz.HotbarReplace;
@Mixin(BlockItem.class)
public class BlockItemMixin {
private Item lastPlacedItem;
@Inject(at = @At("HEAD"), method = "Lnet/minecraft/item/BlockItem;place(Lnet/minecraft/item/ItemPlacementContext;)Lnet/minecraft/util/ActionResult;")
private void BlockItem_place_head(ItemPlacementContext context, CallbackInfoReturnable<ActionResult> info) {
lastPlacedItem = context.getStack().getItem();
}
@Inject(at = @At("TAIL"), method = "Lnet/minecraft/item/BlockItem;place(Lnet/minecraft/item/ItemPlacementContext;)Lnet/minecraft/util/ActionResult;")
private void BlockItem_place_tail(ItemPlacementContext context, CallbackInfoReturnable<ActionResult> info) {
// Early return if the block place action would fail
if (info.getReturnValue() != ActionResult.SUCCESS)
return;
// Check if the stack is not empty, return if so
if (context.getStack().getCount() != 0)
return;
// Try to replace the hotbar slot
HotbarReplace.tryReplaceSlot(context, lastPlacedItem);
}
}

View File

@ -0,0 +1,77 @@
package xyz.twokilohertz.mixin;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemUsageContext;
import net.minecraft.util.ActionResult;
import net.minecraft.util.Hand;
import net.minecraft.world.World;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import xyz.twokilohertz.HotbarReplace;
@Mixin(ItemStack.class)
public class ItemStackMixin {
Item lastUsedItem = null;
@Inject(at = @At("HEAD"), method = "use")
private void ItemStack_use_HEAD(World world, PlayerEntity player, Hand hand,
CallbackInfoReturnable<ActionResult> info) {
lastUsedItem = player.getStackInHand(hand).getItem();
}
@Inject(at = @At("HEAD"), method = "useOnBlock")
private void ItemStack_useOnBlock_HEAD(ItemUsageContext context,
CallbackInfoReturnable<ActionResult> info) {
lastUsedItem = context.getPlayer().getStackInHand(context.getHand()).getItem();
}
@Inject(at = @At("HEAD"), method = "useOnEntity")
private void ItemStack_useOnEntity_HEAD(PlayerEntity player, LivingEntity entity, Hand hand,
CallbackInfoReturnable<ActionResult> info) {
lastUsedItem = player.getStackInHand(hand).getItem();
}
@Inject(at = @At("TAIL"), method = "use")
private void ItemStack_use_TAIL(World world, PlayerEntity player, Hand hand,
CallbackInfoReturnable<ActionResult> info) {
if (info.getReturnValue() != ActionResult.SUCCESS)
return;
if (player.getStackInHand(hand).getCount() != 0)
return;
HotbarReplace.tryReplaceSlot(player, hand, lastUsedItem);
}
@Inject(at = @At("TAIL"), method = "useOnBlock")
private void ItemStack_useOnBlock_TAIL(ItemUsageContext context, CallbackInfoReturnable<ActionResult> info) {
if (info.getReturnValue() != ActionResult.SUCCESS)
return;
PlayerEntity player = context.getPlayer();
Hand hand = context.getHand();
if (player.getStackInHand(hand).getCount() != 0)
return;
HotbarReplace.tryReplaceSlot(player, hand, lastUsedItem);
}
@Inject(at = @At("TAIL"), method = "useOnEntity")
private void ItemStack_useOnEntity_TAIL(PlayerEntity player, LivingEntity entity, Hand hand,
CallbackInfoReturnable<ActionResult> info) {
if (info.getReturnValue() != ActionResult.SUCCESS)
return;
if (player.getStackInHand(hand).getCount() != 0)
return;
HotbarReplace.tryReplaceSlot(player, hand, lastUsedItem);
}
}

View File

@ -1,7 +1,7 @@
{ {
"schemaVersion": 1, "schemaVersion": 1,
"id": "hotbarreplace", "id": "hotbarreplace",
"version": "0.1.3", "version": "0.1.4",
"name": "HotbarReplace", "name": "HotbarReplace",
"description": "Replace blocks in your hotbar when you run out with blocks from your inventory", "description": "Replace blocks in your hotbar when you run out with blocks from your inventory",
"authors": [ "authors": [

View File

@ -4,7 +4,7 @@
"compatibilityLevel": "JAVA_21", "compatibilityLevel": "JAVA_21",
"mixins": [], "mixins": [],
"client": [ "client": [
"BlockItemMixin" "ItemStackMixin"
], ],
"injectors": { "injectors": {
"defaultRequire": 1 "defaultRequire": 1