Jump to content

[1.16.5] How to get all mod classes?


Luis_ST

Recommended Posts

As the title says i need all classes of my mod,
because i want to output them firstly on the console (for debugging),
and secondly for a custom registration of recipes.

I looked at the code from forge for the AutomaticEventSubscriber registration and understand it only partially.
I also have this code that gives me a ModFileScanData:

ModList.get().getModFileById(Nero.MOD_ID).getFile().getScanResult()

ModFileScanData has the getClasses method, which unfortunately gives me an unusable class,
because I don't get any classes or anything back from a ClassData

is there a way to get all classes of my mod?

Link to comment
Share on other sites

1 hour ago, diesieben07 said:

This is a terrible idea. What do recipes have to do with getting all classes?

I have a custom recipe system, I use annotations to register the recipe methods faster and easier,
which currently only works in classes that extend my recipe helper.
I would like to extend this to all classes that have an annotation similar to the event registration of forge.


I also need the classes for a config system in which I add an annotation to a fields and these are automatically added to my config,
the implementaion is not perfect/finished but here is a small example:
 

	@ConfigValue(valueName = "example", comment = "This is an example")
	public static int example;

 

Link to comment
Share on other sites

16 hours ago, diesieben07 said:

This is a valid use case, but it does not require you to "list all classes of the mod".
Use ModFileScanData#getAnnotations to find things annotated with your annotation, then process them however you like.

with which method do I get the object which has the annotation

Link to comment
Share on other sites

7 minutes ago, diesieben07 said:

AnnotationData#getAnnotationType: The class of the annotation.

AnnotationData#getTargetType: The type of element that was annotated (e.g. field, method, class)

AnnotationData#getClassType: The class of the element that was annotated (for fields and methods this is the containing class)

AnnotationData#getMemberName: The name of the element that was annotated (for fields and methods this is the name, for classes it is the class name).

If I look at the AnnotationData and the methods you have listed, I cannot find a usable method
since I can't do anything with the target/class type, the name of the target doesn't help with fields and methods either.

what does the map contain, the AnnotationData#getAnnotationData returns

Link to comment
Share on other sites

On 6/7/2021 at 9:20 PM, diesieben07 said:

This is a valid use case, but it does not require you to "list all classes of the mod".
Use ModFileScanData#getAnnotations to find things annotated with your annotation, then process them however you like.

I have now created a custom config system which also works,
but I get an error that is actually not possible:
log part:

[11:43:37] [modloading-worker-1/WARN] [ne.lu.ne.Nero/]: Can't define Config Value coalXpMin
java.lang.IllegalArgumentException: Can not set net.minecraftforge.common.ForgeConfigSpec$ConfigValue field net.luis.nero.api.block.ModOreBlock.coalXpMin to net.minecraftforge.common.ForgeConfigSpec$ConfigValue

 

complete log:
log.log

this is the config class
this is the config value class

 

Link to comment
Share on other sites

2 hours ago, diesieben07 said:

You have to use the correct ClassLoader when loading the classes, look at what AutomaticEventSubscriber does.

okay AutomaticEventSubscriber uses the ClassLoader of the mod main class,
but I didn't use a ClassLoader in my code, so where do I have to set/use the ClassLoader?

Edited by Luis_ST
Link to comment
Share on other sites

1 hour ago, diesieben07 said:

No, it uses the class loader when looking up the class by name. You also look up the class by name, but you do not specify the class loader.

okay makes sense, but can i get the ClassLoader of my main mod class?
can i do something like that:
 

Nero.class.getClassLoader()

 

Link to comment
Share on other sites

1 hour ago, diesieben07 said:

I can't reproduce this, the game starts up fine when I cloned your repo.

yes the game starts, the config is also created,
but the try-catch block still catches an exception for each ConfigValue,

I also get a NullPointerException when I use the values that I set via reflection in the code (xp drop of my custom ores)

Link to comment
Share on other sites

2 hours ago, diesieben07 said:

The first parameter to Field#set is the instance holding the field. You're giving it the ConfigValue every time, but ConfigValue is not the class holding the field.

so i need the class of the ConfigValue there?
and ConfigValue.class doesn't work

Link to comment
Share on other sites

1 hour ago, diesieben07 said:

No. Here configField is a field in configClass. So if you call field.set you need to pass in an instance of configClass (so that the field knows on which instance to set the field...) or null for static fields. Read the documentation for Field#set if you do not understand this.

I understood how the method works my problem is that I don't have an instance of ConfigValue,
I can't create a temporary new one and if I need the instance from the class in which the ConfigValue is located that I want to add to the config,
the automatic addition is "for the bucket".

the other possibility would be to set the fields with the ConfigValues to static, but i dont want to do that.

Link to comment
Share on other sites

9 minutes ago, diesieben07 said:

Why do you not want the fields to be static?

damn i mean final, thanks this fixed the problem
and is this important, or is this just debbing:
 

Null comment for config option Nero Common Config, this is invalid and may be disallowed in the future.

 

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



×
×
  • Create New...

Important Information

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