From 9a58332bf63dbd38171cca4460f437d55c10af03 Mon Sep 17 00:00:00 2001 From: WinDanesz <31292708+windanesz@users.noreply.github.com> Date: Mon, 11 May 2026 02:00:24 +0200 Subject: [PATCH] feat: Sneak clicking items place them in bookshelves. Sneak clicking a bookshelf with an empty hand removes items from the bookshelf --- .../wizardry/block/BlockBookshelf.java | 34 ++++++++++++++++++- .../wizardry/item/ItemArcaneTome.java | 21 ++++++++++++ .../wizardry/item/ItemBlankScroll.java | 21 ++++++++++++ .../item/ItemIdentificationScroll.java | 18 ++++++++++ .../electroblob/wizardry/item/ItemScroll.java | 18 ++++++++++ .../wizardry/item/ItemSpellBook.java | 19 +++++++++++ .../wizardry/item/ItemWandUpgrade.java | 21 ++++++++++++ .../wizardry/item/ItemWizardHandbook.java | 18 ++++++++++ 8 files changed, 169 insertions(+), 1 deletion(-) diff --git a/src/main/java/electroblob/wizardry/block/BlockBookshelf.java b/src/main/java/electroblob/wizardry/block/BlockBookshelf.java index 6eb3b714..68f3001f 100644 --- a/src/main/java/electroblob/wizardry/block/BlockBookshelf.java +++ b/src/main/java/electroblob/wizardry/block/BlockBookshelf.java @@ -4,6 +4,7 @@ import com.google.common.collect.ImmutableList; import electroblob.wizardry.Settings; import electroblob.wizardry.Wizardry; import electroblob.wizardry.WizardryGuiHandler; +import electroblob.wizardry.inventory.ContainerBookshelf; import electroblob.wizardry.registry.WizardryItems; import electroblob.wizardry.registry.WizardryTabs; import electroblob.wizardry.tileentity.TileEntityBookshelf; @@ -22,6 +23,7 @@ import net.minecraft.init.Items; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.InventoryHelper; import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.*; import net.minecraft.util.math.BlockPos; @@ -162,7 +164,37 @@ public class BlockBookshelf extends BlockHorizontal implements ITileEntityProvid TileEntity tileEntity = world.getTileEntity(pos); - if(tileEntity == null || player.isSneaking()){ + if(tileEntity == null){ + return false; + } + + if(player.isSneaking()){ + ItemStack heldItem = player.getHeldItem(hand); + if(heldItem.isEmpty() && tileEntity instanceof TileEntityBookshelf){ + if(!world.isRemote){ + TileEntityBookshelf bookshelf = (TileEntityBookshelf)tileEntity; + for(int i = 0; i < bookshelf.getSizeInventory(); i++){ + ItemStack stack = bookshelf.getStackInSlot(i); + if(!stack.isEmpty()){ + player.addItemStackToInventory(stack.copy()); + bookshelf.setInventorySlotContents(i, ItemStack.EMPTY); + break; + } + } + } + return true; + }else if(!heldItem.isEmpty() && ContainerBookshelf.isBook(heldItem) && tileEntity instanceof TileEntityBookshelf){ + if(!world.isRemote){ + TileEntityBookshelf bookshelf = (TileEntityBookshelf)tileEntity; + for(int i = 0; i < bookshelf.getSizeInventory(); i++){ + if(bookshelf.getStackInSlot(i).isEmpty()){ + bookshelf.setInventorySlotContents(i, heldItem.splitStack(1)); + break; + } + } + } + return true; + } return false; } diff --git a/src/main/java/electroblob/wizardry/item/ItemArcaneTome.java b/src/main/java/electroblob/wizardry/item/ItemArcaneTome.java index 54f4e620..5c143fc1 100644 --- a/src/main/java/electroblob/wizardry/item/ItemArcaneTome.java +++ b/src/main/java/electroblob/wizardry/item/ItemArcaneTome.java @@ -1,13 +1,20 @@ package electroblob.wizardry.item; import electroblob.wizardry.Wizardry; +import electroblob.wizardry.block.BlockBookshelf; import electroblob.wizardry.constants.Tier; import electroblob.wizardry.registry.WizardryTabs; import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumRarity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumActionResult; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; import net.minecraft.util.NonNullList; +import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -51,6 +58,20 @@ public class ItemArcaneTome extends Item { return EnumRarity.COMMON; } + @Override + public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, + EnumFacing facing, float hitX, float hitY, float hitZ){ + if(player.isSneaking()){ + IBlockState state = world.getBlockState(pos); + if(state.getBlock() instanceof BlockBookshelf){ + if(state.getBlock().onBlockActivated(world, pos, state, player, hand, facing, hitX, hitY, hitZ)){ + return EnumActionResult.SUCCESS; + } + } + } + return EnumActionResult.PASS; + } + @SideOnly(Side.CLIENT) @Override public void addInformation(ItemStack stack, World world, List tooltip, net.minecraft.client.util.ITooltipFlag showAdvanced){ diff --git a/src/main/java/electroblob/wizardry/item/ItemBlankScroll.java b/src/main/java/electroblob/wizardry/item/ItemBlankScroll.java index 3c88cb62..a4091bb8 100644 --- a/src/main/java/electroblob/wizardry/item/ItemBlankScroll.java +++ b/src/main/java/electroblob/wizardry/item/ItemBlankScroll.java @@ -1,6 +1,7 @@ package electroblob.wizardry.item; import electroblob.wizardry.Wizardry; +import electroblob.wizardry.block.BlockBookshelf; import electroblob.wizardry.constants.Constants; import electroblob.wizardry.data.WizardData; import electroblob.wizardry.registry.Spells; @@ -8,12 +9,18 @@ import electroblob.wizardry.registry.WizardryItems; import electroblob.wizardry.registry.WizardryTabs; import electroblob.wizardry.spell.Spell; import electroblob.wizardry.util.SpellProperties; +import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Slot; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumActionResult; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; +import net.minecraft.world.World; public class ItemBlankScroll extends Item implements IWorkbenchItem { @@ -67,4 +74,18 @@ public class ItemBlankScroll extends Item implements IWorkbenchItem { return false; } + @Override + public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, + EnumFacing facing, float hitX, float hitY, float hitZ){ + if(player.isSneaking()){ + IBlockState state = world.getBlockState(pos); + if(state.getBlock() instanceof BlockBookshelf){ + if(state.getBlock().onBlockActivated(world, pos, state, player, hand, facing, hitX, hitY, hitZ)){ + return EnumActionResult.SUCCESS; + } + } + } + return EnumActionResult.PASS; + } + } diff --git a/src/main/java/electroblob/wizardry/item/ItemIdentificationScroll.java b/src/main/java/electroblob/wizardry/item/ItemIdentificationScroll.java index 9801d6e8..84f1de58 100644 --- a/src/main/java/electroblob/wizardry/item/ItemIdentificationScroll.java +++ b/src/main/java/electroblob/wizardry/item/ItemIdentificationScroll.java @@ -1,19 +1,23 @@ package electroblob.wizardry.item; import electroblob.wizardry.Wizardry; +import electroblob.wizardry.block.BlockBookshelf; import electroblob.wizardry.data.WizardData; import electroblob.wizardry.event.DiscoverSpellEvent; import electroblob.wizardry.registry.WizardrySounds; import electroblob.wizardry.registry.WizardryTabs; import electroblob.wizardry.spell.Spell; import electroblob.wizardry.util.InventoryUtils; +import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumRarity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.ActionResult; import net.minecraft.util.EnumActionResult; +import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; +import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; @@ -47,6 +51,20 @@ public class ItemIdentificationScroll extends Item { Wizardry.proxy.addMultiLineDescription(tooltip, "item." + this.getRegistryName() + ".desc"); } + @Override + public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, + EnumFacing facing, float hitX, float hitY, float hitZ){ + if(player.isSneaking()){ + IBlockState state = world.getBlockState(pos); + if(state.getBlock() instanceof BlockBookshelf){ + if(state.getBlock().onBlockActivated(world, pos, state, player, hand, facing, hitX, hitY, hitZ)){ + return EnumActionResult.SUCCESS; + } + } + } + return EnumActionResult.PASS; + } + @Override public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand){ diff --git a/src/main/java/electroblob/wizardry/item/ItemScroll.java b/src/main/java/electroblob/wizardry/item/ItemScroll.java index f0088bde..ea69b4a3 100644 --- a/src/main/java/electroblob/wizardry/item/ItemScroll.java +++ b/src/main/java/electroblob/wizardry/item/ItemScroll.java @@ -1,6 +1,7 @@ package electroblob.wizardry.item; import electroblob.wizardry.Wizardry; +import electroblob.wizardry.block.BlockBookshelf; import electroblob.wizardry.data.WizardData; import electroblob.wizardry.event.SpellCastEvent; import electroblob.wizardry.event.SpellCastEvent.Source; @@ -9,6 +10,7 @@ import electroblob.wizardry.packet.WizardryPacketHandler; import electroblob.wizardry.registry.WizardryTabs; import electroblob.wizardry.spell.Spell; import electroblob.wizardry.util.SpellModifiers; +import net.minecraft.block.state.IBlockState; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; @@ -17,8 +19,10 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.ActionResult; import net.minecraft.util.EnumActionResult; +import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.NonNullList; +import net.minecraft.util.math.BlockPos; import net.minecraft.util.ResourceLocation; import net.minecraft.util.text.Style; import net.minecraft.util.text.TextFormatting; @@ -122,6 +126,20 @@ public class ItemScroll extends Item implements ISpellCastingItem, IWorkbenchIte return CASTING_TIME; } + @Override + public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, + EnumFacing facing, float hitX, float hitY, float hitZ){ + if(player.isSneaking()){ + IBlockState state = world.getBlockState(pos); + if(state.getBlock() instanceof BlockBookshelf){ + if(state.getBlock().onBlockActivated(world, pos, state, player, hand, facing, hitX, hitY, hitZ)){ + return EnumActionResult.SUCCESS; + } + } + } + return EnumActionResult.PASS; + } + @Override public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand){ diff --git a/src/main/java/electroblob/wizardry/item/ItemSpellBook.java b/src/main/java/electroblob/wizardry/item/ItemSpellBook.java index b28ceda0..ed5ceab5 100644 --- a/src/main/java/electroblob/wizardry/item/ItemSpellBook.java +++ b/src/main/java/electroblob/wizardry/item/ItemSpellBook.java @@ -1,6 +1,7 @@ package electroblob.wizardry.item; import com.google.common.collect.ImmutableMap; +import electroblob.wizardry.block.BlockBookshelf; import electroblob.wizardry.Wizardry; import electroblob.wizardry.WizardryGuiHandler; import electroblob.wizardry.constants.Tier; @@ -14,9 +15,12 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.ActionResult; import net.minecraft.util.EnumActionResult; +import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.NonNullList; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.block.state.IBlockState; import net.minecraft.util.text.Style; import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; @@ -58,6 +62,21 @@ public class ItemSpellBook extends Item { } } + @Override + public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, + EnumFacing facing, float hitX, float hitY, float hitZ){ + // Minecraft skips onBlockActivated when sneaking with a non-empty hand, so we handle it here + if(player.isSneaking()){ + IBlockState state = world.getBlockState(pos); + if(state.getBlock() instanceof BlockBookshelf){ + if(state.getBlock().onBlockActivated(world, pos, state, player, hand, facing, hitX, hitY, hitZ)){ + return EnumActionResult.SUCCESS; + } + } + } + return EnumActionResult.PASS; + } + @Override public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand){ ItemStack stack = player.getHeldItem(hand); diff --git a/src/main/java/electroblob/wizardry/item/ItemWandUpgrade.java b/src/main/java/electroblob/wizardry/item/ItemWandUpgrade.java index c9766b10..47a1f64b 100644 --- a/src/main/java/electroblob/wizardry/item/ItemWandUpgrade.java +++ b/src/main/java/electroblob/wizardry/item/ItemWandUpgrade.java @@ -1,10 +1,17 @@ package electroblob.wizardry.item; import electroblob.wizardry.Wizardry; +import electroblob.wizardry.block.BlockBookshelf; import electroblob.wizardry.registry.WizardryTabs; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumRarity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumActionResult; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; +import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -24,6 +31,20 @@ public class ItemWandUpgrade extends Item { return EnumRarity.UNCOMMON; } + @Override + public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, + EnumFacing facing, float hitX, float hitY, float hitZ){ + if(player.isSneaking()){ + IBlockState state = world.getBlockState(pos); + if(state.getBlock() instanceof BlockBookshelf){ + if(state.getBlock().onBlockActivated(world, pos, state, player, hand, facing, hitX, hitY, hitZ)){ + return EnumActionResult.SUCCESS; + } + } + } + return EnumActionResult.PASS; + } + @Override @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, @Nullable World world, List tooltip, net.minecraft.client.util.ITooltipFlag flag) { diff --git a/src/main/java/electroblob/wizardry/item/ItemWizardHandbook.java b/src/main/java/electroblob/wizardry/item/ItemWizardHandbook.java index ffe3d8a1..a0d3acca 100644 --- a/src/main/java/electroblob/wizardry/item/ItemWizardHandbook.java +++ b/src/main/java/electroblob/wizardry/item/ItemWizardHandbook.java @@ -2,13 +2,17 @@ package electroblob.wizardry.item; import electroblob.wizardry.Wizardry; import electroblob.wizardry.WizardryGuiHandler; +import electroblob.wizardry.block.BlockBookshelf; import electroblob.wizardry.registry.WizardryTabs; +import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.ActionResult; import net.minecraft.util.EnumActionResult; +import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; +import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.Style; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.util.text.TextFormatting; @@ -34,6 +38,20 @@ public class ItemWizardHandbook extends Item { new Style().setColor(TextFormatting.GRAY), AUTHOR)); } + @Override + public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, + EnumFacing facing, float hitX, float hitY, float hitZ){ + if(player.isSneaking()){ + IBlockState state = world.getBlockState(pos); + if(state.getBlock() instanceof BlockBookshelf){ + if(state.getBlock().onBlockActivated(world, pos, state, player, hand, facing, hitX, hitY, hitZ)){ + return EnumActionResult.SUCCESS; + } + } + } + return EnumActionResult.PASS; + } + @Override public ActionResult onItemRightClick(World world, EntityPlayer player, EnumHand hand){ ItemStack stack = player.getHeldItem(hand);