Jump to content

Recommended Posts

Posted (edited)

I'm using the AnvilUpdateEvent to create some custom anvil behavior when an item of mine is in the left slot of the anvil. It works perfectly! However, when the output is taken by the player, I'd like my item to remain in the left slot (with some damage, but that's the easy part). This is what I can't figure out how to do.

It seems the AnvilRepairEvent is called before the left slot is cleared, and there's no way to stop that from clearing. So how do I either prevent the left slot from clearing, or else put the item back after it's cleared to create the illusion that it remained?

Currently, I'm just giving the player the item in the AnvilRepairEvent, but it's quite annoying to do multiple anvil "crafts" if you have to keep putting it back into the anvil each time.

 

*EDIT* Update: I've managed to get it working, but it's with a clearly very hacky workaround, and I don't like how it looks at all. I'll post my code below, but can anyone come up with a less... erm, messy solution?
 

// Stupid, hacky workaround for there being no way to stop the left anvil
// slot from clearing!
public static HashMap<EntityPlayer, Pair<ContainerRepair, ItemStack>> anvilRefreshers = new HashMap<>();

@SubscribeEvent
public void onTick(PlayerTickEvent ev) {
	if (anvilRefreshers.containsKey(ev.player)) {
		Pair<ContainerRepair, ItemStack> pair = anvilRefreshers.get(ev.player);
		pair.getLeft().putStackInSlot(0, pair.getRight());
		anvilRefreshers.remove(ev.player);
	}
}

// Then, in the AnvilRepairEvent, when the proper item is in the left slot:

if (player.openContainer instanceof ContainerRepair) {
   	ItemStack give = ev.getItemInput().copy();
	EntityPlayer player = ev.getEntityPlayer();
	ContainerRepair cont = (ContainerRepair) player.openContainer;
	anvilRefreshers.put(player, Pair.of(cont, give));
}

 

I cut out some irrelevant bits, but basically, I'm use the PlayerTickEvent to delay the inventory slot setting by 1 tick, thereby replacing the item in the slot 1 tick after it's been removed. It works perfectly, but... I mean, you can tell just from that type of the anvilRefreshers map that it's ugly code. Is there a better way?

Edited by IceMetalPunk

Whatever Minecraft needs, it is most likely not yet another tool tier.

Posted

IIRC, anvil repair is called when something is changed in an input slot. There's another call stack when the anvil's output is removed from the output slot.

I suggest that you explore the anvil code to find what method handles removal. Set a breakpoint and step through. You might not be able to modify what stack(s) are left in the input slots, but you might be able to save enough data in one part of the process that you can drop an extra item that you want preserved.

The debugger is a powerful and necessary tool in any IDE, so learn how to use it. You'll be able to tell us more and get better help here if you investigate your runtime problems in the debugger before posting.

Posted
3 hours ago, jeffryfisher said:

IIRC, anvil repair is called when something is changed in an input slot. There's another call stack when the anvil's output is removed from the output slot.

I suggest that you explore the anvil code to find what method handles removal. Set a breakpoint and step through. You might not be able to modify what stack(s) are left in the input slots, but you might be able to save enough data in one part of the process that you can drop an extra item that you want preserved.

No, that's the AnvilUpdateEvent, which I'm using for other things. The AnvilRepairEvent is called when you remove items from the output slot. (More specifically, it's fired in the output slot's onTake method, exactly one line before it clears the left input slot.) As you can see from the edit in the original post, I'm making it work by storing the item stack and container in a map and then putting the item back one tick later; that method feels very "hacky" to me, though, especially since it relies on having a tick event handler running every tick, so I was hoping for a more event-based (or at least less frequently running) approach.

Whatever Minecraft needs, it is most likely not yet another tool tier.

Posted
15 hours ago, IceMetalPunk said:

No, that's the AnvilUpdateEvent, which I'm using for other things. The AnvilRepairEvent is called when you remove items

Aha, very good. My memory is almost a year rusty.

 

How would your game play work if you got rid of the hacky tick handler and simply dropped the input item as an item entity? Or, what if you returned the item to player inventory, possibly the player's off-hand if empty?

The debugger is a powerful and necessary tool in any IDE, so learn how to use it. You'll be able to tell us more and get better help here if you investigate your runtime problems in the debugger before posting.

Posted
2 minutes ago, jeffryfisher said:

Aha, very good. My memory is almost a year rusty.

 

How would your game play work if you got rid of the hacky tick handler and simply dropped the input item as an item entity? Or, what if you returned the item to player inventory, possibly the player's off-hand if empty?

Yeah, originally I was just putting it back in the player's inventory. The issue is that this item would often be used for batches of anvil "crafting", so having to keep putting it back into the anvil for each round of crafting can get annoying. (The item, a special totem, allows you to "de-craft" items in an anvil. So for instance, if I wanted to de-craft a stack of wood back into logs, I'd have to perform 16 rounds of crafting, and moving the totem back and forth between the anvil and your inventory 16 times is obnoxious.)

