From 19eb8384088efee8962fa3059505fe679ae66e4b Mon Sep 17 00:00:00 2001 From: ferriarnus <61201275+ferriarnus@users.noreply.github.com> Date: Sat, 30 Dec 2023 15:56:28 +0100 Subject: [PATCH] add entity and block entity --- .../registry/EnderBlockEntityRegistry.java | 59 ++++++++++++++--- .../registry/EnderDeferredBlockEntity.java | 22 ++++++- .../registry/EnderDeferredEntity.java | 43 ++++++++++++ .../registry/EnderEntityRegistry.java | 65 +++++++++++++++++++ 4 files changed, 178 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/example/examplemod/registry/EnderDeferredEntity.java create mode 100644 src/main/java/com/example/examplemod/registry/EnderEntityRegistry.java diff --git a/src/main/java/com/example/examplemod/registry/EnderBlockEntityRegistry.java b/src/main/java/com/example/examplemod/registry/EnderBlockEntityRegistry.java index ebf001a..c7e3ccd 100644 --- a/src/main/java/com/example/examplemod/registry/EnderBlockEntityRegistry.java +++ b/src/main/java/com/example/examplemod/registry/EnderBlockEntityRegistry.java @@ -1,14 +1,28 @@ package com.example.examplemod.registry; +import com.example.examplemod.data.EnderDataProvider; +import com.example.examplemod.data.EnderItemModelProvider; +import com.example.examplemod.data.EnderTagProvider; +import com.example.examplemod.events.ColorEvents; +import com.example.examplemod.mixin.DeferredRegisterAccessor; +import com.mojang.datafixers.types.Func; +import net.minecraft.core.Registry; import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.fml.loading.FMLEnvironment; import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredRegister; import java.util.Arrays; import java.util.List; +import java.util.Objects; +import java.util.function.Function; import java.util.function.Supplier; public class EnderBlockEntityRegistry extends DeferredRegister> { @@ -17,20 +31,49 @@ protected EnderBlockEntityRegistry(String namespace) { } public EnderDeferredBlockEntity registerBlockEntity(String name, BlockEntityType.BlockEntitySupplier sup, Block... blocks) { - DeferredHolder, BlockEntityType> holder = this.register(name, () -> BlockEntityType.Builder.of(sup, blocks).build(null)); - return EnderDeferredBlockEntity.createBlockEntity(holder); + return this.registerBlockEntity(name, () -> BlockEntityType.Builder.of(sup, blocks).build(null)); } + private EnderDeferredBlockEntity registerBlockEntity(String name, Function> func) { + Objects.requireNonNull(name); + Objects.requireNonNull(func); + final ResourceLocation key = new ResourceLocation(getNamespace(), name); + + EnderDeferredBlockEntity ret = createBlockEntityHolder(getRegistryKey(), key); + + if (((DeferredRegisterAccessor>)this).getEntries().putIfAbsent(ret, () -> func.apply(key)) != null) { + throw new IllegalArgumentException("Duplicate registration " + name); + } + + return ret; + } + + //TODO steam mess, can this be cleaner? @SafeVarargs - public final EnderDeferredBlockEntity registerBlockEntity(String name, BlockEntityType.BlockEntitySupplier sup, - Supplier... blocks) { - List blockList = Arrays.stream(blocks).map(Supplier::get).toList(); - DeferredHolder, BlockEntityType> holder = this.register(name, () -> BlockEntityType.Builder.of(sup, blockList.toArray(new Block[] {})).build(null)); - return EnderDeferredBlockEntity.createBlockEntity(holder); + public final EnderDeferredBlockEntity registerBlockEntity(String name, BlockEntityType.BlockEntitySupplier sup, Supplier... blocks) { + return this.registerBlockEntity(name, () -> BlockEntityType.Builder.of(sup, Arrays.stream(blocks).map(Supplier::get).toList().toArray(new Block[] {})).build(null)); + } + + public EnderDeferredBlockEntity registerBlockEntity(String name, Supplier> supplier) { + return this.registerBlockEntity(name, key -> supplier.get()); + } + + protected EnderDeferredBlockEntity createBlockEntityHolder(ResourceKey>> registryKey, ResourceLocation key) { + return new EnderDeferredBlockEntity<>(ResourceKey.create(registryKey, key)); } - public static EnderBlockEntityRegistry create(String modid) { + public static EnderBlockEntityRegistry create(String modid) { return new EnderBlockEntityRegistry(modid); } + @Override + public void register(IEventBus bus) { + super.register(bus); + this.onGatherData(); + } + + private void onGatherData() { + EnderDataProvider provider = EnderDataProvider.getInstance(getNamespace()); + provider.addServerSubProvider((packOutput, existingFileHelper, lookup) -> new EnderTagProvider<>(packOutput, this.getRegistryKey(), b -> b.builtInRegistryHolder().key(), lookup, getNamespace(), existingFileHelper, this)); + } } diff --git a/src/main/java/com/example/examplemod/registry/EnderDeferredBlockEntity.java b/src/main/java/com/example/examplemod/registry/EnderDeferredBlockEntity.java index 6154bd0..add1671 100644 --- a/src/main/java/com/example/examplemod/registry/EnderDeferredBlockEntity.java +++ b/src/main/java/com/example/examplemod/registry/EnderDeferredBlockEntity.java @@ -3,14 +3,19 @@ import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.neoforged.neoforge.registries.DeferredHolder; import javax.annotation.Nullable; +import java.util.HashSet; +import java.util.Set; -public class EnderDeferredBlockEntity extends DeferredHolder, BlockEntityType> { +public class EnderDeferredBlockEntity extends DeferredHolder, BlockEntityType> implements ITagagble> { + protected Set>> BlockEntityTags = new HashSet<>(); /** * Creates a new DeferredHolder with a ResourceKey. @@ -26,12 +31,23 @@ protected EnderDeferredBlockEntity(ResourceKey EnderDeferredBlockEntity createBlockEntity(DeferredHolder, BlockEntityType> holder) { - return new EnderDeferredBlockEntity<>(holder.getKey()); + public static EnderDeferredBlockEntity createBlockEntity(ResourceKey> key) { + return new EnderDeferredBlockEntity<>(key); } @Nullable public T create(BlockPos pos, BlockState state) { return this.get().create(pos, state); } + + @Override + public Set>> getTags() { + return this.BlockEntityTags; + } + + @SafeVarargs + public final EnderDeferredBlockEntity addBlockEntityTagsTags(TagKey>... tags) { + BlockEntityTags.addAll(Set.of(tags)); + return this; + } } diff --git a/src/main/java/com/example/examplemod/registry/EnderDeferredEntity.java b/src/main/java/com/example/examplemod/registry/EnderDeferredEntity.java new file mode 100644 index 0000000..b13ebc1 --- /dev/null +++ b/src/main/java/com/example/examplemod/registry/EnderDeferredEntity.java @@ -0,0 +1,43 @@ +package com.example.examplemod.registry; + +import com.example.examplemod.data.EnderDataProvider; +import net.minecraft.resources.ResourceKey; +import net.minecraft.tags.TagKey; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.neoforged.neoforge.registries.DeferredHolder; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashSet; +import java.util.Set; +import java.util.function.Supplier; + +public class EnderDeferredEntity extends DeferredHolder, EntityType> implements ITagagble>{ + private final Set>> entityTags = new HashSet<>(); + private final Supplier supplier = () -> get().getDescriptionId(); + + protected EnderDeferredEntity(ResourceKey> key) { + super(key); + EnderDataProvider.getInstance(getId().getNamespace()).addTranslation(supplier, StringUtils.capitalize(getId().getPath().replace('_', ' '))); + } + + @Override + public Set>> getTags() { + return null; + } + + public static EnderDeferredEntity createBlockEntity(ResourceKey> key) { + return new EnderDeferredEntity<>(key); + } + + @SafeVarargs + public final EnderDeferredEntity addEntityTags(TagKey>... tags) { + this.entityTags.addAll(Set.of(tags)); + return this; + } + + public EnderDeferredEntity setTranslation(String translation) { + EnderDataProvider.getInstance(getId().getNamespace()).addTranslation(supplier, translation); + return this; + } +} diff --git a/src/main/java/com/example/examplemod/registry/EnderEntityRegistry.java b/src/main/java/com/example/examplemod/registry/EnderEntityRegistry.java new file mode 100644 index 0000000..b7c8762 --- /dev/null +++ b/src/main/java/com/example/examplemod/registry/EnderEntityRegistry.java @@ -0,0 +1,65 @@ +package com.example.examplemod.registry; + +import com.example.examplemod.data.EnderDataProvider; +import com.example.examplemod.data.EnderTagProvider; +import com.example.examplemod.mixin.DeferredRegisterAccessor; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MobCategory; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.registries.DeferredRegister; + +import java.util.Objects; +import java.util.function.Function; +import java.util.function.Supplier; + +public class EnderEntityRegistry extends DeferredRegister> { + protected EnderEntityRegistry(String namespace) { + super(BuiltInRegistries.ENTITY_TYPE.key(), namespace); + } + + private EnderDeferredEntity registerEntity(String name, Function> func) { + Objects.requireNonNull(name); + Objects.requireNonNull(func); + final ResourceLocation key = new ResourceLocation(getNamespace(), name); + + EnderDeferredEntity ret = createEntityHolder(getRegistryKey(), key); + + if (((DeferredRegisterAccessor>)this).getEntries().putIfAbsent(ret, () -> func.apply(key)) != null) { + throw new IllegalArgumentException("Duplicate registration " + name); + } + + return ret; + } + + public EnderDeferredEntity registerEntity(String name, EntityType.EntityFactory sup, MobCategory category) { + return this.registerEntity(name, () -> EntityType.Builder.of(sup, category).build(name)); + } + + public EnderDeferredEntity registerEntity(String name, Supplier> supplier) { + return this.registerEntity(name, key -> supplier.get()); + } + + protected EnderDeferredEntity createEntityHolder(ResourceKey>> registryKey, ResourceLocation key) { + return new EnderDeferredEntity<>(ResourceKey.create(registryKey, key)); + } + + public static EnderEntityRegistry create(String modid) { + return new EnderEntityRegistry(modid); + } + + @Override + public void register(IEventBus bus) { + super.register(bus); + onGatherData(); + } + + private void onGatherData() { + EnderDataProvider provider = EnderDataProvider.getInstance(getNamespace()); + provider.addServerSubProvider((packOutput, existingFileHelper, lookup) -> new EnderTagProvider<>(packOutput, this.getRegistryKey(), b -> b.builtInRegistryHolder().key(), lookup, getNamespace(), existingFileHelper, this)); + } +}