Skip to content

Commit

Permalink
Fully replace item module
Browse files Browse the repository at this point in the history
  • Loading branch information
Rover656 committed Jul 25, 2024
1 parent 6b8cc72 commit f7bd889
Show file tree
Hide file tree
Showing 26 changed files with 424 additions and 441 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "examplemod:item/example_block"
}
}
67 changes: 67 additions & 0 deletions src/main/java/com/enderio/regilite/AbstractRegilite.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package com.enderio.regilite;

import com.enderio.regilite.utils.BundledDataProvider;
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import it.unimi.dsi.fastutil.objects.ObjectList;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.neoforge.data.event.GatherDataEvent;

/**
* Abstract Regilite implementation that handles registration of module events.
* This can be used if a mod wants to implement its own modules to replace or extend existing ones.
* This might incur some more boilerplate, but is more ergonomic than shadowing the existing Regilite methods.
* If you only want to add a custom registry to Regilite, extend Regilite instead.
*/
public abstract class AbstractRegilite {
private final String modId;

private final ObjectList<RegiliteModuleDataGen> modulesWithDataGeneration = new ObjectArrayList<>();
private final ObjectList<RegiliteModuleEvents> modulesWithEvents = new ObjectArrayList<>();

protected AbstractRegilite(String modId) {
this.modId = modId;
}

/**
* Register a module within the Regiltie container.
* This will hook the different module types into the correct places (events and datagen for example).
*/
protected <T> T registerModule(T module) {
if (module instanceof RegiliteModuleDataGen dataGenModule) {
modulesWithDataGeneration.add(dataGenModule);
}

if (module instanceof RegiliteModuleEvents eventsModule) {
modulesWithEvents.add(eventsModule);
}

return module;
}

public String modId() {
return modId;
}

/**
* Register all event handlers for Regilite's modules.
* You should perform this in your mod entrypoint.
* @param modEventBus The mod event bus.
*/
public void register(IEventBus modEventBus) {
modEventBus.addListener(this::onGatherData);

for (var module : modulesWithEvents) {
module.register(modEventBus);
}
}

protected void onGatherData(GatherDataEvent event) {
var provider = new BundledDataProvider(modId);

for (var module : modulesWithDataGeneration) {
module.gatherProviders(event, provider::addSubProvider);
}

event.getGenerator().addProvider(true, provider);
}
}
39 changes: 4 additions & 35 deletions src/main/java/com/enderio/regilite/Regilite.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,9 @@
import com.enderio.regilite.data.RegiliteDataProvider;
import com.enderio.regilite.events.BlockEntityCapabilityEvents;
import com.enderio.regilite.events.BlockEntityRendererEvents;
import com.enderio.regilite.events.ColorEvents;
import com.enderio.regilite.events.EntityRendererEvents;
import com.enderio.regilite.events.FluidRenderTypeEvents;
import com.enderio.regilite.events.ItemCapabilityEvents;
import com.enderio.regilite.events.ScreenEvents;
import com.enderio.regilite.holder.RegiliteItem;
import com.enderio.regilite.blocks.RegiliteBlocks;
import com.enderio.regilite.items.RegiliteItems;
import com.enderio.regilite.lang.RegiliteLang;
Expand All @@ -23,20 +20,17 @@
import com.enderio.regilite.registry.BlockEntityRegistry;
import com.enderio.regilite.registry.EntityRegistry;
import com.enderio.regilite.registry.FluidRegistry;
import com.enderio.regilite.registry.ItemRegistry;
import com.enderio.regilite.registry.MenuRegistry;
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import it.unimi.dsi.fastutil.objects.ObjectList;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.inventory.MenuType;
import net.minecraft.world.item.CreativeModeTab;
import net.minecraft.world.item.Item;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.fml.loading.FMLEnvironment;
import net.neoforged.neoforge.data.event.GatherDataEvent;
import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent;
import net.neoforged.neoforge.fluids.FluidType;
import net.neoforged.neoforge.registries.DeferredHolder;
import net.neoforged.neoforge.registries.DeferredRegister;
Expand All @@ -45,7 +39,6 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Supplier;

