Jump to content

[1.11.2] retrieving possible drops from mob


Thefifth

Recommended Posts

Hi all

 

I've been trying to find a way to get this information in a readable format for a while now, most searches (both here and via Google) usually lead to someone trying to add a drop to an existing mob.

 

What I'm trying to do is find out the possible drops from an entity standing on/near my tile entity. As in, if it were a skeleton, it would be an array containing arrows, bones and broken bows etc.

 

Is this at all possible or would I need to hard code these lists? I'd like to avoid that as obviously that means that it wouldn't work for custom mobs or mobs with edited drop tables.

 

Thanks in advance for any help.

Link to comment
Share on other sites

If EntityLiving#getLootTable returns a non-null value, you can use LootTableManager#getLootTableFromLocation to get the LootTable from that ResourceLocation. You can then go through the table's pools and entries to build the list.

 

If the entity doesn't use a loot table (e.g. EntityWither), you'll need to hardcode its drop list.

 

Look at JustEnoughResources for an example of how to work with loot tables. 

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.

Link to comment
Share on other sites

56 minutes ago, Leviathan143 said:

There's one important thing Choonster forgot.  EntityLiving#getLootTable is protected, so you'll need to use Java Reflection or Forge Access Transformers to call it.

Correction:

You will need to use Reflection.

 

Access Transformers are coremodding and coremodding is not sanctioned here.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

1 hour ago, Draco18s said:

Correction:

You will need to use Reflection.

 

Access Transformers are coremodding and coremodding is not sanctioned here.

Access Transformers don't require a coremod. You create a text file in a certain place, define the access transformations you want to make in it, add some lines to your build.gradle and run gradle setupDecompWorkspace. As far as I am aware access transformers are part  of ForgeGradle, there is no coremod involved.

Edited by Leviathan143
Link to comment
Share on other sites

You still shouldn't be using them.  Reflection can do the same thing.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

I've been fiddling about with ReflectionHelper and getting some results. Just as a quick question, am I on the right track here:

 

//..
if (ent instanceof EntityLiving)
{
	try
	{
		ResourceLocation loc = (ResourceLocation) ReflectionHelper.getPrivateValue(ent.getClass(), ent, new String[]{"getLootTable"});
		if (loc != null)
		{
			//..
		}
	}
	catch (Exception e)
	{
	//..
	}
}

 

Or am I way off and need to rethink this.

 

Again, thanks in advance.

Link to comment
Share on other sites

ReflectionHelper.getPrivateValue gets the value of a field, EntityLiving#getLootTable is a method.

 

Looking up a field/method via reflection is expensive, so you should use ReflectionHelper.findField/findMethod and store the Field/Method object in a static final field and use that to access/modify the field's value or call the method.

 

You're only passing the MCP name of the method to ReflectionHelper, so it won't work outside of the development environment. You need to pass the SRG name as well as the MCP name. You can find the SRG name of a field/method using MCPBot.

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.

Link to comment
Share on other sites

Thanks for all your help on this, I've managed to get my tile entity println'ing minecraft:entities/<entity>, which means I'm getting the right ResourceLocation. Unfortunately I need sleep to function tomorrow so I'll have to pick up on this tomorrow.

 

Thanks again everyone.

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.
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.



×
×
  • Create New...

Important Information

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