Add ability to add custom door autogen logic

This commit is contained in:
Waterpicker 2024-05-13 21:19:12 -05:00
parent 4be44752a2
commit 0bc99b2c9c
7 changed files with 49 additions and 16 deletions

View file

@ -24,7 +24,6 @@ import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.properties.DoubleBlockHalf;
import org.dimdev.dimdoors.api.event.ChunkServedCallback;
import org.dimdev.dimdoors.api.event.UseItemOnBlockCallback;
import org.dimdev.dimdoors.api.util.StreamUtils;
import org.dimdev.dimdoors.block.ModBlocks;
import org.dimdev.dimdoors.block.door.DimensionalDoorBlockRegistrar;
import org.dimdev.dimdoors.block.entity.DetachedRiftBlockEntity;

View file

@ -130,7 +130,7 @@ public class DimensionalDoorBlock extends WaterLoggableDoorBlock implements Rift
if (!world.isClientSide && state.getValue(WATERLOGGED)) {
world.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world));
}
this.playSound(player, world, pos, (Boolean)state.getValue(OPEN));
this.playSound(player, world, pos, state.getValue(OPEN));
world.gameEvent(player, this.isOpen(state) ? GameEvent.BLOCK_OPEN : GameEvent.BLOCK_CLOSE, pos);
return InteractionResult.SUCCESS;
}

View file

