Jump to content

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


minisantur

Recommended Posts

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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

...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

Link to comment
Share on other sites

...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.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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?

 

 

 

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.

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.