Add ability to add custom door autogen logic
This commit is contained in:
parent
4be44752a2
commit
0bc99b2c9c
7 changed files with 49 additions and 16 deletions
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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.*;
|
||||||
|
|
Loading…
Reference in a new issue