public class Regilite {
Expand Down Expand Up @@ -98,6 +91,10 @@ private <T> T registerModule(T module) {
return module;
}

public String modId() {
return modId;
}

public RegiliteLang lang() {
return langModule;
}
Expand Down Expand Up @@ -131,13 +128,9 @@ public void register(IEventBus modbus) {
module.register(modbus);
}

modbus.addListener(new ItemCapabilityEvents(this)::registerCapabilities);
modbus.addListener(new BlockEntityCapabilityEvents(this)::registerCapabilities);

if (FMLEnvironment.dist.isClient()) {
modbus.addListener(new ColorEvents.Items(this)::registerItemColor);
modbus.addListener(this::addCreative);

modbus.addListener(new BlockEntityRendererEvents(this)::registerBER);

modbus.addListener(new FluidRenderTypeEvents(this)::registerRenderTypes);
Expand All @@ -158,10 +151,6 @@ private void onGatherData(GatherDataEvent event) {
event.getGenerator().addProvider(true, provider);
}

public String getModId() {
return modId;
}

public BlockEntityRegistry blockEntityRegistry() {
return BlockEntityRegistry.create(this);
}
Expand All @@ -174,10 +163,6 @@ public FluidRegistry fluidRegistry() {
return FluidRegistry.create(this);
}

public ItemRegistry itemRegistry() {
return ItemRegistry.create(this);
}

public MenuRegistry menuRegistry() {
return MenuRegistry.create(this);
}
Expand Down Expand Up @@ -229,20 +214,4 @@ public void addItems(Collection<DeferredHolder<Item, ? extends Item>> entries) {
public void addMenus(Collection<DeferredHolder<MenuType<?>, ? extends MenuType<?>>> entries) {
this.menus.addAll(entries);
}

public void addCreative(BuildCreativeModeTabContentsEvent event) {
for (DeferredHolder<Item, ? extends Item> item : getItems()) {
if (item instanceof RegiliteItem) {
Consumer<CreativeModeTab.Output> outputConsumer = ((RegiliteItem<Item>)item).getTab().get(event.getTabKey());
if (outputConsumer != null) {
outputConsumer.accept(event);
}
}
}
}

@Deprecated(forRemoval = true, since = "0.1")
public void addTranslation(Supplier<String> key, String translation) {
lang().add(key, translation);
}
}
2 changes: 1 addition & 1 deletion src/main/java/com/enderio/regilite/RegiliteBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
*/
public abstract class RegiliteBuilder<B extends RegiliteBuilder<B, R, T, H>, R, T extends R, H extends DeferredHolder<R, T>> {

private final H holder;
protected final H holder;

protected RegiliteBuilder(H holder) {
this.holder = holder;
Expand Down
41 changes: 30 additions & 11 deletions src/main/java/com/enderio/regilite/blocks/BlockBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,16 @@
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.Item;
import net.minecraft.world.level.block.Block;
import net.neoforged.neoforge.capabilities.BlockCapability;
import net.neoforged.neoforge.capabilities.IBlockCapabilityProvider;
import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent;
import net.neoforged.neoforge.client.model.generators.BlockStateProvider;
import net.neoforged.neoforge.registries.DeferredBlock;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Nullable;

import java.util.ArrayList;
import java.util.List;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Function;
Expand All @@ -33,8 +38,6 @@ public final class BlockBuilder<T extends Block> extends RegiliteBuilder<BlockBu
private final RegiliteTags tagsModule;
private final RegiliteItems itemsModule;

private Supplier<String> descriptionIdSupplier = this::getDescriptionId;

@Nullable
private BiConsumer<RegiliteBlockLootProvider, T> lootTable = RegiliteBlockLootProvider::dropSelf;

Expand All @@ -44,27 +47,22 @@ public final class BlockBuilder<T extends Block> extends RegiliteBuilder<BlockBu
@Nullable
private Supplier<Supplier<BlockColor>> blockColorSupplier;

protected List<AttachedCapability<?, ?>> attachedCapabilityList = new ArrayList<>();

public BlockBuilder(DeferredBlock<T> holder, RegiliteLang langModule, RegiliteTags tagsModule, RegiliteItems itemsModule) {
super(holder);
this.langModule = langModule;
this.tagsModule = tagsModule;
this.itemsModule = itemsModule;

// Default translation
translation(DefaultTranslationUtility.getDefaultTranslationFrom(getId().getPath()));
}

public BlockBuilder<T> translation(String englishTranslation) {
langModule.add(descriptionIdSupplier, englishTranslation);
langModule.addBlock(holder, englishTranslation);
return this;
}

// Do not call directly, use descriptionIdSupplier
@Deprecated
private String getDescriptionId() {
return get().getDescriptionId();
}

public BlockBuilder<T> tag(TagKey<Block> tag) {
tagsModule.blocks().tag(tag).add(this::get);
return this;
Expand All @@ -91,7 +89,7 @@ public BlockBuilder<T> createSimpleBlockItem(Item.Properties properties, Consume

public <I extends BlockItem> BlockBuilder<T> withBlockItem(Function<T, I> function, Consumer<ItemBuilder<I>> itemConfigure) {
var item = itemsModule.create(getId().getPath(), () -> function.apply(this.get()));
itemConfigure.accept(item);
itemConfigure.accept(item.removeTranslation());
return this;
}

Expand Down Expand Up @@ -124,4 +122,25 @@ public BlockBuilder<T> blockColor(@Nullable Supplier<Supplier<BlockColor>> color
public Supplier<Supplier<BlockColor>> blockColor() {
return blockColorSupplier;
}

public <TCap, TContext> BlockBuilder<T> capability(BlockCapability<TCap, TContext> capability, IBlockCapabilityProvider<TCap, TContext> provider) {
attachedCapabilityList.add(new AttachedCapability<>(capability, provider));
return this;
}

@ApiStatus.Internal
public void attachCapabilities(RegisterCapabilitiesEvent event) {
for (var attachedCapability : attachedCapabilityList) {
attachedCapability.registerProvider(event, get());
}
}

protected record AttachedCapability<TCap, TContext>(
BlockCapability<TCap, TContext> capability,
IBlockCapabilityProvider<TCap, TContext> provider) {

private void registerProvider(RegisterCapabilitiesEvent event, Block block) {
event.registerBlock(capability, provider, block);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.fml.loading.FMLEnvironment;
import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent;
import net.neoforged.neoforge.data.event.GatherDataEvent;
import net.neoforged.neoforge.registries.DeferredBlock;
import net.neoforged.neoforge.registries.DeferredRegister;
Expand Down Expand Up @@ -79,7 +80,7 @@ public BlockBuilder<Block> createSimple(String name, BlockBehaviour.Properties p

@ApiStatus.Internal
public static RegiliteBlocks create(Regilite regilite) {
return new RegiliteBlocks(regilite.getModId(), regilite.lang(), regilite.tags(), regilite.items(), regilite.lootTables(), DeferredRegister.createBlocks(regilite.getModId()));
return new RegiliteBlocks(regilite.modId(), regilite.lang(), regilite.tags(), regilite.items(), regilite.lootTables(), DeferredRegister.createBlocks(regilite.modId()));
}

@Override
Expand All @@ -95,6 +96,7 @@ public DeferredRegister.Blocks deferredRegister() {
@Override
public void register(IEventBus modEventBus) {
deferredRegister.register(modEventBus);
modEventBus.addListener(this::onRegisterCapabilities);

lootTablesModule.addLootTableProvider(() -> new LootTableProvider.SubProviderEntry(
prov -> new RegiliteBlockLootProvider(prov, this), LootContextParamSets.BLOCK));
Expand All @@ -104,6 +106,10 @@ public void register(IEventBus modEventBus) {
}
}

private void onRegisterCapabilities(RegisterCapabilitiesEvent event) {
blockBuilders().forEach(blockBuilder -> blockBuilder.attachCapabilities(event));
}

@Override
public void gatherProviders(GatherDataEvent event, Consumer<DataProvider> addProvider) {
if (!event.includeClient()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,8 @@
import net.minecraft.data.CachedOutput;
import net.minecraft.data.DataProvider;
import net.minecraft.data.PackOutput;
import net.minecraft.data.loot.LootTableProvider;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent;
import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.neoforge.common.data.ExistingFileHelper;
import net.neoforged.neoforge.data.event.GatherDataEvent;
Expand All @@ -30,7 +28,7 @@ public class RegiliteDataProvider implements DataProvider {
private final Regilite regilite;

public RegiliteDataProvider(Regilite regilite) {
this.modid = regilite.getModId();
this.modid = regilite.modId();
this.regilite = regilite;
}

Expand Down Expand Up @@ -68,7 +66,6 @@ void onGatherData(GatherDataEvent event) {

this.subProviders.add(new RegiliteTagProvider<>(packOutput, Registries.BLOCK_ENTITY_TYPE, b -> b.builtInRegistryHolder().key(), registries, modid, existingFileHelper, regilite.getBlockEntities()));

this.subProviders.add(new RegiliteItemModelProvider(packOutput, modid, existingFileHelper, regilite.getItems()));
event.getGenerator().addProvider(true, this);
}
}
35 changes: 0 additions & 35 deletions src/main/java/com/enderio/regilite/events/ColorEvents.java

This file was deleted.

Loading

0 comments on commit f7bd889

Please sign in to comment.