Jump to content

How to create a custom data registry?


EveryBlu

Recommended Posts

I want to create a registry for a custom data file in a data-driven system I'm trying to make. I know how to use forge's built-in registries (for items, blocks, etc), but I have no idea how to setup my own, let alone one for a custom type of data pack file. Any help is appreciated.

Link to comment
Share on other sites

18 hours ago, EveryBlu said:

I want to create a registry for a custom data file in a data-driven system I'm trying to make. I know how to use forge's built-in registries (for items, blocks, etc), but I have no idea how to setup my own, let alone one for a custom type of data pack file. Any help is appreciated.

To create your own data driven system you can extends PreparableReloadListener (or its subclass SimpleJsonResourceReloadListener) and then register it in AddReloadListenerEvent.

Link to comment
Share on other sites

  • 2 weeks later...
On 2/25/2024 at 2:48 PM, vemerion said:

To create your own data driven system you can extends PreparableReloadListener (or its subclass SimpleJsonResourceReloadListener) and then register it in AddReloadListenerEvent.

How do I get my PreparableReloadListener to use in code?

I know how to register it now, but how do I use it in other code?

Link to comment
Share on other sites

3 hours ago, EveryBlu said:

I know how to register it now, but how do I use it in other code?

You can look at the vanilla subclasses to get an idea of how to implement your PreparableReloadListener.

Link to comment
Share on other sites

8 hours ago, vemerion said:

You can look at the vanilla subclasses to get an idea of how to implement your PreparableReloadListener.

No like how do I use my new PreperableReloadListener, I know how to set it up now and register it, I just need to know how to use it in other classes.

Link to comment
Share on other sites

I personally create registries using DataPackRegistryEvent.NewRegistry. It's pretty powerful as long as you know how to make codecs.

In some class, make a registry key like so:

public static final ResourceKey<Registry<MyDataType>> MY_REGISTRY = ResourceKey.createRegistryKey(new ResourceLocation(MyMod.MOD_ID, "registry_name"));

