Datapack driven limbo decay!

This commit is contained in:
Waterpicker 2021-10-03 08:38:40 -05:00
parent f2bba1a227
commit 809c686618
58 changed files with 1235 additions and 143 deletions

View file

@ -9,6 +9,7 @@ import org.dimdev.dimdoors.criteria.ModCriteria;
import org.dimdev.dimdoors.item.ModItems;
import net.minecraft.Bootstrap;
import net.minecraft.SharedConstants;
import net.minecraft.data.DataGenerator;
import net.fabricmc.loader.api.entrypoint.PreLaunchEntrypoint;
@ -24,6 +25,7 @@ public class DatagenInitializer implements PreLaunchEntrypoint {
@Override
public void onPreLaunch() {
try {
SharedConstants.createGameVersion();
Bootstrap.initialize();
DimensionalDoorsInitializer.registerRegistries();
ModBlocks.init();
@ -35,6 +37,7 @@ public class DatagenInitializer implements PreLaunchEntrypoint {
dataGenerator.install(new LootTableProvider(dataGenerator));
dataGenerator.install(RECIPE_CONSUMER = new RecipeConsumer(dataGenerator));
dataGenerator.install(LOOT_TABLE_CONSUMER = new LootTableConsumer(dataGenerator));
dataGenerator.install(new LimboDecayProvider(dataGenerator));
dataGenerator.run();
} catch (Exception e) {
throw new RuntimeException(e);

View file

@ -0,0 +1,188 @@
package org.dimdev.dimdoors.datagen;
import static net.minecraft.block.Blocks.ACACIA_LOG;
import static net.minecraft.block.Blocks.ACACIA_PLANKS;
import static net.minecraft.block.Blocks.ACACIA_WOOD;
import static net.minecraft.block.Blocks.ANDESITE;
import static net.minecraft.block.Blocks.BIRCH_LOG;
import static net.minecraft.block.Blocks.BIRCH_PLANKS;
import static net.minecraft.block.Blocks.BIRCH_WOOD;
import static net.minecraft.block.Blocks.BLACKSTONE;
import static net.minecraft.block.Blocks.COAL_BLOCK;
import static net.minecraft.block.Blocks.COAL_ORE;
import static net.minecraft.block.Blocks.COBBLESTONE;
import static net.minecraft.block.Blocks.CRACKED_STONE_BRICKS;
import static net.minecraft.block.Blocks.DARK_OAK_LOG;
import static net.minecraft.block.Blocks.DARK_OAK_PLANKS;
import static net.minecraft.block.Blocks.DARK_OAK_WOOD;
import static net.minecraft.block.Blocks.DIORITE;
import static net.minecraft.block.Blocks.DIRT;
import static net.minecraft.block.Blocks.DIRT_PATH;
import static net.minecraft.block.Blocks.EMERALD_BLOCK;
import static net.minecraft.block.Blocks.EMERALD_ORE;
import static net.minecraft.block.Blocks.END_STONE;
import static net.minecraft.block.Blocks.END_STONE_BRICKS;
import static net.minecraft.block.Blocks.FARMLAND;
import static net.minecraft.block.Blocks.GLASS;
import static net.minecraft.block.Blocks.GOLD_BLOCK;
import static net.minecraft.block.Blocks.GOLD_ORE;
import static net.minecraft.block.Blocks.GRANITE;
import static net.minecraft.block.Blocks.GRASS_BLOCK;
import static net.minecraft.block.Blocks.GRAVEL;
import static net.minecraft.block.Blocks.IRON_BLOCK;
import static net.minecraft.block.Blocks.IRON_ORE;
import static net.minecraft.block.Blocks.JUNGLE_LOG;
import static net.minecraft.block.Blocks.JUNGLE_PLANKS;
import static net.minecraft.block.Blocks.JUNGLE_WOOD;
import static net.minecraft.block.Blocks.LAPIS_BLOCK;
import static net.minecraft.block.Blocks.LAPIS_ORE;
import static net.minecraft.block.Blocks.OAK_LOG;
import static net.minecraft.block.Blocks.OAK_PLANKS;
import static net.minecraft.block.Blocks.OAK_WOOD;
import static net.minecraft.block.Blocks.PODZOL;
import static net.minecraft.block.Blocks.POLISHED_ANDESITE;
import static net.minecraft.block.Blocks.POLISHED_BLACKSTONE;
import static net.minecraft.block.Blocks.POLISHED_DIORITE;
import static net.minecraft.block.Blocks.POLISHED_GRANITE;
import static net.minecraft.block.Blocks.REDSTONE_BLOCK;
import static net.minecraft.block.Blocks.REDSTONE_ORE;
import static net.minecraft.block.Blocks.SAND;
import static net.minecraft.block.Blocks.SANDSTONE;
import static net.minecraft.block.Blocks.SPRUCE_LOG;
import static net.minecraft.block.Blocks.SPRUCE_PLANKS;
import static net.minecraft.block.Blocks.SPRUCE_WOOD;
import static net.minecraft.block.Blocks.STONE;
import static net.minecraft.block.Blocks.STONE_BRICKS;
import static org.dimdev.dimdoors.block.ModBlocks.UNRAVELLED_FABRIC;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.dimdev.dimdoors.world.decay.DecayPattern;
import org.dimdev.dimdoors.world.decay.DecayPredicate;
import org.dimdev.dimdoors.world.decay.DecayProcessor;
import org.dimdev.dimdoors.world.decay.predicates.SimpleDecayPredicate;
import org.dimdev.dimdoors.world.decay.processors.SimpleDecayProcesor;
import net.minecraft.block.Block;
import net.minecraft.block.Blocks;
import net.minecraft.data.DataCache;
import net.minecraft.data.DataGenerator;
import net.minecraft.data.DataProvider;
import net.minecraft.loot.LootManager;
import net.minecraft.util.Identifier;
import java.io.IOException;
import java.nio.file.Path;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
public class LimboDecayProvider implements DataProvider {
private static final Logger LOGGER = LogManager.getLogger();
private static final Gson GSON = (new GsonBuilder()).setPrettyPrinting().disableHtmlEscaping().create();
private final DataGenerator generator;
public LimboDecayProvider(DataGenerator generator) {
this.generator = generator;
}
@Override
public void run(DataCache cache) throws IOException {
Path path = this.generator.getOutput();
BiConsumer<Identifier, JsonObject> consumer = (identifier, json) -> {
Path outputPath = getOutput(path, identifier);
try {
DataProvider.writeToPath(GSON, cache, json, outputPath);
} catch (IOException var6) {
LOGGER.error("Couldn't save decay pattern {}", outputPath, var6);
}
};
createSimplePattern(new Identifier("dimdoors:stone"), STONE, COBBLESTONE).run(consumer);
createSimplePattern(new Identifier("dimdoors:cobblestone"), COBBLESTONE, END_STONE).run(consumer);
createSimplePattern(new Identifier("dimdoors:gravel"), GRAVEL, SAND).run(consumer);
createSimplePattern(new Identifier("dimdoors:sand"), SAND, UNRAVELLED_FABRIC).run(consumer);
createSimplePattern(new Identifier("dimdoors:glass"), GLASS, SAND).run(consumer);
createSimplePattern(new Identifier("dimdoors:grass_block"), GRASS_BLOCK, DIRT).run(consumer);
createSimplePattern(new Identifier("dimdoors:dirt"), DIRT, SAND).run(consumer);
createSimplePattern(new Identifier("dimdoors:redstone_block"), REDSTONE_BLOCK, REDSTONE_ORE).run(consumer);
createSimplePattern(new Identifier("dimdoors:redstone_ore"), REDSTONE_ORE, STONE).run(consumer);
createSimplePattern(new Identifier("dimdoors:emerald_block"), EMERALD_BLOCK, EMERALD_ORE).run(consumer);
createSimplePattern(new Identifier("dimdoors:emerald_ore"), EMERALD_ORE, STONE).run(consumer);
createSimplePattern(new Identifier("dimdoors:coal_block"), COAL_BLOCK, COAL_ORE).run(consumer);
createSimplePattern(new Identifier("dimdoors:coal_ore"), COAL_ORE, STONE).run(consumer);
createSimplePattern(new Identifier("dimdoors:iron_block"), IRON_BLOCK, IRON_ORE).run(consumer);
createSimplePattern(new Identifier("dimdoors:iron_ore"), IRON_ORE, STONE).run(consumer);
createSimplePattern(new Identifier("dimdoors:lapis_block"), LAPIS_BLOCK, LAPIS_ORE).run(consumer);
createSimplePattern(new Identifier("dimdoors:lapis_ore"), LAPIS_ORE, STONE).run(consumer);
createSimplePattern(new Identifier("dimdoors:gold_block"), GOLD_BLOCK, GOLD_ORE).run(consumer);
createSimplePattern(new Identifier("dimdoors:gold_ore"), GOLD_ORE, STONE).run(consumer);
createSimplePattern(new Identifier("dimdoors:sandstone"), SANDSTONE, SAND).run(consumer);
createSimplePattern(new Identifier("dimdoors:end_stone_bricks"), END_STONE_BRICKS, END_STONE).run(consumer);
createSimplePattern(new Identifier("dimdoors:dirt_path"), DIRT_PATH, DIRT).run(consumer);
createSimplePattern(new Identifier("dimdoors:polished_granite"), POLISHED_GRANITE, GRANITE).run(consumer);
createSimplePattern(new Identifier("dimdoors:polished_andesite"), POLISHED_ANDESITE, ANDESITE).run(consumer);
createSimplePattern(new Identifier("dimdoors:andesite"), ANDESITE, DIORITE).run(consumer);
createSimplePattern(new Identifier("dimdoors:polished_diorite"), POLISHED_DIORITE, DIORITE).run(consumer);
createSimplePattern(new Identifier("dimdoors:granite"), GRANITE, DIORITE).run(consumer);
createSimplePattern(new Identifier("dimdoors:diorite"), DIORITE, COBBLESTONE).run(consumer);
createSimplePattern(new Identifier("dimdoors:polished_blackstone"), POLISHED_BLACKSTONE, BLACKSTONE).run(consumer);
createSimplePattern(new Identifier("dimdoors:blackstone"), BLACKSTONE, COBBLESTONE).run(consumer);
createSimplePattern(new Identifier("dimdoors:podzol"), PODZOL, DIRT).run(consumer);
createSimplePattern(new Identifier("dimdoors:farmland"), FARMLAND, DIRT).run(consumer);
createSimplePattern(new Identifier("dimdoors:stone_bricks"), STONE_BRICKS, CRACKED_STONE_BRICKS).run(consumer);
createSimplePattern(new Identifier("dimdoors:cracked_stone_bricks"), CRACKED_STONE_BRICKS, DIORITE).run(consumer);
createSimplePattern(new Identifier("dimdoors:end_stone"), END_STONE, SAND).run(consumer);
createSimplePattern(new Identifier("dimdoors:oak_log"), OAK_LOG, OAK_PLANKS).run(consumer);
createSimplePattern(new Identifier("dimdoors:birch_log"), BIRCH_LOG, BIRCH_PLANKS).run(consumer);
createSimplePattern(new Identifier("dimdoors:spruce_log"), SPRUCE_LOG, SPRUCE_PLANKS).run(consumer);
createSimplePattern(new Identifier("dimdoors:jungle_log"), JUNGLE_LOG, JUNGLE_PLANKS).run(consumer);
createSimplePattern(new Identifier("dimdoors:acacia_log"), ACACIA_LOG, ACACIA_PLANKS).run(consumer);
createSimplePattern(new Identifier("dimdoors:dark_oak_log"), DARK_OAK_LOG, DARK_OAK_PLANKS).run(consumer);
createSimplePattern(new Identifier("dimdoors:oak_wood"), OAK_WOOD, OAK_LOG).run(consumer);
createSimplePattern(new Identifier("dimdoors:birch_wood"), BIRCH_WOOD, BIRCH_LOG).run(consumer);
createSimplePattern(new Identifier("dimdoors:spruce_wood"), SPRUCE_WOOD, SPRUCE_LOG).run(consumer);
createSimplePattern(new Identifier("dimdoors:jungle_wood"), JUNGLE_WOOD, JUNGLE_LOG).run(consumer);
createSimplePattern(new Identifier("dimdoors:acacia_wood"), ACACIA_WOOD, ACACIA_LOG).run(consumer);
createSimplePattern(new Identifier("dimdoors:dark_oak_wood"), DARK_OAK_WOOD, DARK_OAK_LOG).run(consumer);
}
@Override
public String getName() {
return "Limbo Decay";
}
private static Path getOutput(Path rootOutput, Identifier lootTableId) {
return rootOutput.resolve("data/" + lootTableId.getNamespace() + "/decay_patterns/" + lootTableId.getPath() + ".json");
}
public DecayPatternData createSimplePattern(Identifier id, Block before, Block after) {
return new DecayPatternData(id, SimpleDecayPredicate.builder().block(before).create(), SimpleDecayProcesor.builder().block(after).entropy(1).create());
}
public static class DecayPatternData {
private Identifier id;
private DecayPredicate predicate;
private DecayProcessor processor;
public DecayPatternData(Identifier id, DecayPredicate predicate, DecayProcessor processor) {
this.id = id;
this.predicate = predicate;
this.processor = processor;
}
public void run(BiConsumer<Identifier, JsonObject> consumer) {
JsonObject object = new JsonObject();
object.add("predicate", predicate.toJson(new JsonObject()));
object.add("processor", processor.toJson(new JsonObject()));
consumer.accept(id, object);
}
}
}

View file

@ -5,9 +5,6 @@ import java.util.Collections;
import java.util.List;
import java.util.function.Supplier;
import net.minecraft.enchantment.Enchantment;
import net.minecraft.enchantment.EnchantmentTarget;
import net.minecraft.entity.EquipmentSlot;
import net.minecraft.util.registry.Registry;
import me.shedaniel.autoconfig.AutoConfig;
@ -44,8 +41,11 @@ import org.dimdev.dimdoors.pockets.virtual.ImplementedVirtualPocket;
import org.dimdev.dimdoors.rift.targets.Targets;
import org.dimdev.dimdoors.rift.targets.VirtualTarget;
import org.dimdev.dimdoors.sound.ModSoundEvents;
import org.dimdev.dimdoors.world.decay.DecayLoader;
import org.dimdev.dimdoors.world.ModBiomes;
import org.dimdev.dimdoors.world.ModDimensions;
import org.dimdev.dimdoors.world.decay.DecayPredicate;
import org.dimdev.dimdoors.world.decay.DecayProcessor;
import org.dimdev.dimdoors.world.feature.ModFeatures;
import org.dimdev.dimdoors.world.pocket.type.AbstractPocket;
import org.dimdev.dimdoors.world.pocket.type.addon.PocketAddon;
@ -139,6 +139,7 @@ public class DimensionalDoorsInitializer implements ModInitializer {
dimensionalDoorBlockRegistrar = new DimensionalDoorBlockRegistrar(Registry.BLOCK, dimensionalDoorItemRegistrar);
ResourceManagerHelper.get(ResourceType.SERVER_DATA).registerReloadListener(PocketLoader.getInstance());
ResourceManagerHelper.get(ResourceType.SERVER_DATA).registerReloadListener(DecayLoader.getInstance());
ResourceManagerHelper.registerBuiltinResourcePack(new Identifier("dimdoors", "default"), dimDoorsMod, CONFIG_MANAGER.get().getPocketsConfig().defaultPocketsResourcePackActivationType.asResourcePackActivationType());
ResourceManagerHelper.registerBuiltinResourcePack(new Identifier("dimdoors", "classic"), dimDoorsMod, CONFIG_MANAGER.get().getPocketsConfig().classicPocketsResourcePackActivationType.asResourcePackActivationType());
@ -155,6 +156,8 @@ public class DimensionalDoorsInitializer implements ModInitializer {
AbstractPocket.AbstractPocketType.register();
PocketAddon.PocketAddonType.register();
Condition.ConditionType.register();
DecayPredicate.DecayPredicateType.register();
DecayProcessor.DecayProcessorType.register();
}
private void registerListeners() {

View file

@ -5,6 +5,8 @@ import org.dimdev.dimdoors.pockets.generator.PocketGenerator;
import org.dimdev.dimdoors.pockets.modifier.Modifier;
import org.dimdev.dimdoors.pockets.virtual.ImplementedVirtualPocket;
import org.dimdev.dimdoors.rift.targets.VirtualTarget;
import org.dimdev.dimdoors.world.decay.DecayPredicate;
import org.dimdev.dimdoors.world.decay.DecayProcessor;
import org.dimdev.dimdoors.world.pocket.type.AbstractPocket;
import org.dimdev.dimdoors.world.pocket.type.addon.PocketAddon;
@ -34,4 +36,10 @@ public interface DimensionalDoorsApi {
}
default void postInitialize() {}
default void registerDecayProcessors(Registry<DecayProcessor.DecayProcessorType<? extends DecayProcessor>> registry) {
}
default void registerDecayPredicates(Registry<DecayPredicate.DecayPredicateType<? extends DecayPredicate>> registry) {
}
}

View file

@ -0,0 +1,77 @@
package org.dimdev.dimdoors.world.decay;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Collection;
import java.util.concurrent.CompletableFuture;
import java.util.function.Function;
import java.util.stream.Collectors;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.dimdev.dimdoors.api.util.Path;
import org.dimdev.dimdoors.api.util.SimpleTree;
import org.jetbrains.annotations.NotNull;
import net.minecraft.resource.ResourceManager;
import net.minecraft.util.Identifier;
import net.fabricmc.fabric.api.resource.SimpleSynchronousResourceReloadListener;
public class DecayLoader implements SimpleSynchronousResourceReloadListener {
private static final Logger LOGGER = LogManager.getLogger();
private static final Gson GSON = new GsonBuilder().setLenient().setPrettyPrinting().create();
private static final DecayLoader INSTANCE = new DecayLoader();
private SimpleTree<String, DecayPattern> patterns = new SimpleTree<>(String.class);
private DecayLoader() {
}
public static DecayLoader getInstance() {
return INSTANCE;
}
@Override
public void reload(ResourceManager manager) {
patterns.clear();
CompletableFuture<SimpleTree<String, DecayPattern>> futurePatternMap = loadResourcePathFromJsonToTree(manager, "decay_patterns", this::loadPattern);
patterns = futurePatternMap.join();
}
private DecayPattern loadPattern(JsonObject object) {
return DecayPattern.deserialize(object);
}
private <T> CompletableFuture<SimpleTree<String, T>> loadResourcePathFromJsonToTree(ResourceManager manager, String startingPath, Function<JsonObject, T> reader) {
int sub = startingPath.endsWith("/") ? 0 : 1;
Collection<Identifier> ids = manager.findResources(startingPath, str -> str.endsWith(".json"));
return CompletableFuture.supplyAsync(() -> {
SimpleTree<String, T> tree = new SimpleTree<>(String.class);
tree.putAll(ids.parallelStream().unordered().collect(Collectors.toConcurrentMap(
id -> Path.stringPath(id.getNamespace() + ":" + id.getPath().substring(0, id.getPath().lastIndexOf(".")).substring(startingPath.length() + sub)),
id -> {
try {
JsonElement json = GSON.fromJson(new InputStreamReader(manager.getResource(id).getInputStream()), JsonElement.class);
return reader.apply(json.getAsJsonObject());
} catch (IOException e) {
throw new RuntimeException("Error loading resource: " + id);
}
})));
return tree;
});
}
public @NotNull Collection<DecayPattern> getPatterns() {
return patterns.values();
}
@Override
public Identifier getFabricId() {
return new Identifier("dimdoors", "decay_pattern");
}
}

View file

@ -0,0 +1,69 @@
package org.dimdev.dimdoors.world.decay;
import com.google.gson.JsonObject;
import org.dimdev.dimdoors.world.decay.predicates.SimpleDecayPredicate;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.fabricmc.fabric.api.event.Event;
import net.fabricmc.fabric.api.event.EventFactory;
public class DecayPattern {
public static final Event<EntropyEvent> ENTROPY_EVENT = EventFactory.createArrayBacked(EntropyEvent.class, (world, pos, entorpy) -> { System.out.println("Entorpy value of " + entorpy + " at " + pos + " in " + world.getRegistryKey().getValue()); }, entropyEvents -> (world, pos, entorpy) -> {
for (EntropyEvent event : entropyEvents) event.entropy(world, pos, entorpy);
});
private DecayPredicate predicate;
private DecayProcessor processor;
public DecayPattern() {}
public DecayPattern(DecayPredicate predicate, DecayProcessor processor) {
this.predicate = predicate;
this.processor = processor;
}
public static DecayPattern deserialize(JsonObject nbt) {
DecayPredicate predicate = DecayPredicate.deserialize(nbt.getAsJsonObject("predicate"));
DecayProcessor processor = DecayProcessor.deserialize(nbt.getAsJsonObject("processor"));
return DecayPattern.builder().predicate(predicate).processor(processor).create();
}
public boolean run(World world, BlockPos pos) {
if(predicate.test(world, pos)) {
ENTROPY_EVENT.invoker().entropy(world, pos, processor.process(world, pos));
return true;
}
return false;
}
public static DecayPattern.Builder builder() {
return new DecayPattern.Builder();
}
public static class Builder {
private DecayPredicate predicate = DecayPredicate.DUMMY;
private DecayProcessor processor = DecayProcessor.DUMMY;
public Builder predicate(DecayPredicate predicate) {
this.predicate = predicate;
return this;
}
public Builder processor(DecayProcessor processor) {
this.processor = processor;
return this;
}
public DecayPattern create() {
return new DecayPattern(predicate, processor);
}
}
private interface EntropyEvent {
void entropy(World world, BlockPos pos, int entorpy);
}
}

View file

@ -0,0 +1,96 @@
package org.dimdev.dimdoors.world.decay;
import java.util.function.Supplier;
import com.google.gson.JsonObject;
import com.mojang.serialization.Lifecycle;
import org.dimdev.dimdoors.DimensionalDoorsInitializer;
import org.dimdev.dimdoors.world.decay.predicates.SimpleDecayPredicate;
import org.dimdev.dimdoors.world.decay.processors.SimpleDecayProcesor;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.registry.Registry;
import net.minecraft.util.registry.RegistryKey;
import net.minecraft.util.registry.SimpleRegistry;
import net.minecraft.world.World;
import net.fabricmc.fabric.api.event.registry.FabricRegistryBuilder;
public interface DecayPredicate {
Registry<DecayPredicateType<? extends DecayPredicate>> REGISTRY = FabricRegistryBuilder.from(new SimpleRegistry<DecayPredicateType<? extends DecayPredicate>>(RegistryKey.ofRegistry(new Identifier("dimdoors", "decay_predicate_type")), Lifecycle.stable())).buildAndRegister();
DecayPredicate DUMMY = new DecayPredicate() {
private static final String ID = "none";
@Override
public DecayPredicate fromJson(JsonObject json) {
return this;
}
@Override
public DecayPredicateType<? extends DecayPredicate> getType() {
return DecayPredicateType.NONE_PREDICATE_TYPE;
}
@Override
public String getKey() {
return ID;
}
@Override
public boolean test(World world, BlockPos pos) {
return false;
}
};
static DecayPredicate deserialize(JsonObject nbt) {
Identifier id = Identifier.tryParse(nbt.get("type").getAsString());
return REGISTRY.getOrEmpty(id).orElse(DecayPredicateType.NONE_PREDICATE_TYPE).fromJson(nbt);
}
static JsonObject serialize(DecayPredicate modifier) {
return modifier.toJson(new JsonObject());
}
DecayPredicate fromJson(JsonObject json);
default JsonObject toJson(JsonObject json) {
return this.getType().toJson(json);
}
DecayPredicate.DecayPredicateType<? extends DecayPredicate> getType();
String getKey();
boolean test(World world, BlockPos pos);
interface DecayPredicateType<T extends DecayPredicate> {
DecayPredicateType<DecayPredicate> NONE_PREDICATE_TYPE = register(new Identifier("dimdoors", "none"), () -> DUMMY);
DecayPredicateType<SimpleDecayPredicate> SIMPLE_PREDICATE_TYPE = register(new Identifier("dimdoors", SimpleDecayProcesor.KEY), SimpleDecayPredicate::new);
DecayPredicate fromJson(JsonObject nbt);
JsonObject toJson(JsonObject nbt);
static void register() {
DimensionalDoorsInitializer.apiSubscribers.forEach(d -> d.registerDecayPredicates(REGISTRY));
}
static <U extends DecayPredicate> DecayPredicateType<U> register(Identifier id, Supplier<U> factory) {
return Registry.register(REGISTRY, id, new DecayPredicateType<U>() {
@Override
public DecayPredicate fromJson(JsonObject json) {
return factory.get().fromJson(json);
}
@Override
public JsonObject toJson(JsonObject json) {
json.addProperty("type", id.toString());
return json;
}
});
}
}
}

View file

@ -0,0 +1,107 @@
package org.dimdev.dimdoors.world.decay;
import java.util.function.Supplier;
import com.google.gson.JsonObject;
import com.mojang.serialization.Lifecycle;
import org.dimdev.dimdoors.DimensionalDoorsInitializer;
import org.dimdev.dimdoors.ModConfig;
import org.dimdev.dimdoors.pockets.PocketGenerationContext;
import org.dimdev.dimdoors.pockets.modifier.AbsoluteRiftBlockEntityModifier;
import org.dimdev.dimdoors.pockets.modifier.DimensionalDoorModifier;
import org.dimdev.dimdoors.pockets.modifier.OffsetModifier;
import org.dimdev.dimdoors.pockets.modifier.PocketEntranceModifier;
import org.dimdev.dimdoors.pockets.modifier.RelativeReferenceModifier;
import org.dimdev.dimdoors.pockets.modifier.RiftDataModifier;
import org.dimdev.dimdoors.pockets.modifier.RiftManager;
import org.dimdev.dimdoors.pockets.modifier.ShellModifier;
import org.dimdev.dimdoors.world.decay.processors.SimpleDecayProcesor;
import org.dimdev.dimdoors.world.pocket.type.Pocket;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.registry.Registry;
import net.minecraft.util.registry.RegistryKey;
import net.minecraft.util.registry.SimpleRegistry;
import net.minecraft.world.World;
import net.fabricmc.fabric.api.event.registry.FabricRegistryBuilder;
public interface DecayProcessor {
Registry<DecayProcessor.DecayProcessorType<? extends DecayProcessor>> REGISTRY = FabricRegistryBuilder.from(new SimpleRegistry<DecayProcessor.DecayProcessorType<? extends DecayProcessor>>(RegistryKey.ofRegistry(new Identifier("dimdoors", "decay_processor_type")), Lifecycle.stable())).buildAndRegister();
DecayProcessor DUMMY = new DecayProcessor() {
@Override
public DecayProcessor fromJson(JsonObject json) {
return this;
}
@Override
public DecayProcessorType<? extends DecayProcessor> getType() {
return DecayProcessor.DecayProcessorType.NONE_PROCESSOR_TYPE;
}
@Override
public String getKey() {
return ID;
}
@Override
public int process(World world, BlockPos pos) {
return 0;
}
private static final String ID = "none";
};
static DecayProcessor deserialize(JsonObject nbt) {
Identifier id = Identifier.tryParse(nbt.get("type").getAsString());
return REGISTRY.getOrEmpty(id).orElse(DecayProcessorType.NONE_PROCESSOR_TYPE).fromJson(nbt);
}
static JsonObject serialize(DecayProcessor modifier) {
return modifier.toJson(new JsonObject());
}
DecayProcessor fromJson(JsonObject json);
default JsonObject toJson(JsonObject json) {
return this.getType().toJson(json);
}
DecayProcessor.DecayProcessorType<? extends DecayProcessor> getType();
String getKey();
int process(World world, BlockPos pos);
interface DecayProcessorType<T extends DecayProcessor> {
DecayProcessorType<SimpleDecayProcesor> SIMPLE_PROCESSOR_TYPE = register(new Identifier("dimdoors", SimpleDecayProcesor.KEY), SimpleDecayProcesor::new);
DecayProcessorType<DecayProcessor> NONE_PROCESSOR_TYPE = register(new Identifier("dimdoors", "none"), () -> DUMMY);
DecayProcessor fromJson(JsonObject nbt);
JsonObject toJson(JsonObject nbt);
static void register() {
DimensionalDoorsInitializer.apiSubscribers.forEach(d -> d.registerDecayProcessors(REGISTRY));
}
static <U extends DecayProcessor> DecayProcessorType<U> register(Identifier id, Supplier<U> factory) {
return Registry.register(REGISTRY, id, new DecayProcessorType<U>() {
@Override
public DecayProcessor fromJson(JsonObject json) {
return factory.get().fromJson(json);
}
@Override
public JsonObject toJson(JsonObject json) {
json.addProperty("type", id.toString());
return json;
}
});
}
}
}

View file

@ -0,0 +1,71 @@
package org.dimdev.dimdoors.world.decay.predicates;
import com.google.gson.JsonObject;
import org.dimdev.dimdoors.world.decay.DecayPredicate;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.registry.Registry;
import net.minecraft.world.World;
public class SimpleDecayPredicate implements DecayPredicate {
public static final String KEY = "simple";
private Block block;
public SimpleDecayPredicate() {}
private SimpleDecayPredicate(Block block) {
this.block = block;
}
@Override
public DecayPredicate fromJson(JsonObject json) {
block = Registry.BLOCK.get(Identifier.tryParse(json.get("block").getAsString()));
return this;
}
@Override
public JsonObject toJson(JsonObject json) {
DecayPredicate.super.toJson(json);
json.addProperty("block", Registry.BLOCK.getId(block).toString());
return json;
}
@Override
public DecayPredicateType<? extends DecayPredicate> getType() {
return DecayPredicateType.SIMPLE_PREDICATE_TYPE;
}
@Override
public String getKey() {
return KEY;
}
@Override
public boolean test(World world, BlockPos pos) {
BlockState state = world.getBlockState(pos);
return state.getBlock() == block;
}
public static Builder builder() {
return new Builder();
}
public static class Builder {
private Block block = Blocks.AIR;
public Builder block(Block block) {
this.block = block;
return this;
}
public SimpleDecayPredicate create() {
return new SimpleDecayPredicate(block);
}
}
}

View file

@ -0,0 +1,81 @@
package org.dimdev.dimdoors.world.decay.processors;
import com.google.gson.JsonObject;
import org.dimdev.dimdoors.world.decay.DecayProcessor;
import org.dimdev.dimdoors.world.decay.predicates.SimpleDecayPredicate;
import net.minecraft.block.Block;
import net.minecraft.block.Blocks;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.registry.Registry;
import net.minecraft.world.World;
public class SimpleDecayProcesor implements DecayProcessor {
public static final String KEY = "simple";
private Block block;
private int entropy;
public SimpleDecayProcesor() {}
private SimpleDecayProcesor(Block block, int entropy) {
this.block = block;
this.entropy = entropy;
}
@Override
public DecayProcessor fromJson(JsonObject json) {
block = Registry.BLOCK.get(Identifier.tryParse(json.get("block").getAsString()));
entropy = json.get("entropy").getAsInt();
return this;
}
@Override
public JsonObject toJson(JsonObject json) {
DecayProcessor.super.toJson(json);
json.addProperty("block", Registry.BLOCK.getId(block).toString());
json.addProperty("entropy", entropy);
return json;
}
@Override
public DecayProcessorType<? extends DecayProcessor> getType() {
return DecayProcessorType.SIMPLE_PROCESSOR_TYPE;
}
@Override
public String getKey() {
return KEY;
}
@Override
public int process(World world, BlockPos pos) {
world.setBlockState(pos, block.getDefaultState());
return entropy;
}
public static SimpleDecayProcesor.Builder builder() {
return new SimpleDecayProcesor.Builder();
}
public static class Builder {
private Block block = Blocks.AIR;
private int entropy;
public SimpleDecayProcesor.Builder block(Block block) {
this.block = block;
return this;
}
public SimpleDecayProcesor.Builder entropy(int entropy) {
this.entropy = entropy;
return this;
}
public SimpleDecayProcesor create() {
return new SimpleDecayProcesor(block, entropy);
}
}
}

View file

@ -4,6 +4,7 @@ import java.io.BufferedReader;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
@ -17,15 +18,18 @@ import com.google.gson.JsonObject;
import com.mojang.serialization.Codec;
import com.mojang.serialization.JsonOps;
import com.mojang.serialization.codecs.UnboundedMapCodec;
import org.apache.commons.lang3.ArrayUtils;
import net.fabricmc.fabric.api.resource.SimpleSynchronousResourceReloadListener;
import net.minecraft.resource.ResourceManager;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.dimdev.dimdoors.DimensionalDoorsInitializer;
import org.dimdev.dimdoors.block.door.data.DoorData;
import org.dimdev.dimdoors.world.decay.DecayLoader;
import org.dimdev.dimdoors.world.decay.DecayPattern;
import org.jetbrains.annotations.NotNull;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.BlockWithEntity;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.registry.Registry;
@ -34,7 +38,6 @@ import net.minecraft.world.World;
import static net.minecraft.block.Blocks.ACACIA_LOG;
import static net.minecraft.block.Blocks.ACACIA_PLANKS;
import static net.minecraft.block.Blocks.ACACIA_WOOD;
import static net.minecraft.block.Blocks.AIR;
import static net.minecraft.block.Blocks.ANDESITE;
import static net.minecraft.block.Blocks.BIRCH_LOG;
import static net.minecraft.block.Blocks.BIRCH_PLANKS;
@ -85,10 +88,6 @@ import static net.minecraft.block.Blocks.SPRUCE_PLANKS;
import static net.minecraft.block.Blocks.SPRUCE_WOOD;
import static net.minecraft.block.Blocks.STONE;
import static net.minecraft.block.Blocks.STONE_BRICKS;
import static org.dimdev.dimdoors.block.ModBlocks.DETACHED_RIFT;
import static org.dimdev.dimdoors.block.ModBlocks.ETERNAL_FLUID;
import static org.dimdev.dimdoors.block.ModBlocks.GOLD_DOOR;
import static org.dimdev.dimdoors.block.ModBlocks.QUARTZ_DOOR;
import static org.dimdev.dimdoors.block.ModBlocks.UNRAVELLED_FABRIC;
/**
@ -97,55 +96,8 @@ import static org.dimdev.dimdoors.block.ModBlocks.UNRAVELLED_FABRIC;
*/
public final class LimboDecay {
private static final Logger LOGGER = LogManager.getLogger();
private static final UnboundedMapCodec<Block, Block> CODEC = Codec.unboundedMap(Identifier.CODEC.xmap(Registry.BLOCK::get, Registry.BLOCK::getId), Registry.BLOCK);
private static final Consumer<String> STDERR = System.err::println;
private static final Map<Block, Block> DECAY_SEQUENCE = new HashMap<>();
private static final Map<Block, Block> DEFAULT_VALUES;
private static final Gson GSON = new GsonBuilder().setLenient().setPrettyPrinting().create();
private static final Path CONFIG_PATH = DimensionalDoorsInitializer.getConfigRoot().resolve("limbo_decay.json");
public static void init() {
try {
JsonObject configObject = null;
if (Files.isDirectory(CONFIG_PATH)) {
Files.delete(CONFIG_PATH);
}
if (!Files.exists(CONFIG_PATH)) {
Files.createFile(CONFIG_PATH);
JsonObject jsonObject = CODEC.encodeStart(JsonOps.INSTANCE, DEFAULT_VALUES).getOrThrow(false, STDERR).getAsJsonObject();
configObject = jsonObject;
String json = GSON.toJson(jsonObject);
Files.write(CONFIG_PATH, json.getBytes());
DECAY_SEQUENCE.clear();
DECAY_SEQUENCE.putAll(DEFAULT_VALUES);
}
if (configObject == null) {
try (BufferedReader reader = Files.newBufferedReader(CONFIG_PATH)) {
configObject = GSON.fromJson(reader, JsonObject.class);
Map<Block, Block> blocks = CODEC.decode(JsonOps.INSTANCE, configObject).getOrThrow(false, STDERR).getFirst();
DECAY_SEQUENCE.clear();
DECAY_SEQUENCE.putAll(blocks);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
private static final Random RANDOM = new Random();
private static Block[] blocksImmuneToDecay = null;
public static Map<Block, Block> getDecaySequence() {
return DECAY_SEQUENCE;
}
public static Block[] getBlocksImmuneToDecay() {
if (blocksImmuneToDecay == null) {
blocksImmuneToDecay = ArrayUtils.addAll(DoorData.DOORS.toArray(new Block[0]), UNRAVELLED_FABRIC, ETERNAL_FLUID, DETACHED_RIFT, GOLD_DOOR, QUARTZ_DOOR);
}
return blocksImmuneToDecay;
}
/**
* Checks the blocks orthogonally around a given location (presumably the location of an Unraveled Fabric block)
@ -173,94 +125,14 @@ public final class LimboDecay {
* Checks if a block can be decayed and, if so, changes it to the next block ID along the decay sequence.
*/
private static boolean decayBlock(World world, BlockPos pos) {
BlockState state = world.getBlockState(pos);
@NotNull Collection<DecayPattern> patterns = DecayLoader.getInstance().getPatterns();
if (canDecayBlock(state, world, pos)) {
//Loop over the block IDs that decay can go through.
//Find an index matching the current blockID, if any.
if(patterns.isEmpty()) return false;
if (getDecaySequence().containsKey(state.getBlock())) {
Block decay = getDecaySequence().get(state.getBlock());
world.setBlockState(pos, decay.getDefaultState());
} else if (!state.isFullCube(world, pos)) {
world.setBlockState(pos, AIR.getDefaultState());
}
return true;
for (DecayPattern pattern : DecayLoader.getInstance().getPatterns()) {
if(pattern.run(world, pos)) return true;
}
return false;
}
/**
* Checks if a block can decay. We will not decay air, certain DD blocks, or containers.
*/
private static boolean canDecayBlock(BlockState state, World world, BlockPos pos) {
if (world.isAir(pos)) {
return false;
}
for (int k = 0; k < getBlocksImmuneToDecay().length; k++) {
if (state.getBlock().equals(getBlocksImmuneToDecay()[k])) {
return false;
}
}
return !(state.getBlock() instanceof BlockWithEntity);
}
static {
ImmutableMap.Builder<Block, Block> builder = ImmutableMap.builder();
BiConsumer<Block, Block> blockBiConsumer = builder::put;
blockBiConsumer.accept(STONE, COBBLESTONE);
blockBiConsumer.accept(COBBLESTONE, END_STONE);
blockBiConsumer.accept(GRAVEL, SAND);
blockBiConsumer.accept(SAND, UNRAVELLED_FABRIC);
blockBiConsumer.accept(GLASS, SAND);
blockBiConsumer.accept(GRASS_BLOCK, DIRT);
blockBiConsumer.accept(DIRT, SAND);
blockBiConsumer.accept(REDSTONE_BLOCK, REDSTONE_ORE);
blockBiConsumer.accept(REDSTONE_ORE, STONE);
blockBiConsumer.accept(EMERALD_BLOCK, EMERALD_ORE);
blockBiConsumer.accept(EMERALD_ORE, STONE);
blockBiConsumer.accept(COAL_BLOCK, COAL_ORE);
blockBiConsumer.accept(COAL_ORE, STONE);
blockBiConsumer.accept(IRON_BLOCK, IRON_ORE);
blockBiConsumer.accept(IRON_ORE, STONE);
blockBiConsumer.accept(LAPIS_BLOCK, LAPIS_ORE);
blockBiConsumer.accept(LAPIS_ORE, STONE);
blockBiConsumer.accept(GOLD_BLOCK, GOLD_ORE);
blockBiConsumer.accept(GOLD_ORE, STONE);
blockBiConsumer.accept(SANDSTONE, SAND);
blockBiConsumer.accept(END_STONE_BRICKS, END_STONE);
blockBiConsumer.accept(DIRT_PATH, DIRT);
blockBiConsumer.accept(POLISHED_GRANITE, GRANITE);
blockBiConsumer.accept(POLISHED_ANDESITE, ANDESITE);
blockBiConsumer.accept(ANDESITE, DIORITE);
blockBiConsumer.accept(POLISHED_DIORITE, DIORITE);
blockBiConsumer.accept(GRANITE, DIORITE);
blockBiConsumer.accept(DIORITE, COBBLESTONE);
blockBiConsumer.accept(POLISHED_BLACKSTONE, BLACKSTONE);
blockBiConsumer.accept(BLACKSTONE, COBBLESTONE);
blockBiConsumer.accept(PODZOL, DIRT);
blockBiConsumer.accept(FARMLAND, DIRT);
blockBiConsumer.accept(STONE_BRICKS, CRACKED_STONE_BRICKS);
blockBiConsumer.accept(CRACKED_STONE_BRICKS, DIORITE);
blockBiConsumer.accept(END_STONE, SAND);
blockBiConsumer.accept(OAK_LOG, OAK_PLANKS);
blockBiConsumer.accept(BIRCH_LOG, BIRCH_PLANKS);
blockBiConsumer.accept(SPRUCE_LOG, SPRUCE_PLANKS);
blockBiConsumer.accept(JUNGLE_LOG, JUNGLE_PLANKS);
blockBiConsumer.accept(ACACIA_LOG, ACACIA_PLANKS);
blockBiConsumer.accept(DARK_OAK_LOG, DARK_OAK_PLANKS);
blockBiConsumer.accept(OAK_WOOD, OAK_LOG);
blockBiConsumer.accept(BIRCH_WOOD, BIRCH_LOG);
blockBiConsumer.accept(SPRUCE_WOOD, SPRUCE_LOG);
blockBiConsumer.accept(JUNGLE_WOOD, JUNGLE_LOG);
blockBiConsumer.accept(ACACIA_WOOD, ACACIA_LOG);
blockBiConsumer.accept(DARK_OAK_WOOD, DARK_OAK_LOG);
DEFAULT_VALUES = builder.build();
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:acacia_log"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:acacia_planks",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:acacia_wood"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:acacia_log",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:andesite"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:diorite",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:birch_log"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:birch_planks",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:birch_wood"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:birch_log",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:blackstone"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:cobblestone",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:coal_block"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:coal_ore",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:coal_ore"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:stone",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:cobblestone"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:end_stone",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:cracked_stone_bricks"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:diorite",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:dark_oak_log"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:dark_oak_planks",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:dark_oak_wood"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:dark_oak_log",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:diorite"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:cobblestone",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:dirt"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:sand",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:dirt_path"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:dirt",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:emerald_block"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:emerald_ore",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:emerald_ore"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:stone",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:end_stone"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:sand",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:end_stone_bricks"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:end_stone",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:farmland"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:dirt",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:glass"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:sand",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:gold_block"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:gold_ore",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:gold_ore"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:stone",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:granite"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:diorite",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:grass_block"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:dirt",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:gravel"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:sand",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:iron_block"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:iron_ore",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:iron_ore"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:stone",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:jungle_log"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:jungle_planks",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:jungle_wood"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:jungle_log",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:lapis_block"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:lapis_ore",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:lapis_ore"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:stone",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:oak_log"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:oak_planks",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:oak_wood"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:oak_log",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:podzol"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:dirt",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:polished_andesite"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:andesite",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:polished_blackstone"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:blackstone",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:polished_diorite"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:diorite",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:polished_granite"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:granite",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:redstone_block"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:redstone_ore",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:redstone_ore"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:stone",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:sand"
},
"processor": {
"type": "dimdoors:simple",
"block": "dimdoors:unravelled_fabric",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:sandstone"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:sand",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:spruce_log"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:spruce_planks",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:spruce_wood"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:spruce_log",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:stone"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:cobblestone",
"entropy": 1
}
}

View file

@ -0,0 +1,11 @@
{
"predicate": {
"type": "dimdoors:simple",
"block": "minecraft:stone_bricks"
},
"processor": {
"type": "dimdoors:simple",
"block": "minecraft:cracked_stone_bricks",
"entropy": 1
}
}