Jump to content

[SOLVED][1.14.4] from config to Ingredient for ingredient list


frakier

Recommended Posts

trying to use a config file to load a list of item:ids from a config file defined using defineList.

["minecraft:apple", "minecraft:dried_kelp", "minecraft:melon_slice",[minecraft.apple] 

to be used by TemptGoal as one example.

this.goalSelector.addGoal(4, new TemptGoal(this, 1.2D, false, TEMPTATION_ITEMS));

TempGoal uses (Ingredient temptItemsIn). Since Ingredient does not have a ".add" how do I turn the array, a array, well any array into something I can pull from a config and into a Ingredient.
Hard coded would look something like this...

Ingredient TEMPTATION_ITEMS = Ingredient.fromItems(Items.CARROT, Items.POTATO, Items.BEETROOT);

Anyone got any ideas or can point me in the right direction and I hop this makes sense.
I saw the fromStream but it goes over my head and I have yet to find a good example of the streams being used.
Thanks.

Edited by frakier
SOLVED
Link to comment
Share on other sites

I considered that, I know I can add a tags to a existing item, I've done that before. but say I create a tag

//herbivore
{
	"replace": false,
	"values": [
		"minecraft:apple",
		"minecraft:dried_kelp",
		"minecraft:melon_slice",
		"minecraft:golden_apple",
		"minecraft:enchanted_golden_apple",
		"minecraft:carrot",
		"minecraft:beetroot",
		"minecraft:sweet_berries"
	]
}

Then any mod that shows tags would show them and I have noticed that in those cases the list of "tags" is getting huge [was playing a modpack the tag list just kept going], should I be adding another on the pile? Figured a config file gave access to change the list but did not add to the overhead, but if you think that is the route to go I'll give it a try.

Edited by frakier
Link to comment
Share on other sites

This is what tags are for. Mods that make tags visible have the onus on them to not make it overwhelming.

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

On 8/3/2020 at 11:34 PM, Draco18s said:

This is what tags are for. Mods that make tags visible have the onus on them to not make it overwhelming.

My Internet has been more out than on for the past two weeks makes researching a pain.

Anyway thinking this through, tell me if I'm wrong.
Where a config could have items from any mod, probably a test for use or mod existing before use would be needed.
...
With tags I can add items from minecraft or my current mod to say a carnivore tag. Then each other of my mods can do the same.  That takes care of my mods interacting.
For any third party mods  they would have to implement the tag or..
1. I would need to make a compat mod that uses tags to add to the carnivore tag or course it would fail on the first item not loaded so it would require a compat mod for each mod.
2. I would need to make a compat mod that tests for the existence of the mod I with to tag items in and add those dynamically [think that is a possibility i would need to research]?
3. Make resource pack that includes entries for each mod with a carnivore  for each implement the tag.
Did I miss anything and which would seem the most efficient and easy for the end user to simply add to a list. If #3 work the way I think [i need to research] it would work.
 

Link to comment
Share on other sites

There's a way to check on the Java side if a tag exists.

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

2 hours ago, Draco18s said:

There's a way to check on the Java side if a tag exists.

yeah I do that already when checking to see if the user is wearing a specific collection of a suit of armor.

the problem I'm pondering on now is one bad tag and the whole JSON file fails. So if the mod that is the target of a item in the json tag does not exist the whole tag fails to work. Think I'm going to experiment with the 3rd option, one resource pack that has the tags for ever potential item in desired mods. Then all someone has to do to add more to the tag is create the structure for the desired mod in the resource pack and add the carnivore.json  with the items they want tagged for the mod. Going to go experiment soon, was hoping to get some pros and cons on the ideas though.

Edited by frakier
more info
Link to comment
Share on other sites

You could include a JSON tag file with no items in it.

The whole point is that "an empty list" is still a valid list.

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

50 minutes ago, Draco18s said:

You could include a JSON tag file with no items in it.

The whole point is that "an empty list" is still a valid list.

Just trying to figure out the best way to add to the carnivore tag and still allow for the end user to add more if they wish in the easiest manner. Not sure about the empty list.

Link to comment
Share on other sites

A tag with nothing in it generates an empty list. An empty list is special in that it contains zero items and is not null.

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:

A tag with nothing in it generates an empty list. An empty list is special in that it contains zero items and is not null.

Oh I get what you are saying I did that with insectivore. Don't really have anything for insectivore in mind yet but know there will be eventually.

Edited by frakier
Link to comment
Share on other sites

I have a "resources\data\minecraft\tags\items\carnivore.json"

{
	"replace": false,
	"values": [
		"minecraft:porkchop",
		"minecraft:chicken",
		"minecraft:mutton",
		"minecraft:rabbit",
		"minecraft:beef",
		"minecraft:egg",
		"minecraft:cod",
		"minecraft:salmon",
		"minecraft:tropical_fish"
	]
}

and I have "resources\data\mymod\tags\items\carnivore.json"

{
	"replace": false,
	"values": [
		"minecraft:porkchop"
	]
}

note: yes this should be a raw meat item from my own mod in this tag group but for the particular mod I am working with there is not one, actually probably going to add one just to satisfy my own ODC but have not got around to it so porkchop it is.

I can get the ingredients [don't get too hung up on code examples I'm cobbling them together to present the general ides without all the variables] that would make it harder to read without posting everything, which I can't post everything because it is someone elses mod that I am working on to send them as a quarantine gift [had a lot of time on my hands recently].

Ingredient CARNIVORE_TAGED_ITEMS = Ingredient.fromTag(ItemTags.getCollection().getOrCreate(new ResourceLocation(MyMOD.MODID, "carnivore"))));
goalSelector.addGoal(4, new TemptGoal(this, 1.2D, false, CARNIVORE_TAGED_ITEMS));

