MutableBlockEntityType
This commit is contained in:
parent
fb51ad6536
commit
b1e140dfca
6 changed files with 69 additions and 13 deletions
|
@ -0,0 +1,57 @@
|
||||||
|
package org.dimdev.dimdoors.api.block.entity;
|
||||||
|
|
||||||
|
import com.mojang.datafixers.types.Type;
|
||||||
|
import net.fabricmc.fabric.mixin.lookup.BlockEntityTypeAccessor;
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.block.entity.BlockEntity;
|
||||||
|
import net.minecraft.block.entity.BlockEntityType;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public class MutableBlockEntityType<T extends BlockEntity> extends BlockEntityType<T> {
|
||||||
|
|
||||||
|
public MutableBlockEntityType(BlockEntityFactory<? extends T> factory, Set<Block> blocks, Type<?> type) {
|
||||||
|
// ensure that the Set is mutable
|
||||||
|
super(factory, new HashSet<>(blocks), type);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean addBlock(Block block) {
|
||||||
|
return ((BlockEntityTypeAccessor) this).getBlocks().add(block);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean removeBlock(Block block) {
|
||||||
|
return ((BlockEntityTypeAccessor) this).getBlocks().remove(block);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static final class Builder<T extends BlockEntity> {
|
||||||
|
private final BlockEntityFactory<? extends T> factory;
|
||||||
|
private final Set<Block> blocks;
|
||||||
|
|
||||||
|
private Builder(BlockEntityFactory<? extends T> factory, Set<Block> blocks) {
|
||||||
|
this.factory = factory;
|
||||||
|
this.blocks = blocks;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T extends BlockEntity> Builder<T> create(BlockEntityFactory<? extends T> factory, Block... blocks) {
|
||||||
|
// ensure mutability
|
||||||
|
return new Builder<>(factory, new HashSet<>(Arrays.asList(blocks)));
|
||||||
|
}
|
||||||
|
|
||||||
|
public MutableBlockEntityType<T> build() {
|
||||||
|
return build(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public MutableBlockEntityType<T> build(Type<?> type) {
|
||||||
|
return new MutableBlockEntityType<>(this.factory, this.blocks, type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// exists for convenience so that no access widener for BlockEntityType.BlockEntityFactory is necessary
|
||||||
|
@FunctionalInterface
|
||||||
|
public interface BlockEntityFactory<T extends BlockEntity> extends BlockEntityType.BlockEntityFactory<T> {
|
||||||
|
}
|
||||||
|
}
|
|
@ -60,7 +60,7 @@ public class DimensionalDoorBlockRegistrar {
|
||||||
private void register(Identifier identifier, Block block, BiFunction<AbstractBlock.Settings, Block, ? extends Block> constructor) {
|
private void register(Identifier identifier, Block block, BiFunction<AbstractBlock.Settings, Block, ? extends Block> constructor) {
|
||||||
Identifier gennedId = new Identifier("dimdoors", PREFIX + identifier.getPath());
|
Identifier gennedId = new Identifier("dimdoors", PREFIX + identifier.getPath());
|
||||||
Block newBlock = Registry.register(registry, gennedId, constructor.apply(FabricBlockSettings.copy(block), block));
|
Block newBlock = Registry.register(registry, gennedId, constructor.apply(FabricBlockSettings.copy(block), block));
|
||||||
ModBlockEntityTypes.ENTRANCE_RIFT_BLOCKS.add(newBlock);
|
ModBlockEntityTypes.ENTRANCE_RIFT.addBlock(newBlock);
|
||||||
mappedDoorBlocks.put(gennedId, identifier);
|
mappedDoorBlocks.put(gennedId, identifier);
|
||||||
itemRegistrar.notifyBlockMapped(block, newBlock);
|
itemRegistrar.notifyBlockMapped(block, newBlock);
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,6 @@ import java.util.Optional;
|
||||||
import org.dimdev.dimdoors.DimensionalDoorsInitializer;
|
import org.dimdev.dimdoors.DimensionalDoorsInitializer;
|
||||||
import org.dimdev.dimdoors.block.CoordinateTransformerBlock;
|
import org.dimdev.dimdoors.block.CoordinateTransformerBlock;
|
||||||
import org.dimdev.dimdoors.block.RiftProvider;
|
import org.dimdev.dimdoors.block.RiftProvider;
|
||||||
import org.dimdev.dimdoors.block.door.data.DoorDataReader;
|
|
||||||
import org.dimdev.dimdoors.api.client.DefaultTransformation;
|
import org.dimdev.dimdoors.api.client.DefaultTransformation;
|
||||||
import org.dimdev.dimdoors.api.client.Transformer;
|
import org.dimdev.dimdoors.api.client.Transformer;
|
||||||
import org.dimdev.dimdoors.item.RiftKeyItem;
|
import org.dimdev.dimdoors.item.RiftKeyItem;
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package org.dimdev.dimdoors.block.entity;
|
package org.dimdev.dimdoors.block.entity;
|
||||||
|
|
||||||
import org.apache.commons.lang3.ArrayUtils;
|
import org.apache.commons.lang3.ArrayUtils;
|
||||||
|
import org.dimdev.dimdoors.api.block.entity.MutableBlockEntityType;
|
||||||
import org.dimdev.dimdoors.block.ModBlocks;
|
import org.dimdev.dimdoors.block.ModBlocks;
|
||||||
import org.dimdev.dimdoors.block.door.data.DoorData;
|
import org.dimdev.dimdoors.block.door.data.DoorData;
|
||||||
|
|
||||||
|
@ -16,23 +17,25 @@ import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
public class ModBlockEntityTypes {
|
public class ModBlockEntityTypes {
|
||||||
// needed for the autogen doors
|
|
||||||
public static final Set<Block> ENTRANCE_RIFT_BLOCKS = new HashSet<>(Arrays.asList(ArrayUtils.add(DoorData.DOORS.toArray(new Block[0]), ModBlocks.DIMENSIONAL_PORTAL)));
|
|
||||||
|
|
||||||
public static final BlockEntityType<DetachedRiftBlockEntity> DETACHED_RIFT = register(
|
public static final BlockEntityType<DetachedRiftBlockEntity> DETACHED_RIFT = register(
|
||||||
"dimdoors:detached_rift",
|
"dimdoors:detached_rift",
|
||||||
DetachedRiftBlockEntity::new,
|
DetachedRiftBlockEntity::new,
|
||||||
ModBlocks.DETACHED_RIFT);
|
ModBlocks.DETACHED_RIFT);
|
||||||
|
|
||||||
public static final BlockEntityType<EntranceRiftBlockEntity> ENTRANCE_RIFT = Registry.register(
|
public static final MutableBlockEntityType<EntranceRiftBlockEntity> ENTRANCE_RIFT = registerMutable(
|
||||||
Registry.BLOCK_ENTITY_TYPE,
|
|
||||||
"dimdoors:entrance_rift",
|
"dimdoors:entrance_rift",
|
||||||
new BlockEntityType<>(EntranceRiftBlockEntity::new, ENTRANCE_RIFT_BLOCKS, null));
|
EntranceRiftBlockEntity::new,
|
||||||
|
ArrayUtils.add(DoorData.DOORS.toArray(new Block[0]), ModBlocks.DIMENSIONAL_PORTAL));
|
||||||
|
|
||||||
|
|
||||||
private static <E extends BlockEntity> BlockEntityType<E> register(String id, FabricBlockEntityTypeBuilder.Factory<E> factory, Block... blocks) {
|
private static <E extends BlockEntity> BlockEntityType<E> register(String id, FabricBlockEntityTypeBuilder.Factory<E> factory, Block... blocks) {
|
||||||
return Registry.register(Registry.BLOCK_ENTITY_TYPE, id, FabricBlockEntityTypeBuilder.create(factory, blocks).build());
|
return Registry.register(Registry.BLOCK_ENTITY_TYPE, id, FabricBlockEntityTypeBuilder.create(factory, blocks).build());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static <E extends BlockEntity> MutableBlockEntityType<E> registerMutable(String id, MutableBlockEntityType.BlockEntityFactory<E> factory, Block... blocks) {
|
||||||
|
return Registry.register(Registry.BLOCK_ENTITY_TYPE, id, MutableBlockEntityType.Builder.create(factory, blocks).build());
|
||||||
|
}
|
||||||
|
|
||||||
public static void init() {
|
public static void init() {
|
||||||
//just loads the class
|
//just loads the class
|
||||||
}
|
}
|
||||||
|
|
|
@ -97,10 +97,6 @@ public class DimensionalDoorItemRegistrar {
|
||||||
private void register(Identifier identifier, Item dimItem) {
|
private void register(Identifier identifier, Item dimItem) {
|
||||||
Identifier gennedId = new Identifier("dimdoors", PREFIX + identifier.getPath());
|
Identifier gennedId = new Identifier("dimdoors", PREFIX + identifier.getPath());
|
||||||
Registry.register(registry, gennedId, dimItem);
|
Registry.register(registry, gennedId, dimItem);
|
||||||
|
|
||||||
//if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) {
|
|
||||||
//BlockRenderLayerMap.INSTANCE.putBlock(newBlock, RenderLayer.getCutout());
|
|
||||||
//}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -3,4 +3,5 @@ accessWidener v1 named
|
||||||
# Because its package private
|
# Because its package private
|
||||||
accessible class net/minecraft/client/render/RenderLayer$MultiPhase
|
accessible class net/minecraft/client/render/RenderLayer$MultiPhase
|
||||||
|
|
||||||
accessible class net/minecraft/block/entity/BlockEntityType$BlockEntityFactory
|
# for MutableBlockEntityType
|
||||||
|
extendable class net/minecraft/block/entity/BlockEntityType$BlockEntityFactory
|
||||||
|
|
Loading…
Reference in a new issue