Jump to content

Recommended Posts

Posted

So, for a mod I am creating, I was going to create a separate options GUI where I'm going to put settings that I want to make sure are looked over and configured. I'm trying to do two things:

1. On the first time you start up Minecraft, display a GUI that prominently displays a message, with buttons that will take you to the main menu. I'm trying to make something similar to the same thing that Biomes O' Plenty for MC 1.7.2 does the first time you start it up.

2. Add a button to the primary main menu (the one with singleplayer, multiplayer, realms, settings, etc) that will lead to another GUI.

 

I've included most of my code below, but here's a synopsis of what I'm trying to do, and what's the problem.

 

I've created a working event handler which has a function that uses the GuiOpen event. The function makes sure the GUI opened is the vanilla GuiMainMenu (and judging by the debug messages I placed, this part mostly works), and then checks some settings to see if the "MainMenuWarning" GUI hasn't been opened yet. I then use the Minecraft.getMinecraft() method to get the instance of Minecraft (not sure if this is a reliable method)  and then run displayGuiScreen(new WhateverGui()) on the Minecraft instance to open the preferred GUI (this seems to be the method a lot of vanilla code uses; I still have my doubts of the usability of this method). If all works as planned, my special GUI should then open instead of the default GuiMainMenu.

 

Problem: It doesn't.

There's no crash or anything, it just doesn't open. By the little debug messages I placed in my event handler, I can confirm that the displayGuiScreen method is running, which is why I have doubts about the method. There's something in the source code involving instances of GuiMainMenu, so that might interfere with my new main menu which subclasses that. So, I made a few changes to the code to make sure it only displays the MainMenuWarning (which directly subclasses GuiScreen; shouldn't be any problem). Unfortunately, there still is no change; it just displays the GuiMainMenu.

 

Potential solutions?

Mainly, I just want to know what method I should be using to change the GUI. I'm not sure if there's something else that I need to do, or if I should use a different method for opening guis (like player.openGui(), but I usually thought this was mainly used for opening GUIs ingame).

 

Now for my custom code:

 

Main Mod Class:

https://gist.github.com/anonymous/62acdc5df16c40aa0b8d

 

EventHandler:

https://gist.github.com/anonymous/4907577c331aba9e4e4a

 

GuiHandler: (idk if i have to register these GUIs)

https://gist.github.com/anonymous/d6bf684523d389dd50aa

 

MainMenu:

https://gist.github.com/anonymous/9175ae5bdcb27ed7a29c

 

MainMenuWarning:

https://gist.github.com/anonymous/86d0630bbc32a6d6ae94

 

I think that's all that's necessary, tell me if you need any more. Sorry if anything if a but sloppy.

 

Also, on a side note, I can't seem to use spoilers or emoticons. Is it a site error, or because I'm using Chrome or something?

 

Thanks for any help in advance, especially if you've stuck around to read all of that ;)

Posted

Use event.gui = new WhateverGui()

It also states in the event's javadoc:

If you want to override this Gui, simply set the gui variable to your own Gui.

Don't ask for support per PM! They'll get ignored! | If a post helped you, click the "Thank You" button at the top right corner of said post! |

mah twitter

This thread makes me sad because people just post copy-paste-ready code when it's obvious that the OP has little to no programming experience. This is not how learning works.

Posted

So overriding the GUI just changes the displayed GUI outright? Let me try this real quick...

 

EDIT: Ok, it displays the MainMenuWarning GUI perfectly. The only problem is now when I open the new MainMenu from MainMenuWarning.actionPerformed using mc.currentscreen=new DNATGuiMainMenu(), it crashed because of a NullPointerException. Here's the stacktrace if it helps:

 

https://gist.github.com/anonymous/1407cf49ad0a59adfbba

 

I have an idea of what might be causing the problem, so I'm going to look into that. Thanks for the help with the other GUI though!

 

EDIT 2: It appears to be a problem within the GuiMainMenu.renderSkybox(int,int,float) method, on the line this.mc.getFramebuffer().unbindFramebutter(). This probably means that the Framebuffer in the main Minecraft instance is still not initialized; so the new question is, how can I initialize this safely?

Posted

DO NOT set

mc.currentscreen

directly!

 

Use mc.displayGuiScreen for that, since it initializes the GUI (and not just sets a variable)

Don't ask for support per PM! They'll get ignored! | If a post helped you, click the "Thank You" button at the top right corner of said post! |

mah twitter

This thread makes me sad because people just post copy-paste-ready code when it's obvious that the OP has little to no programming experience. This is not how learning works.

