Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

[1.16.5] Changing the use duration of an item


Recommended Posts

My item gives me a  random item whenever you right click. I tried to utilize the use() method. My issue is that I want to have the user press down the right click button for some time(5 seconds maybe??) and only once that is done should it give the item and repeat if its still held. I tried to use the getUseDuration() method but that doesn't work. I tried to take a look at how its done on some other items(like food items) but i can't figure it out. Can someone help be with this?

Edited by Skelyvelocirap
Link to comment
Share on other sites

3 hours ago, Skelyvelocirap said:

Can someone help be with this?

Within Item#use, you should call PlayerEntity#startUsingItem. This will start using the item when the item is used.

You can set the maximum number of ticks that the item can be used for with the return value of Item#getUseDuration.

While the item is being used, Item#onUseTick will be called every tick, and its integer parameter is the number of ticks left in the use duration. This is probably where you want to put your logic, since you mentioned that the player should be able to keep holding the item to keep the process going.

At some point, the player will release the item, which calls Item#releaseUsing. Its integer parameter is the number of ticks that the item was used for, so you could also put some logic there.

  • Like 1

Fancy 3D Graphing Calculator mod, with many different coordinate systems.

Lightweight 3D/2D position/vector transformations library, also with support for different coordinate systems.

Link to comment
Share on other sites

Posted (edited)

So that's how those work! Alright, thank you! Its now working perfectly! Although one last question. Item#use() needs you to return an Action result. I never really understood those and mostly just copied what others did. My guess is that its what is responsible for the hand movement when you right click(am I correct?). If it is, how exactly would I fix it so that it only does that once Item#onUseTick's tick parameter is 0?



EDIT: Alright so, I'm now using Item#finishUsingItem as there is no need to run my logic every tick. Hopefully this will reduce the already non-existent lag.

Edited by Skelyvelocirap
different method used
Link to comment
Share on other sites

30 minutes ago, Skelyvelocirap said:

My guess is that its what is responsible for the hand movement when you right click(am I correct?). If it is, how exactly would I fix it so that it only does that once Item#onUseTick's tick parameter is 0?

It is responsible for determining how the hand moves, but it also does a bit more.

Each ActionResult<T> has an ActionResultType and an object T. In the case of the ActionResult<ItemStack>, the ItemStack object of the returned ActionResult<ItemStack> is set as the held item.

Additionally, these ActionResultTypes dictate what happens after your Item's logic has been run. They are queried with the ActionResultType#shouldSwing and ActionResultType#consumesAction methods. The former is self-explanitory, while the latter dictates whether or not the click will be further processed.

For example, ActionResultType.SUCCESS both consumes the action and swings. This means that if you held an ender pearl in your offhand, and clicked with an item that returns a successful ActionResult<ItemStack>, the main item would swing, and no ender pearl would be thrown. ActionResultType.PASS doesn't swing or consume, so returning that would result in no animation of the main item, and an unblocked, thrown ender pearl. ActionResultType.CONSUME consumes the action, but doesn't swing, so that's probably what you want here. ActionResultType.FAIL behaves as PASS, but is used more in the context of Block placement, I think, and as a message to prevent a behaviour.

For your purposes, I would probably recommend returning CONSUME unless LIvingEntity#getUseItemRemainingTicks (this is the value passed into Item#onUseTick) fits your requirements (you could also use LivingEntity#getTicksUsingItem), in which case you would return SUCCESS.

It might also be helpful to return true from Item#useOnRelease, so that your item is used when released, in addition to initially.

Fancy 3D Graphing Calculator mod, with many different coordinate systems.

Lightweight 3D/2D position/vector transformations library, also with support for different coordinate systems.

Link to comment
Share on other sites

