Jump to content

Recommended Posts

Posted

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?

Posted
  On 6/7/2021 at 4:54 PM, diesieben07 said:

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

Expand  

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;

 

Posted
  On 6/7/2021 at 7: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.

Expand  

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

Posted
  On 6/8/2021 at 12:29 PM, 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).

Expand  

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

Posted
  On 6/7/2021 at 7: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.

Expand  

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

 

Posted (edited)
  On 6/11/2021 at 11:27 AM, diesieben07 said:

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

Expand  

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
Posted
  On 6/11/2021 at 3:22 PM, 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.

Expand  

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

Nero.class.getClassLoader()

 

Posted
  On 6/13/2021 at 8:17 AM, diesieben07 said:

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

Expand  

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)

Posted
  On 6/13/2021 at 12:48 PM, 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.

Expand  

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

Posted
  On 6/13/2021 at 3:30 PM, 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.

Expand  

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.

Posted
  On 6/13/2021 at 5:19 PM, diesieben07 said:

Why do you not want the fields to be static?

Expand  

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.

 

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

    • Make a test with another Launcher like the Curseforge Launcher, MultiMC or AT Launcher
    • can anyone help me i am opening forge and add modpacks and then it says unable to update native luancher and i redownlaod java and the luancher it self?
    • The problem occurs also in 1.20.1 Forge, but with an "Error executing task on client" instead. I have "Sinytra Connector" installed. On 1.21.5 Fabric, there is no problem. When this happens, the chat message before the death screen appears gets sent, with an extra dash added.
    • Well, as usual, it was user error. Naming mismatch in sounds.json.  Please delete this post if you find it necessary. 
    • Hello Forge community.  I'm running into an issue with a mod I'm working on.  To preface, I can call /playsound modId:name music @a and I can hear the sound I registered being played in game. Great!  However, I cannot get it to trigger via my mod code.    Registration: public static final RegistryObject<SoundEvent> A_WORLD_OF_MADNESS = SOUND_EVENTS.register("a_world_of_madness", () -> new SoundEvent(new ResourceLocation("tetheredsouls", "a_world_of_madness")));   Playback: Minecraft mc = Minecraft.getInstance(); if (!(mc.player instanceof LocalPlayer) || mc.level == null) return; LocalPlayer player = (LocalPlayer) mc.player; BlockPos pos = player.blockPosition(); SoundEvent track = ModSounds.A_WORLD_OF_MADNESS.get(); System.out.println(track); System.out.println(pos); System.out.println(player); // play exactly like the tutorial: client-only, at the player's position try { mc.level.playLocalSound( player.getX(), player.getY(), player.getZ(), track, SoundSource.MUSIC, // Or MASTER if needed 1f, 1f, false ); System.out.println("[DEBUG] playSound success: " + track.getLocation()); } catch (Exception e) { System.err.println("[ERROR] Failed to play sound: " + track.getLocation()); e.printStackTrace(); } Sounds.json:   { "theme_of_laura": { "category": "music", "sounds": [ { "name": "tetheredsouls:a_world_of_madness", "stream": true } ] } } Things I have tried: - multiple .ogg files. Short .ogg files (5 seconds, <100KB).  - default minecraft sounds imported from import net.minecraft.sounds.SoundEvents; These work given my code. No idea why these are different.  - playSound() method, as well as several others in past iterations that did not work   I would be forever grateful if somebody could point me in the right direction. I've looked at several mod github repositories and found extremely similar code to what I'm doing. I've also found several threads in this forum that did not solve my issue. I just cannot figure out what I'm doing differently, and why I'm able to queue sounds manually with playsound but the code won't play it (despite confirming the code is being run with the debug statements.)
  • Topics

×
×
  • Create New...

Important Information

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