When I test all that is returned is what is in my group tag reference [the lone porkchop] so that does not help much. Too much trouble to get a list of every tag group that could possibly be added and try to cobble them all together into one  list.

So trying another way.. I have a init called from the mainmod commonSetup where I collect the list of items like so using ForgeRegistries.ITEMS and I have a resource reload listener that will call the same init if the resources are reloaded. So quick and dirty i get a list of items....
 

IForgeRegistry<Item> test = ForgeRegistries.ITEMS;
List<Item> temp =  Lists.newArrayList();;
for(Item i: test) {
	if(i.getTags().toString().contains("carnivore")) { //not the smoothest way but got to get it working to reine
      temp.add(i.asItem().getItem());
	}
}


Now how to get those items in temp into Ingredient CARNIVORE_TAGED_ITEMS so i can use them in the goals.

Or better yet get the items from ForgeRegistries.ITEMS  using the the carnivore item group more directly bu that does not seem to be an option.

Edited by frakier
Link to comment
Share on other sites

1 hour ago, frakier said:

"resources\data\minecraft\tags\items\carnivore.json"

Don't put your mod's tags in the Minecraft domain, put them in yours. Its your mod's tag it belongs with YOUR mod, doesn't matter that they're vanilla items.

 

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

6 hours ago, frakier said:

"resources\data\minecraft\tags\items\carnivore.json"

 

6 hours ago, frakier said:

"resources\data\mymod\tags\items\carnivore.json"

These are 2 different tags ("minecraft:carnivore" and "mymod:carnivore" respectively).

You should make 1 tag "mymod:carnivore" and add all the defaults to it (as in all the vanilla items, and your custom items if applicable), then if you want to add items in another mod, you also define the "mymod:carnivore" tag (not the "mysecondmod:carnivore", again that would be a different tag).

 

As an extension on what draco said, the only time you should put tags in the minecraft domain is if you are overriding/adding to an existing vanilla tag.

Edited by Alpvax
Link to comment
Share on other sites

OK so then what happens when another mod wants to add the carnivore tag to their own mod my mod will never see them because...

Ingredient CARNIVORE_TAGED_ITEMS = Ingredient.fromTag(ItemTags.getCollection().getOrCreate(new ResourceLocation(MyMOD.MODID, "carnivore"))));
goalSelector.addGoal(4, new TemptGoal(this, 1.2D, false, CARNIVORE_TAGED_ITEMS));

is only reading  the internal omnivore tag, it does not even see the tag addition in the data pack while ForgeRegistries.ITEMS does see the addition from the datapack. All this code does is read the carnivore tag in the mod itself at the specified location.

Now lets say i have four distinct mods, because not everyone wants the stoats mod, they can pick and choose, other mods have used this strategy rather than creating one huge monolithic mod [a strategy I like].  The monolithic mod would require a custom carnivore tag for the modpack it will run in [not that the above code would see it at all either]....
goats, boars, stoats, snakes [whatever mods].. they are all individual lightweight mods with their own raw meat additions to the carnivore group.
Then a few other people add the carnivore tag as well to their mods.

The only way to get a complete list would be to look at the ForgeRegistries.ITEMS and get all the items that are associated with the carnivore tag otherwise you are only working with a local list, which will fail if even one item exists in the carnivore list without the associated mod loaded and as said with the above code it would all have to be in the mod file structure itself because the datapack is not seen by that code.
 

