Posted July 5, 20232 yr When I hold RMB while holding a Stick (minecraft:stick) and looking at the top side of a #minecraft:planks block, I want minecraft:smoke particles to spawn on top of the block (kinda like a minecraft:fire block was on top); after a certain amount of time, I want it to remove a Stick (minecraft:stick) from my selected slot and add a Stick on Fire (chem:stick_on_fire) to my inventory. Here's my StickItem.java: package com.nutronstar45.chem.item.custom; import com.nutronstar45.chem.item.ModItems; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; import net.minecraft.tags.BlockTags; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.HitResult; public class StickItem extends Item { public StickItem(Properties properties) { super(properties); } @Override public InteractionResult useOn(UseOnContext context) { Player player = context.getPlayer(); Level level = context.getLevel(); InteractionHand hand = context.getHand(); HitResult targetedBlock = player.pick(5.0D, 0.0F, false); Direction direction = context.getClickedFace(); BlockPos blockPos = context.getClickedPos(); BlockState blockState = level.getBlockState(blockPos); if (!level.isClientSide() && hand == InteractionHand.MAIN_HAND && targetedBlock.getType() == HitResult.Type.BLOCK && direction.getName() == "up" && blockState.is(BlockTags.PLANKS)) { player.getItemInHand(hand).shrink(1); player.addItem(new ItemStack(ModItems.STICK_ON_FIRE.get())); player.sendSystemMessage(Component.literal("useOn")); return InteractionResult.SUCCESS; } return InteractionResult.PASS; } } When I hold RMB while holding a Stick (minecraft:stick) and looking at the top side of a #minecraft:planks block, it instantly removes a Stick (minecraft:stick) from my selected slot and adds a Stick on Fire (chem:stick_on_fire) to my inventory, and there is no particle either. Edited July 6, 20232 yr by NutronStar45 Solved
July 6, 20232 yr Author I solved the problem, but I think there is a better solution. StickItem.java: package com.nutronstar45.chem.item.custom; import com.nutronstar45.chem.block.ModBlocks; import com.nutronstar45.chem.item.ModItems; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.tags.BlockTags; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; public class StickItem extends BlockItem { private static final int START_FIRE_TIME = 30; private int ticksUntilFire; public StickItem(Properties properties) { super(ModBlocks.STICK.get(), properties); } private boolean targetingPlanks(Player player) { BlockHitResult targetedBlock = (BlockHitResult)player.pick(5.0D, 0.0F, false); Direction direction = targetedBlock.getDirection(); BlockPos blockPos = targetedBlock.getBlockPos(); BlockState blockState = player.getLevel().getBlockState(blockPos); return targetedBlock.getType() == HitResult.Type.BLOCK && direction.getName() == "up" && blockState.is(BlockTags.PLANKS); } // Fires when a player is holding a Stick public void tick(Player player, boolean isKeyUseDown) { if (!player.getLevel().isClientSide()) { if (isKeyUseDown && targetingPlanks(player)) { if (ticksUntilFire > 0) { --ticksUntilFire; } else { startFire(player); ticksUntilFire = START_FIRE_TIME; } } else { ticksUntilFire = START_FIRE_TIME; } } } private void startFire(Player player) { player.getItemInHand(InteractionHand.MAIN_HAND).shrink(1); player.addItem(new ItemStack(ModItems.STICK_ON_FIRE.get())); } } ModEvents.java: package com.nutronstar45.chem.event; import com.nutronstar45.chem.Chem; import com.nutronstar45.chem.item.custom.StickItem; import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; import net.minecraftforge.event.TickEvent.Phase; import net.minecraftforge.event.TickEvent.PlayerTickEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; @Mod.EventBusSubscriber(modid = Chem.MODID) public class ModEvents { @SubscribeEvent public static void onPlayerTick(PlayerTickEvent event) { Minecraft instance = Minecraft.getInstance(); KeyMapping keyUse = instance.options.keyUse; if (event.player.getMainHandItem().getItem() instanceof StickItem) { StickItem stickItem = (StickItem)event.player.getMainHandItem().getItem(); if (event.phase == Phase.START) { stickItem.tick(event.player, keyUse.isDown()); } } } }
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.