Whatever Minecraft needs, it is most likely not yet another tool tier.

Posted

The best I can come up with is to somehow attach a hopper to the side (input2) of the anvil and preferentially drop the token on that hopper if it's there. However, that may be even worse than the tick handler hack.

 

Hmmm... I wonder how much work it will be to rig an anvil for hopper connections (probably need to invent a custom anvil). Then you could input a hopper full of tokens plus a chest full of gold swords to be uncrafted into chests full of gold ingots  :)

The debugger is a powerful and necessary tool in any IDE, so learn how to use it. You'll be able to tell us more and get better help here if you investigate your runtime problems in the debugger before posting.

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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
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.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Verified users can now unlock a $100 OFF Temu Coupon Code using the verified promo code [ALF401700]. This Temu $100 OFF code works for both new and existing customers and can be used to redeem up to 50% off your next order. Our exclusive Temu coupon code [ALF401700] delivers a flat $100 OFF on top of existing deals. First-time customers using code ALF401700 can save an extra 100% off select items. Returning users also qualify for an automatic $100 OFF discount just by applying this code at checkout. But wait—there’s more. With our Temu coupon codes for 2025, users can score up to 90% OFF on clearance items. Whether you’re shopping in the USA, Canada, UK, or elsewhere, Temu promo code ALF401700 unlocks extra discounts tailored to your account. Some users are saving 100% on items using this 2025 Temu promo code. 🔥 Temu Coupon Highlights Using Code [ALF401700]: Temu new user code – ALF401700: Save 50% off your first order + $100 OFF. Temu promo for existing customers – ALF401700: Enjoy flat $100 OFF instantly. Global availability: Works in the USA, UK, Canada, Germany, France, Japan, Chile, Colombia, Malaysia, Mexico, South Korea, Philippines, Saudi Arabia, Qatar, Pakistan, and more. Top 2025 Coupon Deal: Get $200 OFF plus 100% bonus discounts using code ALF401700. Top-Ranked Temu Deals for 2025 (Coupon Code: ALF401700): ✅ Temu $100 OFF Memorial Day Sale — Use ALF401700 ✅ Temu First Order Coupon — Use ALF401700 for 50% + $100 OFF ✅ Temu USA Coupon Code — Save $100 instantly with ALF401700 ✅ Temu Japan, Germany, Chile Codes — All support ALF401700 ✅ Temu Reddit Discount – $100 OFF: Valid for both new and old users ✅ Temu Coupon Bundle 2025 — $100 OFF + up to 50% slash ✅ 100% OFF Free Gift Code — Use ALF401700, no invite needed ✅ Temu Sign-Up Bonus Promo — Get a welcome $100 OFF instantly ✅ Free Temu Code for New Users — Use ALF401700, no referral required  Temu Clearance Codes 2025 — Use ALF401700 for 85–100% discounts Why ALF401700 is the Best Temu Code in 2025 Using Temu code ALF401700 is your ticket to massive savings, free shipping, first-order discounts, and stackable coupon bundles. Whether you're browsing electronics, fashion, home goods, or beauty products, this verified Temu discount code offers real savings—up to 90% OFF + $100 OFF on qualified orders. 💡 Pro Tip: Apply ALF401700 during checkout in the Temu app or website to activate your instant $100 discount, even if you’re not a new user. Temu $100 OFF Code by Country (All Use ALF401700): 🇺🇸 Temu USA – ALF401700 🇯🇵 Temu Japan – ALF401700 🇲🇽 Temu Mexico – ALF401700 🇨🇱 Temu Chile – ALF401700 🇨🇴 Temu Colombia – ALF401700 🇲🇾 Temu Malaysia – ALF401700 🇵🇭 Temu Philippines – ALF401700 🇰🇷 Temu Korea – ALF401700 🇵🇰 Temu Pakistan – ALF401700 🇫🇮 Temu Finland – ALF401700 🇸🇦 Temu Saudi Arabia – ALF401700 🇶🇦 Temu Qatar – ALF401700 🇫🇷 Temu France – ALF401700 🇩🇪 Temu Germany – ALF401700 🇮🇱 Temu Israel – ALF401700 Temu Coupon Code [ALF401700] Summary for SEO: Temu $100 OFF Code  Temu First Order Discount Code 2025  Temu Verified Promo Code ALF401700  Temu 50% OFF + $100 Bonus  Temu 100% OFF Code 2025  Temu App Promo ALF401700  Temu Working Discount Code 2025 
    • Hey there, nothing to do with the code, I am just suggesting you use Intelij IDEA. Trust me, it is the best.
    • Hey there, nothing to do with the code, I am just suggesting you use Intelij IDEA. Trust me, it is the best.
    • You can check the config of Geckolib and Mowzie's Mobs - maybe there is a way to disable some render features
    • You can use the .requires() function  the server also has a permission level of 4, which is the highest permission level.
  • Topics

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.