Jump to content

Recommended Posts

Posted

As title asks. It's not as simple as I'd hoped but if you have an immediate answer, there is no need to read the following. If you'd like to know why it's not as easy as simply getting the SRG name and access transformering, please read on.

Story time. So I went into the main GameRules class and looked at how that's implemented. It was as follows:

   public static final GameRules.RuleKey<GameRules.BooleanValue> DO_FIRE_TICK = register("doFireTick", GameRules.Category.UPDATES, GameRules.BooleanValue.create(true));

Nothing too hard, I pulled this over to my own class and tried it but unfortunately GameRules.BooleanValue.create has private access in that class. "No biggie", I thought, "I'll just AT it."

I rebuild my gradle so it can run the AT, it finishes after redownloading everything and I go into the newly downloaded GameRules.java and it still has private access. This confused me a bit so I tried some reflection but kept getting NoSuchMethodExceptions, even using ASMAPI.mapMethod("func_223568_b") as my method name input. I decided to run the following script on it to check what was going on.

for (Method m : GameRules.BooleanValue.class.getMethods()) {
  AppleOfMyEye.LOGGER.info(m.getName());
  for (Class<?> c : m.getParameterTypes()) {
    AppleOfMyEye.LOGGER.debug(c.getName());
  }
}

which didn't show any 'create' methods. I then ran the same again with getDeclaredMethods() and that showed the create method and it's overload. 

[22:26:25] [Worker-Main-14/INFO] [co.le.ao.AppleOfMyEye/]: create
[22:26:25] [Worker-Main-14/DEBUG] [co.le.ao.AppleOfMyEye/]: boolean
[22:26:25] [Worker-Main-14/DEBUG] [co.le.ao.AppleOfMyEye/]: java.util.function.BiConsumer
[22:26:25] [Worker-Main-14/INFO] [co.le.ao.AppleOfMyEye/]: create
[22:26:25] [Worker-Main-14/DEBUG] [co.le.ao.AppleOfMyEye/]: boolean

So I've had to use reflection but it's kind of nasty-looking and means I have to crash the game if an exception occurs or risk having the mod run in a not-fully-functional state. This not really preferable to what I could usually achieve with ATs where the code just wouldn't compile if there was a problem with it rather than compiling but with some missing values.

Essentially, how do I add GameRules.BooleanValue.create(boolean) to my access transformer? The following doesn't work:

public net.minecraft.world.GameRules.BooleanValue func_223568_b(Z)Lnet/minecraft/world/GameRules$RuleType; #create

Thank you for your time :D

Posted

So if I got it right you want to create your own gamerule?
Some time ago I wrote a mod in which I created my own Gamerules
those would be the most important classes that I created:

the GameRule class
the class with the GameRule fields (includes all my created GameRules)
and the registration

if you should ever create gamerules like me then didn't use DeferredWorkQueue#runLater as registration use FMLCommonSetupEvent#enqueueWork instead

Posted (edited)

No, as I said, I can add the gamerule just fine I just want to figure out how to put the normal GameRules.BooleanValue methods in my AT rather than have to use reflection. Looks like your mod uses reflection though.

Edit: this could be an XY Problem, I just want them in the access transformer so I can invoke them directly rather than with reflection invocations. Any alternative to reflection is good with me.

Edited by Lemon Lord
  • Sad 1
Posted (edited)
  On 4/29/2021 at 1:03 PM, Lemon Lord said:

No, as I said, I can add the gamerule just fine I just want to figure out how to put the normal GameRules.BooleanValue methods in my AT rather than have to use reflection. Looks like your mod uses reflection though.

Edit: this could be an XY Problem, I just want them in the access transformer so I can invoke them directly rather than with reflection invocations. Any alternative to reflection is good with me.

Expand  

Damn, I probably misunderstood the question
unfortunately I can't help you with the access transformer because I prefer java reflection.
therefore i use it to add the gamerules

Edited by Luis_ST
  • Thanks 1

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

    • 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.)
    • Delete the tensura-reincarnated/common.toml file (config folder)
  • Topics

  • Who's Online (See full list)

    • There are no registered users currently online
  • Create New...

Important Information

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