@ -24,12 +24,16 @@ import net.minecraft.world.level.block.state.StateDefinition;
import net.minecraft.world.level.block.state.properties.Property;
import net.minecraft.world.level.storage.loot.LootParams;
import org.dimdev.dimdoors.DimensionalDoors;
import org.dimdev.dimdoors.api.block.entity.MutableBlockEntityType;
import org.dimdev.dimdoors.block.DoorSoundProvider;
import org.dimdev.dimdoors.block.entity.EntranceRiftBlockEntity;
import org.dimdev.dimdoors.block.entity.ModBlockEntityTypes;
import org.dimdev.dimdoors.block.entity.RiftBlockEntity;
import org.dimdev.dimdoors.item.door.DimensionalDoorItemRegistrar;
import java.util.*;
import java.util.function.BiFunction;
import java.util.function.Supplier;
public class DimensionalDoorBlockRegistrar {
public static final String PREFIX = "block_ag_dim_";
@ -39,29 +43,53 @@ public class DimensionalDoorBlockRegistrar {
private final BiMap<ResourceLocation, ResourceLocation> mappedDoorBlocks = HashBiMap.create();
private final Map<ResourceLocation, AutoGenLogic<? extends RiftBlockEntity>> customDoorFunction = new HashMap<>();
public record AutoGenLogic<T extends RiftBlockEntity>(Supplier<MutableBlockEntityType<T>> blockEntityType, BiFunction<BlockBehaviour.Properties, DoorSoundProvider, Block> function) {
public void register(Block block) {
blockEntityType.get().addBlock(block);
}
}
private static AutoGenLogic<EntranceRiftBlockEntity> defaultLogic = new AutoGenLogic<>(ModBlockEntityTypes.ENTRANCE_RIFT, DimensionalDoorBlockRegistrar::createAutoGenDimensionalDoorBlock);
public DimensionalDoorBlockRegistrar(DimensionalDoorItemRegistrar itemRegistrar) {
this.registry = RegistrarManager.get(DimensionalDoors.MOD_ID).get(Registries.BLOCK);
this.itemRegistrar = itemRegistrar;
if(Platform.isFabric()) {
init();
}
// if(Platform.isFabric()) {
// init();
// }
if(Platform.isForge()) {
RegistrarManager.get(DimensionalDoors.MOD_ID).forRegistry(Registries.BLOCK, registrar -> {
new ArrayList<>(registrar.entrySet()).forEach(entry -> handleEntry(registrar, entry.getKey().location(), entry.getValue()));
});
}
LifecycleEvent.SETUP.register(() -> mappedDoorBlocks.keySet().stream().map(BuiltInRegistries.BLOCK::get).forEach(a -> ModBlockEntityTypes.ENTRANCE_RIFT.get().addBlock(a)));
LifecycleEvent.SETUP.register(() -> {
if(Platform.isFabric()) {
RegistrarManager.get(DimensionalDoors.MOD_ID).forRegistry(Registries.BLOCK, registrar -> {
new ArrayList<>(registrar.entrySet()).forEach(entry -> handleEntry(registrar, entry.getKey().location(), entry.getValue()));
}); }
mappedDoorBlocks.keySet().forEach(location -> {
var block = BuiltInRegistries.BLOCK.get(location);
var logic = customDoorFunction.getOrDefault(location, defaultLogic);
logic.register(block);
});
});
}
private void init() {
new ArrayList<>(registry.entrySet()).forEach(entry -> handleEntry(registry, entry.getKey().location(), entry.getValue()));
}
public void handleEntry(Registrar<Block> registrar, ResourceLocation ResourceLocation, Block original) {
if (DimensionalDoors.getConfig().getDoorsConfig().isAllowed(ResourceLocation)) {
public void handleEntry(Registrar<Block> registrar, ResourceLocation location, Block original) {
if (DimensionalDoors.getConfig().getDoorsConfig().isAllowed(location)) {
if (!(original instanceof DimensionalDoorBlock) && original instanceof DoorBlock doorBlock) {
register(registrar, ResourceLocation, doorBlock, DimensionalDoorBlockRegistrar::createAutoGenDimensionalDoorBlock);
System.out.println("Rare -> Registering: " + location);
register(registrar, location, doorBlock, customDoorFunction.getOrDefault(location, defaultLogic).function());
} else if (!(original instanceof DimensionalTrapdoorBlock) && original instanceof TrapDoorBlock trapdoorBlock) {
// register(registrar, ResourceLocation, trapdoorBlock, DimensionalDoorBlockRegistrar::createAutoGenDimensionalTrapdoorBlock); //TODO: readd once plan for handling trapdoors is figured out.
}
@ -91,6 +119,10 @@ public class DimensionalDoorBlockRegistrar {
return mappedDoorBlocks.get(ResourceLocation);
}
public <T extends DoorBlock, K extends RiftBlockEntity> void registerCustomDoorLogic(ResourceLocation id, AutoGenLogic<K> logic) {
customDoorFunction.putIfAbsent(id, logic);
}
public boolean isMapped(ResourceLocation ResourceLocation) {
return mappedDoorBlocks.containsKey(ResourceLocation);
}

View file

@ -1,5 +1,6 @@
package org.dimdev.dimdoors.block.entity;
import dev.architectury.registry.registries.RegistrySupplier;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.core.BlockPos;
@ -18,6 +19,7 @@ import net.minecraft.world.phys.Vec3;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.dimdev.dimdoors.DimensionalDoors;
import org.dimdev.dimdoors.api.block.entity.MutableBlockEntityType;
import org.dimdev.dimdoors.api.client.DefaultTransformation;
import org.dimdev.dimdoors.api.client.Transformer;
import org.dimdev.dimdoors.api.util.EntityUtils;

View file

@ -63,7 +63,7 @@ public class DimensionalDoorsClient {
public static void init() {
ClientPlayerEvent.CLIENT_PLAYER_JOIN.register((handler) -> ClientPacketHandler.sendPacket(new NetworkHandlerInitializedC2SPacket()));
if(Platform.isModLoaded("iris") || Platform.isModLoaded("oculus")) detector = new IrisCompat();
registerCompats();
MenuRegistry.registerScreenFactory(ModScreenHandlerTypes.TESSELATING_LOOM.get(), TesselatingLoomScreen::new);
// ModFluids.initClient();
@ -83,6 +83,10 @@ public class DimensionalDoorsClient {
// ModRecipeBookGroups.init();
}
private static void registerCompats() {
if(Platform.isModLoaded("iris") || Platform.isModLoaded("oculus")) detector = new IrisCompat();
}
@Environment(EnvType.CLIENT)
public static void initEntitiesClient(BiConsumer<EntityType, EntityRendererProvider> consumer) {
consumer.accept(ModEntityTypes.MONOLITH.get(), MonolithRenderer::new);

View file

@ -1,8 +1,6 @@
package org.dimdev.dimdoors.compat.iris;
import net.irisshaders.iris.Iris;
import net.irisshaders.iris.api.v0.IrisApi;
import net.irisshaders.iris.api.v0.IrisApiConfig;
import org.dimdev.dimdoors.client.ShaderPackDetector;
public class IrisCompat implements ShaderPackDetector {

View file

@ -7,11 +7,9 @@ import dev.architectury.registry.registries.RegistrarManager;
import dev.architectury.utils.Env;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.resources.language.I18n;
import net.minecraft.core.registries.Registries;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.item.*;