Guest
This topic is now closed to further replies.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • I know that this may be a basic question, but I am very new to modding. I am trying to have it so that I can create modified Vanilla loot tables that use a custom enchantment as a condition (i.e. enchantment present = item). However, I am having trouble trying to implement this; the LootItemRandomChanceWithEnchantedBonusCondition constructor needs a Holder<Enchantment> and I am unable to use the getOrThrow() method on the custom enchantment declared in my mod's enchantments class. Here is what I have so far in the GLM:   protected void start(HolderLookup.Provider registries) { HolderLookup.RegistryLookup<Enchantment> registrylookup = registries.lookupOrThrow(Registries.ENCHANTMENT); LootItemRandomChanceWithEnchantedBonusCondition lootItemRandomChanceWithEnchantedBonusCondition = new LootItemRandomChanceWithEnchantedBonusCondition(0.0f, LevelBasedValue.perLevel(0.07f), registrylookup.getOrThrow(*enchantment here*)); this.add("nebu_from_deepslate", new AddItemModifier(new LootItemCondition[]{ LootItemBlockStatePropertyCondition.hasBlockStateProperties(Blocks.DEEPSLATE).build(), LootItemRandomChanceCondition.randomChance(0.25f).build(), lootItemRandomChanceWithEnchantedBonusCondition }, OrichalcumItems.NEBU.get())); }   Inserting Enchantments.[vanilla enchantment here] actually works but trying to declare an enchantment from my custom enchantments class as [mod enchantment class].[custom enchantment] does not work even though they are both a ResourceKey and are registered in Registries.ENCHANTMENT. Basically, how would I go about making it so that a custom enchantment declared as a ResourceKey<Enchantment> of value ResourceKey.create(Registries.ENCHANTMENT, ResourceLocation.fromNamespaceAndPath([modid], [name])), declared in a seperate enchantments class, can be used in the LootItemRandomChanceWithEnchantedBonusCondition constructor as a Holder? I can't use getOrThrow() because there is no level or block entity/entity in the start() method and it is running as datagen. It's driving me nuts.
    • Hi here is an update. I was able to fix the code so my mod does not crash Minecraft. Please understand that I am new to modding but I honestly am having a hard time understanding how anyone can get this to work without having extensive programming and debugging experience as well as searching across the Internet, multiple gen AI bots (claude, grok, openai), and examining source code hidden in the gradle directory and in various github repositories. I guess I am wrong because clearly there are thousands of mods so maybe I am just a newbie. Ok, rant over, here is a step by step summary so others can save the 3 days it took me to figure this out.   1. First, I am using forge 54.1.0 and Minecraft 1.21.4 2. I am creating a mod to add a shotgun to Minecraft 3. After creating the mod and compiling it, I installed the .jar file to the proper directory in Minecraft and used 1.21.4-forge-54.1.0 4. The mod immediately crashed with the error: Caused by: java.lang.NullPointerException: Item id not set 5. Using the stack trace, I determined that the Exception was being thrown from the net.minecraft.world.item.Item.Properties class 6. It seems that there are no javadocs for this class, so I used IntelliJ which was able to provide a decompiled version of the class, which I then examined to see the source of the error. Side question: Are there javadocs? 7. This method, specifically, was the culprit: protected String effectiveDescriptionId() {      return this.descriptionId.get(Objects.requireNonNull(this.id, "Item id not set"));  } 8. Now my quest was to determine how to set this.id. Looking at the same source file, I determined there was another method:  public Item.Properties setId(ResourceKey<Item> pId) {             this.id = pId;             return this;   } 9. So now, I need to figure out how to call setId(). This required working backwards a bit. Starting from the constructor, I stubbed out the variable p which is of type Item.Properties public static final RegistryObject<Item> SHOTGUN = ITEMS.register("shotgun", () -> new ShotgunItem(p)); Rather than putting this all on one line, I split it up for readability like this: private static final Item.Properties p = new Item.Properties().useItemDescriptionPrefix().setId(rk); Here is was the missing function, setId(), which takes a type of ResourceKey<Item>. My next problem is that due to the apparent lack of documentation (I tried searching the docs on this site) I could not determine the full import path to ResourceKey. I did some random searching on the Internet and stumbled across a Github repository which gave two clues: import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; Then I created the rk variable like this: private static ResourceKey<Item> rk = ResourceKey.create(Registries.ITEM, ResourceLocation.parse("modid:shotgunmod")); And now putting it all together in order: private static ResourceKey<Item> rk = ResourceKey.create(Registries.ITEM, ResourceLocation.parse("modid:shotgunmod")); private static final Item.Properties p = new Item.Properties().useItemDescriptionPrefix().setId(rk); public static final RegistryObject<Item> SHOTGUN = ITEMS.register("shotgun", () -> new ShotgunItem(p)); This compiled and the mod no longer crashes. I still have more to do on it, but hopefully this will save someone hours. I welcome any feedback and if I missed some obvious modding resource or tutorial that has this information. If not, I might suggest we add it somewhere for people trying to write a mod that doesn't crash. Thank you !!!  
    • I will keep adding to this thread with more information in case anyone can help, or at the very least I can keep my troubleshooting organized. I decided to downgrade to 54.1.0 in the hopes that this would fix the issue but it didn't. At least now I am on a "recommended" version. The crash report did confirm my earlier post that the Exception is coming from effectiveDescriptionId(). I'll continue to see if I can find a way to set the ID manually.   Caused by: java.lang.NullPointerException: Item id not set         at java.base/java.util.Objects.requireNonNull(Objects.java:259) ~[?:?]         at TRANSFORMER/[email protected]/net.minecraft.world.item.Item$Properties.effectiveDescriptionId(Item.java:465) ~[forge-1.21.4-54.1.0-client.jar!/:?]         at TRANSFORMER/[email protected]/net.minecraft.world.item.Item.<init>(Item.java:111) ~[forge-1.21.4-54.1.0-client.jar!/:?]         at TRANSFORMER/[email protected]/com.example.shotgunmod.ShotgunItem.<init>(ShotgunItem.java:19) ~[shotgunmod-1.0.0.jar!/:1.0.0]         at TRANSFORMER/[email protected]/com.example.shotgunmod.ModItems.lambda$static$0(ModItems.java:15) ~[shotgunmod-1.0.0.jar!/:1.0.0]         at TRANSFORMER/[email protected]/net.minecraftforge.registries.DeferredRegister$EventDispatcher.lambda$handleEvent      
    • It just randomly stop working after a rebooted my dedicated server PLEASE HELP!   com.google.gson   Failed to start the minecraft server com.google.gson.JsonSyntaxException: Expected a com.google.gson.JsonObject but was com.google.gson.JsonPrimitive; at path $  
  • Topics

×
×
  • Create New...

Important Information

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