This will make a registry that holds objects of type "MyDataType". JSON files stored in data/<datapack_namespace>/modid/registryname/ will be parsed and put into this registry. Note that the directory structure has a folder named after your mod inside your datapack directory, so the actual path would look like: data/my_mod/my_mod/registry_name (or if another mod uses your registry: data/their_mod/my_mod/registry_name.

To register this registry, subscribe to the DataPackRegistryEvent.NewRegistry event on the MOD event bus and call event.dataPackRegistry() for every registry you have. An example of what I'm doing for my mod (this is in the constructor for the main mod file):

IEventBus bus = FMLJavaModLoadingContext.get().getModEventBus();

bus.addListener((DataPackRegistryEvent.NewRegistry event) ->
{   
	event.dataPackRegistry(ModRegistries.INSULATOR_DATA, InsulatorData.CODEC);
});

CODEC is a public static field inside the class for the custom data type I am registering. It holds a Codec<InsulatorData> that tells Minecraft how to serialize/deserialize the data. Most of my data so far can be represented by records, so I use RecordCodecBuilder.create() to do this:

public static final Codec<InsulatorData> CODEC = RecordCodecBuilder.create(instance -> instance.group(
	// Yadda yadda
).apply(instance, InsulatorData::new));

What exactly to put here depends on what you're trying to do, so that's up to you. But basically you're just defining a list of codecs that correspond to the parameters of the record (data type). Most primitive data types have records in the Codec class (ex. Codec.INT) that you can use, and other classes like ResourceLocation have their own codecs as a static field (ex. ResourceLocation.CODEC).

Hopefully this is what you're looking for, and that this helps.

Edited by Mikul
Link to comment
Share on other sites

4 hours ago, EveryBlu said:

No like how do I use my new PreperableReloadListener, I know how to set it up now and register it, I just need to know how to use it in other classes.

That completely depends on what your listener is for. For example, the vanilla RecipeManager has a method 'getRecipeFor()' which is used in various places, one of them being the furnace to see if an item can be smelted.

Link to comment
Share on other sites

2 hours ago, vemerion said:

That completely depends on what your listener is for. For example, the vanilla RecipeManager has a method 'getRecipeFor()' which is used in various places, one of them being the furnace to see if an item can be smelted.

I mean how do I get a reference of my listener in another class to call these methods? Vanilla code for example gets the RecipeManager via:

someLevelObject.getServer().getRecipeListener()

Do I use mixins to add a "getMyListener()" method in ReloadableServerResources"?

Link to comment
Share on other sites

6 hours ago, EveryBlu said:

I mean how do I get a reference of my listener in another class to call these methods? Vanilla code for example gets the RecipeManager via:

You should save a reference to it before you register it in AddReloadListenerEvent and then you can access that reference from wherever you need it. Here is an example of how Forge itself does it for the LootModifierManager.

Edited by vemerion
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



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • 🎰 Mainkan Slot Online dengan Hanya 5 Ribu Via Dana, Proses Cepat! 🎰 Buka pintu ke dunia hiburan tanpa batas di UANG69 Slot Online! Bersiaplah untuk merasakan sensasi kemenangan di ujung jari Anda dengan taruhan serendah 5 ribu rupiah saja, melalui metode pembayaran yang mudah via Dana! ⚡ Proses Cepat, Nikmati Keuntungan dalam Sekejap ⚡ Bergabunglah dengan komunitas slot paling dinamis dan terpanas, dengan puluhan permainan slot yang menakjubkan, serta kesempatan untuk memenangkan jackpot besar! Rasakan gemerlapnya Las Vegas langsung dari kenyamanan rumah Anda sendiri. 🔥 Keunggulan UANG69 Slot Online: 🔥 ✅ Taruhan Serendah 5 Ribu Rupiah ✅ Metode Pembayaran Mudah via Dana ✅ Proses Cepat, Penarikan Lancar ✅ Puluhan Permainan Slot Terbaik ✅ Jackpot Besar Menanti untuk Dimenangkan Bergabunglah dengan UANG69 hari ini dan jadilah bagian dari petualangan slot yang tak terlupakan. Nikmati keseruan, kemenangan, dan hiburan di ujung jari Anda! Jangan lewatkan kesempatan ini, bergabunglah sekarang dan mulailah memenangkan hadiah besar! 💰💎🎉
    • Hello, I am trying to play Minecraft (premium version) with the All Of Create mod from CurseForge. When I launch it from the Minecraft launcher I get an error "The game has stopped working" Error code: 1. I tried to create a modpack, without mods, and launch it (in case there was any incompatibility) but it doesn't work either.... Error with mod: https://paste.ee/p/zzvJY I hope someone can help me. Thanks in advance.
    • Jika Anda mencari maxwin secepat kilat, maka Slot Kilat77 adalah tempatnya! Dengan koleksi slot terbaik yang dirancang untuk memberikan kemenangan instan, setiap putaran di Slot Kilat77 adalah kesempatan untuk memenangkan hadiah besar dalam sekejap. Bergabunglah sekarang dan rasakan sensasi kemenangan kilat di setiap gulungan. Jadi, jangan ragu lagi, mari bergabung dan raih maxwin secepat kilat hanya di Slot Kilat77!
    • Jos77 adalah pilihan terbaik untuk meraih maxwin hari ini! Dengan koleksi permainan slot terbaik dan peluang kemenangan yang tinggi, setiap putaran di Jos77 adalah kesempatan untuk memenangkan hadiah besar. Bergabunglah sekarang dan rasakan sensasi kemenangan yang luar biasa di setiap gulungan. Jadi, jangan lewatkan kesempatan untuk menjadi pemenang hari ini di Jos77 Mulailah petualangan slot Anda sekarang di Jos77 dan temukan sendiri mengapa kami adalah pilihan utama para pencari maxwin. Dengan grafis yang memukau, fitur bonus yang menggiurkan, dan dukungan pelanggan yang luar biasa, kami siap membawa pengalaman bermain Anda ke level berikutnya. Tidak peduli apakah Anda seorang pemula atau ahli slot, Jos77 menyediakan lingkungan yang ramah dan menyenangkan bagi semua pemain. Jadi, bersiaplah untuk meraih maxwin dan nikmati kesuksesan Anda di Jos77 hari ini!  
    • BARBAR77 adalah destinasi utama bagi para pecinta slot online yang mencari sensasi paling barbar! Dengan koleksi slot paling mengagumkan dan peluang kemenangan yang tinggi, BARBAR77 menawarkan pengalaman bermain yang tidak akan Anda temukan di tempat lain. Bergabunglah dengan komunitas kami dan rasakan kegembiraan dari kemenangan yang mengagumkan di setiap putaran. Jadi, siapkan diri Anda untuk petualangan slot yang paling barbar di BARBAR77!
  • Topics

×
×
  • Create New...

Important Information

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