Jump to content

[1.10.2] Adding day/night cycle to the End after killing the Ender Dragon


Recommended Posts

Posted

Greeting everyone, for the third time.

 

 

Brief explanation of my mod

 

My mod focuses on expanding the End in the least overpowered way possible with the goal of offering an enjoyable experience past vanilla Minecraft. It adds ores, decorative blocks, mobs and some more lore on the End.

I've created an item that is dropped by the Ender Dragon which will "release" the End from darkness upon its destruction, turning the End into what it originally was planned to be: skylands.

 

Current goal

 

Upon the consumption(right click) of this item, I need to initiate the vanilla day/night cycle in the End dimension. This means, I need to get the Sun and the Moon, and a sky color, to be visible in the End. For now, I'm just trying to get it done before the Ender Dragon is killed, and not when a UseItemEvent is fired. For testing purposes.

 

 

Current progress

 

I've managed to get the sunset/sunrise colors on the fog(It looks orange during these two times), meaning I've gotten the CelestialAngle working as well, since the fog uses this if I'm not mistaken. However, the still sky looks like static, and there is no rendering of the Sun and Moon or stars(since I don't know how).

 

TL;DR

I need the Sun, Moon and stars to be rendered in the End, and give the sky color. How?

 

 

Thanks for your time!

I make sure to "thank" everyone who helps me <3

Posted

When "blank" happens set hasNoSky to false.

 

This changes light levels, as far as I noticed. The End got waaay brighter, but the sky is still static.

 

I make sure to "thank" everyone who helps me <3

Posted

Also isSkyColored().

 

*Edit and this

    @SideOnly(Side.CLIENT)
    public net.minecraftforge.client.IRenderHandler getSkyRenderer()
    {
        return this.skyRenderer;
    }

Basically if "blank" return a different field that will render your sky otherwise it will always render the end sky as it is hardcoded.

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Posted

Also isSkyColored().

 

*Edit and this

    @SideOnly(Side.CLIENT)
    public net.minecraftforge.client.IRenderHandler getSkyRenderer()
    {
        return this.skyRenderer;
    }

Basically if "blank" return a different field that will render your sky otherwise it will always render the end sky as it is hardcoded.

 

Well, skyRenderer in WorldProvider is private, so I can't access it.

I made one for my WorldProviderTTE named skyRenderer as well and set it to be equal to null (same as the WorldProvider's) and also added the function:

 @SideOnly(Side.CLIENT)
    public void setSkyRenderer(net.minecraftforge.client.IRenderHandler skyRenderer)
    {
        this.skyRenderer = skyRenderer;
    }

 

and nothing happens.

I make sure to "thank" everyone who helps me <3

Posted

Also isSkyColored().

 

*Edit and this

    @SideOnly(Side.CLIENT)
    public net.minecraftforge.client.IRenderHandler getSkyRenderer()
    {
        return this.skyRenderer;
    }

Basically if "blank" return a different field that will render your sky otherwise it will always render the end sky as it is hardcoded.

 

Well, skyRenderer in WorldProvider is private, so I can't access it.

I made one for my WorldProviderTTE named skyRenderer as well and set it to be equal to null (same as the WorldProvider's) and also added the function:

 @SideOnly(Side.CLIENT)
    public void setSkyRenderer(net.minecraftforge.client.IRenderHandler skyRenderer)
    {
        this.skyRenderer = skyRenderer;
    }

 

and nothing happens.

Probably be cause it is null you need to render the sky your self look at RenderGlobal that is where the sky is rendered based on the dimension ID.

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Posted

Probably be cause it is null you need to render the sky your self look at RenderGlobal that is where the sky is rendered based on the dimension ID.

 

I found that in RenderGlobal, but I still don't know what to put instead of null. I can see how the renderSky() function works. It has a variable net.minecraftforge.client.IRenderHandler renderer = this.theWorld.provider.getSkyRenderer();. I can't use this since it's accessing the world provider to asign this variable, and here I am configuring the world provider.

 

Or am I wrong? Sorry. Still rough around the edges.

I make sure to "thank" everyone who helps me <3

Posted

Probably be cause it is null you need to render the sky your self look at RenderGlobal that is where the sky is rendered based on the dimension ID.

 

I found that in RenderGlobal, but I still don't know what to put instead of null. I can see how the renderSky() function works. It has a variable net.minecraftforge.client.IRenderHandler renderer = this.theWorld.provider.getSkyRenderer();. I can't use this since it's accessing the world provider to asign this variable, and here I am configuring the world provider.

 

Or am I wrong? Sorry. Still rough around the edges.

Create a new class that implements IRenderHandler then make it render your sky. In the worldProvider#getSkyRenderer() make it return null when you want the sky to be the normal ends, but when you want it to be your sky return your IRenderHandler class. (Note make your IRenderHandler variable equal to a new instance of your IRenderHandler class).

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Posted

Create a new class that implements IRenderHandler then make it render your sky. In the worldProvider#getSkyRenderer() make it return null when you want the sky to be the normal ends, but when you want it to be your sky return your IRenderHandler class. (Note make your IRenderHandler variable equal to a new instance of your IRenderHandler class).

 

Okay, I see how to make the Sun rise after using the item, but we have a problem: I can't make a new class that implements IRenderHandler. It's an abstract class. I can only make my new class extend it, which I don't think will yield the results we're looking for here.

 

Or am I misunderstanding something?

I make sure to "thank" everyone who helps me <3

Posted

Create a new class that implements IRenderHandler then make it render your sky. In the worldProvider#getSkyRenderer() make it return null when you want the sky to be the normal ends, but when you want it to be your sky return your IRenderHandler class. (Note make your IRenderHandler variable equal to a new instance of your IRenderHandler class).

 

Okay, I see how to make the Sun rise after using the item, but we have a problem: I can't make a new class that implements IRenderHandler. It's an abstract class. I can only make my new class extend it, which I don't think will yield the results we're looking for here.

 

Or am I misunderstanding something?

...Forge why did you name a class "I"RenderHandler...Anyways you do want to extend it, since it was prefixed with I I assumed it was an interface that needed to be implemented.

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Posted

...Forge why did you name a class "I"RenderHandler...Anyways you do want to extend it, since it was prefixed with I I assumed it was an interface that needed to be implemented.

 

Alright, that got rid of the static-ish sky. Next things are:

- Sun, Moon and stars

- Getting rid of the fog that doesn't let me see squat. (Looks like the Nether's red fog which limits your view distance)

I make sure to "thank" everyone who helps me <3

Posted

...Forge why did you name a class "I"RenderHandler...Anyways you do want to extend it, since it was prefixed with I I assumed it was an interface that needed to be implemented.

 

Alright, that got rid of the static-ish sky. Next things are:

- Sun, Moon and stars

- Getting rid of the fog that doesn't let me see squat. (Looks like the Nether's red fog which limits your view distance)

