Jump to content

[1.7.10] Issues with EntityPotion custom potion effects [Solved]


Recommended Posts

Posted

I am attempting to create a mod, which so far is working well. In this mod I've created a class that extends Entity witch, and I am using events to intercept when a potion is being thrown by this new witch.

 

I tested it out in single player, in Minecraft, the entity for a potion is ThrownPotion, while in the code ThrownPotion doesn't exist and is instead EntityPotion (from what I can tell).

 

In game with command blocks I can execute this command and it works perfectly:

/summon ThrownPotion ~ ~2 ~ {Potion:{Count:1,id:373,Damage:16428,tag:{CustomPotionEffects:[{Id:20,Amplifier:0,Duration:200}]}}}

It was my belief that the same NBT structure should work for EntityPotion as well. Since I'm adding a wither potion effect I can't just set the damage, as id=20 is above the 15 allowed in the first 4 bits of the id, which define the potion effect, so I have to use custom potion effects. The problem is the nbt format isn't working. The following is the code:

@SubscribeEvent
public void onEntitySpawn(EntityJoinWorldEvent event)
{
	Entity e = event.entity;

	if(e instanceof EntityPotion)
	{
		EntityPotion ep = (EntityPotion)e;
		if(ep.getThrower() instanceof ChargedWitch)
		{
			if(ep.getPotionDamage() != 32660) return;// Only alter the poison potion thrown by the witch
			ep.setPotionDamage(16461); // If this line is here, potion becomes instant damage, is commented potion is still poison
                                                           // (proving nbt didn't work)
			NBTTagCompound nbt = ep.getEntityData();

			NBTTagCompound potion = nbt.getCompoundTag("Potion");
			NBTTagCompound tag = new NBTTagCompound();

			potion.setShort("id", (short) 373);
			potion.setShort("Damage", (short) 16461);
			potion.setByte("Count", (byte) 1);

			tag.setTag("CustomPotionEffects", makePotion());

			potion.setTag("tag", tag);

			nbt.setTag("Potion", potion);
		}
	}
}
public NBTTagList makePotion() { 
	NBTTagList list = new NBTTagList();
	NBTTagCompound potionType = new NBTTagCompound();
	potionType.setByte("Id", (byte) Potion.wither.getId());
	potionType.setByte("Amplifier", (byte) 0);
	potionType.setInteger("Duration", 200);
	potionType.setByte("Ambient", (byte) 0); //Not ambient
	list.appendTag(potionType);
	return list;
}

 

I'm unsure why this isn't working. I guess my main question is why is it ThrownPotion in game, but no sign of any "ThrownPotion" class in the project.

 

If it's not possible I can easily make my own potion entity, I know enough to do so, I've just never experienced this issue before with inconsistent NBT structures.

 

!EDIT: Changed topic title to fit the format most posts are using.

 

!!EDIT: Thanks for the help, for anyone else looking to add custom effects to Potion Entities but don't know how:

 

  Reveal hidden contents

 

Posted