Alright. So ActionResult basically just tells Minecraft whether or not to swing the hand, along with whether or not it should process the item further(so inhibiting other items from doing their thing instead). And so I would simply check(in Item#use) if LivingEntity#getUseItemRemainingTicks is greater than 0, if it is than return Consume, or else success?

For the Item#useOnRelease, i dont think i will do that as what im trying to do is wait until the 5 seconds have passed. If i return true then the user could just spam right click and get it over with.

Link to comment
Share on other sites

4 minutes ago, Skelyvelocirap said:

Alright. So ActionResult basically just tells Minecraft whether or not to swing the hand, along with whether or not it should process the item further(so inhibiting other items from doing their thing instead).

Yup, that's about right.

4 minutes ago, Skelyvelocirap said:

And so I would simply check(in Item#use) if LivingEntity#getUseItemRemainingTicks is greater than 0, if it is than return Consume, or else success?

The exact details of when you should do what depend on how you want it to work and look. Ultimately, that's up to you, so you should try to set something up using these tools, experiment a bit, and figure out what produces the best result. It seems like you mostly understand what's going on here, so that ought to go fairly well.

Fancy 3D Graphing Calculator mod, with many different coordinate systems.

Lightweight 3D/2D position/vector transformations library, also with support for different coordinate systems.

Link to comment
Share on other sites

Oops, i didn't submit it.

Alright!

Ok, well it seems to work exactly how i want it to currently! Although, for some reason it still swings the players arms even though im returning ActionResult#consume(stack). Am i supposed to override that somewhere else as well?

Also, this isn't 100% related but what would I need to override to add an animation to the item? I don't mean how do I make an animation(don't quite know how but i should be able to find it on google), rather how do I make it play when the item is held down. I now know that for the items it would be the Item#onUseTick. Is there a similar method for the animation?

Link to comment
Share on other sites

22 minutes ago, Skelyvelocirap said:

Ok, well it seems to work exactly how i want it to currently! Although, for some reason it still swings the players arms even though im returning ActionResult#consume(stack). Am i supposed to override that somewhere else as well?

Please post your code, so that I can see what might be causing this (I won't be able to respond until tomorrow, though, since I need to sleep now).

22 minutes ago, Skelyvelocirap said:

Also, this isn't 100% related but what would I need to override to add an animation to the item? I don't mean how do I make an animation(don't quite know how but i should be able to find it on google), rather how do I make it play when the item is held down. I now know that for the items it would be the Item#onUseTick. Is there a similar method for the animation?

I've never done this before, so my knowledge is limited. Here is a link to the documentation on the topic, though, which seems fairly straightforward.

  • Like 1

Fancy 3D Graphing Calculator mod, with many different coordinate systems.

Lightweight 3D/2D position/vector transformations library, also with support for different coordinate systems.

Link to comment
Share on other sites

This is your problem.

The boolean parameter of ActionResult<T>#sidedSuccess is whether or not the game is running on the logical client, and so returns success on true, or consume on false. Your condition will usually be true, so a success is usually returned, which causes the item to swing. I don't think it's necessary to use sidedSuccess for this, but if you do, you should pass in World.isClientSide, or an equivalent. Regardless, the condition should be updated.

Fancy 3D Graphing Calculator mod, with many different coordinate systems.

Lightweight 3D/2D position/vector transformations library, also with support for different coordinate systems.

Link to comment
Share on other sites

Oops, I forgot I switched to ActionResult#sidedSuccess. And thank you for noticing it was backwards. Although this isn't really the problem. My item is ALWAYS doing that, even if the condition is false(the if statements before it). When the player is not in the correct liquids it should return ActionResult#consume(which it does) but it still swings the players arms. I know this for sure as you might notice that its logging the item in the pan(which i forgot to remove...).

Link to comment
Share on other sites

I've done some testing, and there are 3 things that cause the item to move.

The first is when you return a success, the item will swing. Updating the returns as previously discussed achieves the desired result in this context.

The second is when you return a consume, the item will bob if it is not in use. This means that if you try to use the pan while not able to do any panning, it will bob repeatedly (but not jarringly quickly). If you don't want this, you can return a pass, which has no visual effect.

The third is when you set the damage value every tick. This is what causes the glitchy-looking vibration, and it would seem you can fix it by setting the damage less frequently (once every 3 ticks eliminated all unwanted movement in my experiments).

  • Like 1

Fancy 3D Graphing Calculator mod, with many different coordinate systems.

Lightweight 3D/2D position/vector transformations library, also with support for different coordinate systems.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



  • Recently Browsing

    No registered users viewing this page.

  • Posts

    • Please stop capitalizing every word... You need to call NetworkHooks.openGui on the server to open your GUI. You also need to register your ScreenFactory on the client.
    • 1.12 is no longer supported on this forum. Please update to a modern version of Minecraft to receive support.
    • Server Version: 1.17.1 Server IP: enhanced.snorkycraft.com Discord:http://discord.snorkycraft.com/ Snorky Craft World is a playground I have designed for myself and friends to enjoy minecraft, with just some difficult enhancing and extra Contents, i'm an active player on my own server, grinding side by side with players. I do have a TLDR down at the bottom, if you're too lazy to read ;P. Showcase:https://www.youtube.com/watch?v=is7JoucsK0s A short 6 minutes video we have showcasing someone fun time in 2 lairs! a mini-world boss and a world boss. Things we have! ● KeepInvetory - You keep inventory but whenever you die, all your tools and armours lose durability. ● GriefPrevention - Well just your good ol' land claiming area to protect base from griefers ● mcMMO - Well, most of you might know what plugin is this, it's the kind of plugin that help you grow stronger the more you play! ● EliteMobs - Enhancing the mobs around you the more stronger you grow! and also allowing us to replace, create contents for you to enjoy! ● PlaytimeRewards Some Fun Features! Ridable Certain Animals, 6-Rows Enderchest!, Bonus ClaimBlocks, and a very spicy rank! ● Some Funzies Feautures: Editable armor stands! want to decorate your home and make it more lovely? you can with editable armorstands!, 6-Rows barrels! just some extra storage for your home! ● Some...lore related features: Some kind of strange disease have infected the cows... they attack!, Chicken are very feisty! Gameplay Changes ● Disabled Spawners AI, what's the point of spawners, they just ruins the game and there's nothing fun about it, also spawners aren't very useful in my server due to how it's setup. ● Removed The End world exploration! replaced it with the final boss stage for a very long grinding journey, one of our grinder has exactly 60+ Hours of playtime and he only reached Prestige 2! there are 10 Prestiges in total in order to have the power to defeat the new Ender Dragon Boss ● Progression changes, The end goal is not just getting to the ender dragon, is ranking up a custom rank system and farming custom items in order to grow stronger, strong enough to challenge very hard bosses! ● Monsters grows stronger the better equipped you are! and the more stronger you grow they harder challenges/dungeons/lairs you can fight! TLDR: You Join, You Lookaround, You Mine, You Build a House, You farm and gear up, Realized Diamond gearset or netherite gearset full set is so weak!, you start to farm small low level dungeons, you gain great gear, you defeat low level boss, you rankup, you get stronger gear, you repeat this progress so many times you have to prestiges too!, it's pretty fun! i been grinding 10-12 hours a day because once you get going it's very enjoyable.
    • The inputs are just a template- in this case it's two strings, but they can be ints, chars, etc. or none at all, depending if you need to initially send info across sides. I'd suggest reading Forge's documentation on packets first if you haven't used them before:  Forge Docs Networking You usually send the packet by invoking handler methods: ModPacketHandler.sendToServer(new C2SPacketForContainer(input1, input2)); Where the handler class has packet registration and the methods: The register methods are called in common setup.
    • Yeah the VillagerUtil was used in conjunction with the POI Forge registry, but you're right it's superfluous and I should stick with the simpler way. Thank you Ash
  • Topics

  • Who's Online (See full list)

×
×
  • Create New...

Important Information

By using this site, you agree to our Privacy Policy.