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 net.minecraft.world.level.block.state.properties.DoubleBlockHalf;
import org.dimdev.dimdoors.api.event.ChunkServedCallback; import org.dimdev.dimdoors.api.event.ChunkServedCallback;
import org.dimdev.dimdoors.api.event.UseItemOnBlockCallback; 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.ModBlocks;
import org.dimdev.dimdoors.block.door.DimensionalDoorBlockRegistrar; import org.dimdev.dimdoors.block.door.DimensionalDoorBlockRegistrar;
import org.dimdev.dimdoors.block.entity.DetachedRiftBlockEntity; 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)) { if (!world.isClientSide && state.getValue(WATERLOGGED)) {
world.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world)); 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); world.gameEvent(player, this.isOpen(state) ? GameEvent.BLOCK_OPEN : GameEvent.BLOCK_CLOSE, pos);
return InteractionResult.SUCCESS; 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.block.state.properties.Property;
import net.minecraft.world.level.storage.loot.LootParams; import net.minecraft.world.level.storage.loot.LootParams;
import org.dimdev.dimdoors.DimensionalDoors; import org.dimdev.dimdoors.DimensionalDoors;
import org.dimdev.dimdoors.api.block.entity.MutableBlockEntityType;
import org.dimdev.dimdoors.block.DoorSoundProvider; 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.ModBlockEntityTypes;
import org.dimdev.dimdoors.block.entity.RiftBlockEntity;
import org.dimdev.dimdoors.item.door.DimensionalDoorItemRegistrar; import org.dimdev.dimdoors.item.door.DimensionalDoorItemRegistrar;
import java.util.*; import java.util.*;
import java.util.function.BiFunction; import java.util.function.BiFunction;
import java.util.function.Supplier;
public class DimensionalDoorBlockRegistrar { public class DimensionalDoorBlockRegistrar {
public static final String PREFIX = "block_ag_dim_"; 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 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) { public DimensionalDoorBlockRegistrar(DimensionalDoorItemRegistrar itemRegistrar) {
this.registry = RegistrarManager.get(DimensionalDoors.MOD_ID).get(Registries.BLOCK); this.registry = RegistrarManager.get(DimensionalDoors.MOD_ID).get(Registries.BLOCK);
this.itemRegistrar = itemRegistrar; this.itemRegistrar = itemRegistrar;
if(Platform.isFabric()) { // if(Platform.isFabric()) {
init(); // init();
} // }
if(Platform.isForge()) {
RegistrarManager.get(DimensionalDoors.MOD_ID).forRegistry(Registries.BLOCK, registrar -> { RegistrarManager.get(DimensionalDoors.MOD_ID).forRegistry(Registries.BLOCK, registrar -> {
new ArrayList<>(registrar.entrySet()).forEach(entry -> handleEntry(registrar, entry.getKey().location(), entry.getValue())); 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() { private void init() {
new ArrayList<>(registry.entrySet()).forEach(entry -> handleEntry(registry, entry.getKey().location(), entry.getValue())); new ArrayList<>(registry.entrySet()).forEach(entry -> handleEntry(registry, entry.getKey().location(), entry.getValue()));
} }
public void handleEntry(Registrar<Block> registrar, ResourceLocation ResourceLocation, Block original) { public void handleEntry(Registrar<Block> registrar, ResourceLocation location, Block original) {
if (DimensionalDoors.getConfig().getDoorsConfig().isAllowed(ResourceLocation)) { if (DimensionalDoors.getConfig().getDoorsConfig().isAllowed(location)) {
if (!(original instanceof DimensionalDoorBlock) && original instanceof DoorBlock doorBlock) { 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) { } 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. // 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); 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) { public boolean isMapped(ResourceLocation ResourceLocation) {
return mappedDoorBlocks.containsKey(ResourceLocation); return mappedDoorBlocks.containsKey(ResourceLocation);
} }

View file

@ -1,5 +1,6 @@
package org.dimdev.dimdoors.block.entity; package org.dimdev.dimdoors.block.entity;
import dev.architectury.registry.registries.RegistrySupplier;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
import net.minecraft.core.BlockPos; 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.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.dimdev.dimdoors.DimensionalDoors; 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.DefaultTransformation;
import org.dimdev.dimdoors.api.client.Transformer; import org.dimdev.dimdoors.api.client.Transformer;
import org.dimdev.dimdoors.api.util.EntityUtils; import org.dimdev.dimdoors.api.util.EntityUtils;

View file

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

View file

@ -1,8 +1,6 @@
package org.dimdev.dimdoors.compat.iris; package org.dimdev.dimdoors.compat.iris;
import net.irisshaders.iris.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; import org.dimdev.dimdoors.client.ShaderPackDetector;
public class IrisCompat implements ShaderPackDetector { public class IrisCompat implements ShaderPackDetector {

View file

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