With the changed to how forge decompiles in 1.7 (I don't know which version it changed) you're building against a placeholder jar. There is absolutely no source code that I can access besides the obfuscated code for the actual game. Because of this I can't just copy and paste the witch code over because I can't get it. The last time I used forge you built your mod with a full decompiled minecraft code, able to see the actual game code from within Eclipse.

 

Even if I did summon the potion myself, I'd still have the same issue. I've done 2 days of research and can't find any links on the internet about how to set the CustomPotionEffects of an EntityPotion. Since I'm trying to use Wither, which is not obtainable via metadata this is the only way that's possible to do it short of making your own custom potion entity.

 

  Quote
EntityWitch handles the potion behavior in onLivingUpdate. Override it and change the code to your liking.

Overwriting can only do so much. I want it to have completely the same behavior as a normal witch except throwing wither potions and summoning lightning bolts (which I already have working). Unless I can get the deobfuscated code for EntityWitch, I don't get how I'm supposed to simply overwrite the method, I still would need to set the potion data of the EntityPotion.

Posted

Ok, thank you, that's very useful. I wonder why that's not noted in any tutorials I've ever found, all of say to use Dev. The question still remains how to make the potion give wither, since I know it's possible in game it's obviously possible with code, but I guess I can look at EntityPotion and figure that out.

Posted

I am familiar with the custom potion effect format, I've studied that page and the Chunk_format page as well, the problem is even after applying the NBT to the potion it doesn't seem to have any effect. Is potionEntity.getEntitydata() not the right NBT to modify? From what I see it's the only method that returns NBT other than the readFromNBT and WriteToNBT which are only used when loading from the save file.

 

The problem with just overwriting the attackEntityWithRangedattack (which I use already to do the lightning strikes) is that no where there can I change the potion types. The only way is to copy all of the code, so I'll end up doing that, I just am having a hard time getting the NBT to apply. I've checked that it's being structured the right way, I built a class that prints out the NBT of an entity in JSON and it prints out the correct NBT, but when the potion hits me it doesn't have the effect, while the one I summon in-game with commands using ThrownPotion works fine.

 

I think I can figure the rest out from here now that I've been told how to get the decomp workspace, so thanks for that. I'll report back if I have other questions related to this.

Posted
  Quote
If you run gradlew setupDecompWorkspace (as opposed to setupDevWorkspace) you will get sourcecode.

 

Ok, so I have a script I made in batch to create new workspaces for projects, and in that file I use

 

gradlew setupDecompWorkspace --refresh-dependencies
gradlew eclipse

 

It ends up i was already using decomp workspace, not dev, and it did not set up a workspace that had the source code. The resulting eclipse workspace contains a src folder with only a simple example mod that prints out the unlocalized name of dirt, and none of the code. To compile against it contains a referenced library called forgeSrc which is a jar containing only empty methods to allow the IDE to compile. Where would I find the source code? Did you mean setupDevWorkspace would generate the source code instead, did you say them backwards?

 

EDIT! apparently the source code is obtainable in "\build\tmp\recompSrc\", bit of a strange place to be, and not the most obvious place to find it, but it works at least.

 

  Quote
Indeed it is not. getEntityData is for custom, additional data that you want stored in an entity that is not yours (e.g. store a player's team or something). This is an old outdated mechanic and pretty much replaced by IExtendedEntityProperties.

 

As I said, the NBT goes on an ItemStack (with Items.potionitem). Then you pass that ItemStack to EntityPotion. Yes, you have to pretty much copy the code in attackEntityWithRangedAttack.

 

I find that very strange, considering you're supposed to be able to modify the NBT data of any entity, if that NBT data really can't be modified after creation it's a bit hard to work with. That's a bit convoluted. Considering the fact that I can with in-game commands assign NBT data to an entity that I summon, and can also be done with /entitydata, I find it really strange that I'm being told this is not possible to do within the code.

Posted
  On 8/5/2015 at 6:11 PM, diesieben07 said:

Why are you looking directly for the source code? setupDecompWorkspace attaches a source jar to the forge bin jar, so eclipse should automatically display the source if you open a Minecraft or Forge class.

Ok, that makes more sense. I've never actually worked with a project that set that up, every time I usually click on those it goes to "No linked source could be found for this file", so I never gave it a thought to try it here.

 

  Quote
Entities don't have NBT data. Entities are saved to NBT. The getEntityData is abusing the NBT system.
I see, thanks for that explanation then. That makes me curious how the entitydata command works, perhaps it calls the readfromNBT function again.

 

  Quote
It is, but not using getEntityData. Using NBT for this stuff is a hack. Just set the properties directly for an entity.

And again, this is not the entity's NBT. Look at EntityPotion, it only wraps a poition ItemStack, so you need to store the potion there, in the ItemStack.

Ok. this actually also means theoretically I could use reflection to change the ItemStack info (although I won't do that, I'll just set it at creation of the potion).
Posted
  On 8/5/2015 at 6:27 PM, DreadKyller said:

  Quote
Entities don't have NBT data. Entities are saved to NBT. The getEntityData is abusing the NBT system.
I see, thanks for that explanation then. That makes me curious how the entitydata command works, perhaps it calls the readfromNBT function again.

 

If you look at its implementation in 1.8, you'll see that it tells the

Entity

to write itself to NBT, merges that with the NBT specified in the command and then tells the

Entity

to read from the merged NBT.

 

To address your initial confusion of

ThrownPotion

vs.

EntityPotion

: every

Entity

class is registered with a unique name.

ThrownPotion

is the name that the

EntityPotion

class is registered with.

Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.

Posted
  On 8/5/2015 at 6:45 PM, Choonster said:

If you look at its implementation in 1.8, you'll see that it tells the

Entity

to write itself to NBT, merges that with the NBT specified in the command and then tells the

Entity

to read from the merged NBT.

 

To address your initial confusion of

ThrownPotion

vs.

EntityPotion

: every

Entity

class is registered with a unique name.

ThrownPotion

is the name that the

EntityPotion

class is registered with.

Thank you for that explanation. I figured the ThrownPotion was just the registered name, just wasn't sure. As for the command then you for the explanation. I guess that makes sense, I was wondering how it managed to insert only some NBT with omitting other data and not change anything else of the entity, and that is the most obvious way of doing so (not that I'll be using that to achieve my goal)

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

    • Working $200 Off Temu Coupon Code [acu639380] First Order Exclusive Temu Coupon Code (acu639380) – Save Big on Your Shopping! Temu has become a go-to online marketplace for shoppers looking for high-quality products at unbeatable prices. With millions of trending items, fast delivery, and free shipping available in 67 countries, Temu ensures a seamless shopping experience for its users. Now, you can make your purchases even more rewarding by using the Temu coupon code (acu639380) to unlock huge discounts of up to $200 and exclusive deals. Why Use the Temu Coupon Code (acu639380)? By applying the Temu discount code (acu639380) at checkout, you can enjoy massive savings of up to $200 on a wide range of categories, including electronics, fashion, home essentials, beauty products, and more. This special offer is available to both new and existing users, ensuring that everyone gets a chance to save big on their favorite items What Discounts Can You Get with Temu Coupon Code (acu639380)? Here’s what you can unlock with the Temu promo code (acu639380): $200 Off for New Users – First-time shoppers can enjoy a flat $200 discount on their initial order. $200 Off for Existing Users – Loyal customers can also claim $200 off their purchases with the same code. Extra 40% Off – The Temu discount code (acu639380) provides an additional 40% off on select items, maximizing your savings. $200 Coupon Bundle – Both new and existing users can receive a $200 coupon bundle, perfect for future purchases. Free Gifts for New Users – If you’re shopping on Temu for the first time, you June receive free gifts with your order. Temu Coupons for Different Countries Temu caters to shoppers worldwide, offering incredible discounts based on your location. Here’s how the Temu coupon code (acu639380) benefits users across different regions: United States – Get $200 off your first order using the Temu coupon code (acu639380). Canada – Enjoy $200 off on your first-time purchase. United Kingdom – Use the Temu promo code (acu639380) to get $200 off your first order. Japan – Japanese shoppers can claim $200 off their initial purchase. Mexico – Get an extra 40% discount on select products with the Temu coupon (acu639380). Brazil – Shoppers in Brazil can also save 40% on select items. Germany – Receive a 40% discount on eligible products with the Temu promo code (acu639380). How to Use the Temu Coupon Code (acu639380)? Applying the Temu discount code (acu639380) is simple and hassle-free. Follow these easy steps to redeem your discount: Sign Up or Log In – Create a new account or log in to your existing Temu account. Shop for Your Favorite Items – Browse through Temu’s vast collection and add products to your cart. Enter the Coupon Code – At checkout, apply the Temu promo code (acu639380) in the designated field. Enjoy Your Discount – See the discount applied to your order and proceed with payment. Why Shop on Temu? Apart from huge discounts, Temu offers several benefits that make shopping more exciting and budget-friendly: Up to 90% Off on Select Products – Temu regularly offers massive discounts on top-selling items. Fast & Free Shipping – Get your products delivered quickly with free shipping to 67 countries. Wide Product Selection – Shop from a vast range of categories, including electronics, fashion, home essentials, and more. Safe & Secure Payments – Temu ensures a secure checkout process for a smooth shopping experience. Exclusive App Deals – Download the Temu app for extra discounts and app-only promotions. Final Thoughts With Temu’s exclusive coupon code (acu639380), you can unlock huge savings and enjoy a premium shopping experience at an affordable price. Whether you are a new user looking for a $200 discount or an existing customer wanting an extra 40% off, Temu has something for everyone. Don't forget to claim your $200 coupon bundle and free gifts before these amazing deals expire! Start shopping today on Temu and use the Temu coupon code (acu639380) to maximize your savings!  
    • Temu Coupon Code $100 Off [acu639380] First Time User Unlock Huge Savings: Temu Coupon Code (acu639380) for June 2025 Temu is transforming the way the world shops—and June 2025 delivers its boldest offers yet. With the exclusive Temu coupon code (acu639380), you're entering a world of rewards: from a $100 discount to premium coupon bundles, it's your passport to smart, stylish savings. The Temu Advantage in June 2025 Temu is known for redefining affordability and access. With unbeatable prices across trending categories—from fashion to electronics—it now delivers to 67 countries with speed and reliability. But this month, it’s not just about what you buy. It’s about how much you save. With Temu coupon code (acu639380) in hand, your savings soar. Instant Rewards with Temu Coupon Code (acu639380) If you haven't activated this exclusive code, here's what you're missing: $100 Off for first-time users $100 Off for returning customers 40% Off on sitewide items Free gifts for new sign-ups $100 Coupon Bundle available for all users What Makes Temu Coupon Code (acu639380) Unique? This code is designed to reward all shoppers—first-timers and loyal fans alike. Here’s how each discount delivers: Temu coupon code (acu639380) $100 off: Best for newcomers stocking up. Temu coupon code (acu639380) $100 off for existing users: Returning shoppers save big. Temu coupon code (acu639380) 40% off: Big savings on trending picks. Temu $100 coupon bundle: Split savings across several purchases. Temu first time user coupon: Ideal to kickstart your shopping spree. Global Value, Personalized Access Temu isn't just generous—it’s international. Whether you're in a Toronto high-rise or a Yorkshire farmhouse, the Temu promo code (acu639380) unlocks smart deals and chic finds. Coupon Code Highlights by Country Temu coupon code $100 off for USA – (acu639380) Temu coupon code $100 off for Canada – (acu639380) Temu coupon code $100 off for UK – (acu639380) Temu coupon code $100 off for Japan – (acu639380) Temu coupon code 40% off for Mexico – (acu639380) Temu coupon code 40% off for Brazil – (acu639380) Why Temu is the Marketplace of the Moment Unbeatable prices: Save up to 90% every day Worldwide reach: Ships to 67 countries New promotions: Fresh Temu new offers in June 2025 Fast, free delivery: No matter where you are FAQ: Maximize Your Temu Experience What’s the best Temu discount in June 2025? The top offer is Temu coupon code (acu639380) $100 off, for both new and existing users. Can I use these deals worldwide? Yes. The Temu discount code (acu639380) for June 2025 is valid in North America, South America, Europe, and Asia. Can I combine discounts? Absolutely. Pair your Temu $100 coupon bundle with seasonal deals for extra savings. Final Takeaway Smart shopping isn’t just about what you add to your cart—it’s about how you unlock value. With Temu coupon codes for new users, Temu coupon codes for existing users, and exciting June 2025 promotions, the best time to save is now. Don’t wait. Use Temu coupon code (acu639380) today to claim your rewards and transform the way you shop. New offers, global access, and exclusive savings await.  
    • Maybe it refers to an issue with the system - check for CPU/GPU driver updates
    • I haven't tried any other launchers, but I was getting the same results when I tried using forge with the vanilla launcher.
    • Make a test without sodiumextras
  • Topics

×
×
  • Create New...

Important Information

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