Go to RenderGlobal.class

In Eclipse press ctrl + f and search for if (this.mc.theWorld.provider.isSurfaceWorld())

Look at that code as that handles all sky rendering if it is in the method renderSky().

You will find all of the variables it uses in there and how it does the sun and moon logic.

For fog just search for fog in WorldProvider and WorldProvider... and see how they handle that.

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Posted

Go to RenderGlobal.class

In Eclipse press ctrl + f and search for if (this.mc.theWorld.provider.isSurfaceWorld())

Look at that code as that handles all sky rendering if it is in the method renderSky().

You will find all of the variables it uses in there and how it does the sun and moon logic.

For fog just search for fog in WorldProvider and WorldProvider... and see how they handle that.

 

Final question: where do I write down my own code for the renderSky()? Do I make an extension of RenderGlobal overriding that function? Do I make a new class and call it from the WorldProvider? These might be dumb questions, but they're probably my biggest problem when it comes to Java. (Where to actually write stuff)

 

Thanks for everything so far.

I make sure to "thank" everyone who helps me <3

Posted

Go to RenderGlobal.class

In Eclipse press ctrl + f and search for if (this.mc.theWorld.provider.isSurfaceWorld())

Look at that code as that handles all sky rendering if it is in the method renderSky().

You will find all of the variables it uses in there and how it does the sun and moon logic.

For fog just search for fog in WorldProvider and WorldProvider... and see how they handle that.

 

Final question: where do I write down my own code for the renderSky()? Do I make an extension of RenderGlobal overriding that function? Do I make a new class and call it from the WorldProvider? These might be dumb questions, but they're probably my biggest problem when it comes to Java. (Where to actually write stuff)

 

Thanks for everything so far.

You have a IRenderHandler field in your WorldProvider. You set that equal to your IRenderHandler. In your IRenderHandler there should be a required method called render() (Or something similar). Then with the method I told you to override if "blank" return your IRenderField. RenderGlobal calls the method i provided earlier and renders from there if there is one.

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Posted

Final question: where do I write down my own code for the renderSky()? Do I make an extension of RenderGlobal overriding that function? Do I make a new class and call it from the WorldProvider?

In a class that extends IRenderHandler. If you are replacing WorldProviderEnd with your own WorldProvider override WorldProvider#getSkyRenderer(). If you aren't, use WorldProvider#setSkyRenderer() to change the sky renderer when necessary.

These might be dumb questions, but they're probably my biggest problem when it comes to Java. (Where to actually write stuff)

 