There really should be something like....

Ingredient CARNIVORE_TAGED_ITEMS = ForgeRegistries.ITEMS.withTag("carnivore");

to work with.


Going to look and see what the newest recommended 1.14.4 forge is to see if i am dealing with some problem. Going to take it up to 1.15 eventually but not yet. [nope 28.2.0 is recommended and that is what I have]

Edited by frakier
more readable
Link to comment
Share on other sites

2 hours ago, frakier said:

ForgeRegistries.ITEMS.withTag("carnivore");

That's basically what Ingredient.fromTag is. It doesn't make sense to query the item registry, the item registry doesn't know or care about tags.

Try also:

new ItemTags.Wrapper(new ResourceLocation(...));

  • Thanks 1

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

On 8/11/2020 at 1:52 PM, Draco18s said:

That's basically what Ingredient.fromTag is. It doesn't make sense to query the item registry, the item registry doesn't know or care about tags.

Try also:

new ItemTags.Wrapper(new ResourceLocation(...));

Worked that was what I needed....
added to MyModTags class where I handle all my tag group stuff [yeah, stuff, I could not think of a better word].

public static Tag<Item> makeWrapperTag(String p_199901_0_) {
	return new ItemTags.Wrapper(new ResourceLocation(p_199901_0_));
}

then where I needed to use the tagged items i did something like this....

Ingredient CARNIVORE_TAGED_ITEMS = Ingredient.fromTag(makeWrapperTag("carnivore"));
goalSelector.addGoal(4, new TemptGoal(this, 1.2D, false, CARNIVORE_TAGED_ITEMS));


Well I went around the world to get here, thanks again Draco18s and thanks Alpvax.

[EDIT:] SORRY I WAS WRONG... only getting the minecraft tags this using carnivore this way.
Doing this all the tagged items were found from inside the mod and from the datapack. Both those I put under minecraft and under my mod [see earlier comments above]

I should probably change the title of this post to something like "Ingredient from Tags for goalSelector use.

Edited by frakier
thanks and wrapping up
Link to comment
Share on other sites

I may  have spoke too soon.
--Using wrapper code I talked about in the previous post only gets tagged items from minecraft "resources\data\minecraft\tags\items\carnivore.json" tagged items from inside the mod or from datapacks, totally ignores items tagged under "resources\data\mymod\tags\items\carnivore.json".
So I put my debugging code back in and looped over ForgeRegistries.ITEMS to see if my items were there, they were and they were appropriately tagged.
-using the code "Ingredient.fromTag(ItemTags.getCollection().getOrCreate(new ResourceLocation(MyMOD.MODID, "carnivore"))));"
sees only mymods tagged items and ignores the items tagged in minecraft .

So I am back to  the same place I started, should not be this big a pain in the rear to collect up all items with a given tag regardless of mod that adds them when the items are tagged correctly in ForgeRegistries.ITEMS .

Edited by frakier
Link to comment
Share on other sites

You haven't understood what Draco and I told you.

minecraft:carnivores is a completely unrelated tag to mymod:carnivores. There is no link between them AT ALL. You need to make a single tag (maybe myanimalmodid:carnivores), then for each of your expansion mods, you add to THAT tag. Not to a different tag for each mod.

  • Thanks 1
Link to comment
Share on other sites

1 hour ago, Alpvax said:

You haven't understood what Draco and I told you.

minecraft:carnivores is a completely unrelated tag to mymod:carnivores. There is no link between them AT ALL. You need to make a single tag (maybe myanimalmodid:carnivores), then for each of your expansion mods, you add to THAT tag. Not to a different tag for each mod.

So I have four mods and regardless of the modid I create a namespace/path [somecommonnamespace:carnivores] in tags for each mod then use the same namespace/path in every mod with the items from that mod I want included listed in it? I hope I understand that right... I'll give that a try because even though I have four mods I have branded them with a common name encompassing the four mods.

Edited by frakier
Link to comment
Share on other sites

Yes.

That's how tags work.

They are tied to a resource location.

Just as minecraft:stone and somemode:stone are different, so too is minecraft:carnivore and mymod:carnivore.

  • Thanks 1

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

3 hours ago, Alpvax said:

You haven't understood what Draco and I told you.

minecraft:carnivores is a completely unrelated tag to mymod:carnivores. There is no link between them AT ALL. You need to make a single tag (maybe myanimalmodid:carnivores), then for each of your expansion mods, you add to THAT tag. Not to a different tag for each mod.

Yeah that part went over my head because I let the four mods thing get in my head I was still trying to use the modid from each mod.

