Jump to content

[1.16] Datapack Client-Server Sync [Solved]


Tikaji

Recommended Posts

I've been working on getting datapack support for my mod and I've run into a bit of an issue when connecting to a dedicated server. I've know that recipes are supposed to be synced from the server to the client, however, I'm noticing that my RecipeReloadListener (which is added to the AddReloadListenerEvent) is not being called. Perhaps I'm misunderstanding how things are supposed to work here with datapacks, but I'm pretty sure that my custom recipes are not being loaded.

Here's the RecipeReloadListener.

Link the the current branch here.

Link to comment
Share on other sites

6 minutes ago, Tikaji said:

You mentioned that I'm not subscribing to the event bus. Am I not subscribing to the bus here?

Apologies, although it is a bit confusing of the 5 different implementations of event bus attaching. You might want to verify the event is being called.

6 minutes ago, Tikaji said:

I do create an IRecipe instance in my SerializableRecipe which all of my recipes extend from. Is this not what you're talking about or am I going about it a bit wrong? If it helps, I am using Immersive Engineering as a template for my own recipes.

So, then you shouldn't need a custom reload listener. Your recipes already have datapack support, this just sections of the recipes without the need of grabbing the world instance. Are you sure that the reload listener isn't being called? Because I believe you're misinterpreting not being called with not being synced to the client which if that's the case then you need to send a packet to transfer that information or update the client values with those from the client synced RecipeManager.

Link to comment
Share on other sites

3 minutes ago, ChampionAsh5357 said:

Apologies, although it is a bit confusing of the 5 different implementations of event bus attaching. You might want to verify the event is being called.

No worries. I get that things can be confusing.

4 minutes ago, ChampionAsh5357 said:

Are you sure that the reload listener isn't being called?

So in my reload listener are calls to my mod registries to set the recipes. In each of those setRecipes method is a log statement. I get log statements on the server side that suggest that the reload listener is being called. However, on the client side I get no such log statements. So, the listener is subscribing to the event and is called on the dedicated server, but not on a client connecting to it.

10 minutes ago, ChampionAsh5357 said:

Because I believe you're misinterpreting not being called with not being synced to the client which if that's the case then you need to send a packet to transfer that information or update the client values with those from the client synced RecipeManager.

This might be true. I'm not sending any packets across the network because I assumed that it was all being taken care of behind the scenes. This probably comes from not understanding how exactly datapacks are synced to the client. If I'm needing to send a packet from the server to the client to sync my custom recipes, is there a good place to look to for guidance?

12 minutes ago, ChampionAsh5357 said:

So, then you shouldn't need a custom reload listener.

Again, I'm guessing this comes from not understanding how datapacks work with between the server and the client, but why would I not need a reload listener? What would the purpose of a reload listener be then?

 

Also, thanks for your help. I really appreciate it.

Link to comment
Share on other sites

15 minutes ago, Tikaji said:

is there a good place to look to for guidance?

Vanilla syncs the RecipeManager to the client; however, you are just handling the server implementation. If you want to continue this way, you can just send a packet to execute the same code with the client side RecipeManager. There technically doesn't need to be anything sent as well since the data is already synchronized.

16 minutes ago, Tikaji said:

but why would I not need a reload listener? What would the purpose of a reload listener be then?

As I already said, JSONs within the recipes folder will be automatically loaded and stored within the world instance. What you are doing with your reload listener is waiting for their completion and caching the results, something that is not necessary as you can just call the RecipeManager and grab it there. A reload listener should be used to grab data from resources. What these resources are depends on what you are specifically trying to grab.

Link to comment
Share on other sites

4 minutes ago, ChampionAsh5357 said:

If you want to continue this way, you can just send a packet to execute the same code with the client side RecipeManager. There technically doesn't need to be anything sent as well since the data is already synchronized.

Ah ok, so if I understand correctly I could send a packet from the server to the client (presumably during some event) that doesn't send anything and just call the RecipeManager to load in the recipes, just as I've done in my RecipeReloadListener. Also, your phrasing seems to imply that there is a better way. Is this the case?

6 minutes ago, ChampionAsh5357 said:

What you are doing with your reload listener is waiting for their completion and caching the results, something that is not necessary as you can just call the RecipeManager and grab it there. A reload listener should be used to grab data from resources.

Gotcha, so what I'm doing is not what a reload listener is really meant to do? What it's used for is actually loading data from file?

Link to comment
Share on other sites

Just now, Tikaji said:

Also, your phrasing seems to imply that there is a better way. Is this the case?

Well, in my opinion, it's just as computationally efficient to use the RecipeManager and scrap the reload listener as it pretty much is a simple stateless filter. The only benefit here is a transition from O(n) -> O(k) where n is the number of recipes while k is the number of specific recipes. So, it all depends on if you want to cache your data, which still doesn't technically need a reload listener.

2 minutes ago, Tikaji said:

so what I'm doing is not what a reload listener is really meant to do? What it's used for is actually loading data from file?

Yes. You can technically invalidate cache without the need of a reload listener. However, I will not argue nor complain that the current implementation isn't okay as well. It's just better if you understand the reason why compared to using just a simple baseline.

  • Thanks 1
Link to comment
Share on other sites

  • Tikaji changed the title to [1.16] Datapack Client-Server Sync [Solved]

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.