Thanks for everything so far.

Do you have any prior coding experience, Java or otherwise?

 

 

 

Posted

Final question: where do I write down my own code for the renderSky()? Do I make an extension of RenderGlobal overriding that function? Do I make a new class and call it from the WorldProvider? These might be dumb questions, but they're probably my biggest problem when it comes to Java. (Where to actually write stuff)

 

Thanks for everything so far.

You have a IRenderHandler field in your WorldProvider. You set that equal to your IRenderHandler. In your IRenderHandler there should be a required method called render() (Or something similar). Then with the method I told you to override if "blank" return your IRenderField. RenderGlobal calls the method i provided earlier and renders from there if there is one.

 

Alright. Thank you!

 

These might be dumb questions, but they're probably my biggest problem when it comes to Java. (Where to actually write stuff)

 

Thanks for everything so far.

Do you have any prior coding experience, Java or otherwise?

 

 

All coding I learnt was at home on the internet, with countless trials and errors. I'm using Minecraft as an excuse to learn more Java and have some fun along the way. On a scale of 1 to 10 of how much Java I know, I guess it would be a solid 5. I know how to read most of the code and get general ideas of what I'm reading to reproduce it, but in this case I had no clue how the day/night cylce worked, and sometimes I have a hard time figuring out where to write code, as dumb as that may sound.

I make sure to "thank" everyone who helps me <3

Posted

In a class that extends IRenderHandler. If you are replacing WorldProviderEnd with your own WorldProvider override WorldProvider#getSkyRenderer(). If you aren't, use WorldProvider#setSkyRenderer() to change the sky renderer when necessary.

 

I think you guys might be overestimating the IRenderHandler class:

public abstract class IRenderHandler
{
    @SideOnly(Side.CLIENT)
    public abstract void render(float partialTicks, WorldClient world, Minecraft mc);
}

 

What I need is to override the renderSky() function in RenderGlobal:

public void renderSky(float partialTicks, int pass)
    {
        net.minecraftforge.client.IRenderHandler renderer = this.theWorld.provider.getSkyRenderer();
        if (renderer != null)
        {
            renderer.render(partialTicks, theWorld, mc);
            return;
        }

        if (this.mc.theWorld.provider.getDimensionType().getId() == 1)
        {
            this.renderSkyEnd();
        }
[...]
}

 

That being said, I could create an extension of RenderGlobal, and override this function so that it's called instead of the vanilla one.

 

EDIT: Or maybe I should override the renderEndSky?

 

Is that correct?

I make sure to "thank" everyone who helps me <3

Posted

In a class that extends IRenderHandler. If you are replacing WorldProviderEnd with your own WorldProvider override WorldProvider#getSkyRenderer(). If you aren't, use WorldProvider#setSkyRenderer() to change the sky renderer when necessary.

 

I think you guys might be overestimating the IRenderHandler class:

public abstract class IRenderHandler
{
    @SideOnly(Side.CLIENT)
    public abstract void render(float partialTicks, WorldClient world, Minecraft mc);
}

 

What I need is to override the renderSky() function in RenderGlobal:

public void renderSky(float partialTicks, int pass)
    {
        net.minecraftforge.client.IRenderHandler renderer = this.theWorld.provider.getSkyRenderer();
        if (renderer != null)
        {
            renderer.render(partialTicks, theWorld, mc);
            return;
        }

        if (this.mc.theWorld.provider.getDimensionType().getId() == 1)
        {
            this.renderSkyEnd();
        }
[...]
}

 

That being said, I could create an extension of RenderGlobal, and override this function so that it's called instead of the vanilla one.

 

EDIT: Or maybe I should override the renderEndSky?

 

Is that correct?

Even if you override renderSky() or renderEndSky() how would you renderSky() get called will you also override the renderGlobal variable? Why would there be a call to IRenderHandler in RenderGlobal if it is not going to do anything?

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

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

    • 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 $  
    • It was working perfectly fine last night but now I'm getting an exit code -1 with the textbox: The game crashed: rendering overlay Error: net.minecraftforge.fml.ModLoadingException: Supplementaries (supplementaries) encountered an error during the done event phase Here's the crash log: https://pastebin.com/KmesArYS Any help is apricated
    • Link to Crashlog: https://pastebin.com/bKqH9fx2 Trying to set up a custom mod pack, was going smoothly up until recently as the WorldLoader screen, (the one that appears when you select "create new world" in Singleplayer), was clicked to test that it was running fine. Most Recent Few mods added were; - Create (+ its addons) - Immersive Weathering [Forge] I've tried all I could think of since loading up the game worked fine and I've never had this issue before.  Any help is appreciated.  
  • Topics

×
×
  • Create New...

Important Information

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