1 hour ago, Draco18s said:

Yes.

That's how tags work.

They are tied to a resource location.

Just as minecraft:stone and somemode:stone are different, so too is minecraft:carnivore and mymod:carnivore.

Got it working now, just need to test more. Thanks again I knew it was in the ballpark but just could not see the resolution.

all the mod tag groups are now under "resources\data\commonnamespace\tags\items\carnivore.json" in all four mods [and any other third party mods as well as datapacks]
and then I do  something like

loc = new ResourceLocation("commonnamespace", "carnivore");
tagwrapper = new ItemTags.Wrapper(loc);
ingredientlist = Ingredient.fromTag(tagwrapper);
goalSelector.addGoal(4, new TemptGoal(this, 1.2D, false, ingredientlist));


 

Edited by frakier
Link to comment
Share on other sites

(And I assume that "commonnamespace" is not literally "commonnamespace" but something identifiable to your mod.)

  • Like 1
  • Haha 1

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

23 hours ago, Draco18s said:

(And I assume that "commonnamespace" is not literally "commonnamespace" but something identifiable to your mod.)

Oh yeah the mod has a longer name where part of the longer name is common. Just used the part common to all the mods. Like
MyModSameNameDogs
MyModSameNameCats
MyModSameNameBirds

so using MyModSameName as the common element.

Edited by frakier
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.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • As the title says i keep on crashing on forge 1.20.1 even without any mods downloaded, i have the latest drivers (nvidia) and vanilla minecraft works perfectly fine for me logs: https://pastebin.com/5UR01yG9
    • Hello everyone, I'm making this post to seek help for my modded block, It's a special block called FrozenBlock supposed to take the place of an old block, then after a set amount of ticks, it's supposed to revert its Block State, Entity, data... to the old block like this :  The problem I have is that the system breaks when handling multi blocks (I tried some fix but none of them worked) :  The bug I have identified is that the function "setOldBlockFields" in the item's "setFrozenBlock" function gets called once for the 1st block of multiblock getting frozen (as it should), but gets called a second time BEFORE creating the first FrozenBlock with the data of the 1st block, hence giving the same data to the two FrozenBlock :   Old Block Fields set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=head] BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@73681674 BlockEntityData : id:"minecraft:bed",x:3,y:-60,z:-6} Old Block Fields set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} Frozen Block Entity set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockPos{x=3, y=-60, z=-6} BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} Frozen Block Entity set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockPos{x=2, y=-60, z=-6} BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} here is the code inside my custom "freeze" item :    @Override     public @NotNull InteractionResult useOn(@NotNull UseOnContext pContext) {         if (!pContext.getLevel().isClientSide() && pContext.getHand() == InteractionHand.MAIN_HAND) {             BlockPos blockPos = pContext.getClickedPos();             BlockPos secondBlockPos = getMultiblockPos(blockPos, pContext.getLevel().getBlockState(blockPos));             if (secondBlockPos != null) {                 createFrozenBlock(pContext, secondBlockPos);             }             createFrozenBlock(pContext, blockPos);             return InteractionResult.SUCCESS;         }         return super.useOn(pContext);     }     public static void createFrozenBlock(UseOnContext pContext, BlockPos blockPos) {         BlockState oldState = pContext.getLevel().getBlockState(blockPos);         BlockEntity oldBlockEntity = oldState.hasBlockEntity() ? pContext.getLevel().getBlockEntity(blockPos) : null;         CompoundTag oldBlockEntityData = oldState.hasBlockEntity() ? oldBlockEntity.serializeNBT() : null;         if (oldBlockEntity != null) {             pContext.getLevel().removeBlockEntity(blockPos);         }         BlockState FrozenBlock = setFrozenBlock(oldState, oldBlockEntity, oldBlockEntityData);         pContext.getLevel().setBlockAndUpdate(blockPos, FrozenBlock);     }     public static BlockState setFrozenBlock(BlockState blockState, @Nullable BlockEntity blockEntity, @Nullable CompoundTag blockEntityData) {         BlockState FrozenBlock = BlockRegister.FROZEN_BLOCK.get().defaultBlockState();         ((FrozenBlock) FrozenBlock.getBlock()).setOldBlockFields(blockState, blockEntity, blockEntityData);         return FrozenBlock;     }  
    • It is an issue with quark - update it to this build: https://www.curseforge.com/minecraft/mc-mods/quark/files/3642325
    • Remove Instant Massive Structures Mod from your server     Add new crash-reports with sites like https://paste.ee/  
  • Topics

×
×
  • Create New...

Important Information

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