diff --git a/src/datagen/java/org/dimdev/dimdoors/datagen/LimboDecayProvider.java b/src/datagen/java/org/dimdev/dimdoors/datagen/LimboDecayProvider.java index bb6c7d31..11939f0c 100644 --- a/src/datagen/java/org/dimdev/dimdoors/datagen/LimboDecayProvider.java +++ b/src/datagen/java/org/dimdev/dimdoors/datagen/LimboDecayProvider.java @@ -53,6 +53,7 @@ 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_BLOCK; import static org.dimdev.dimdoors.block.ModBlocks.UNRAVELLED_FABRIC; import com.google.gson.Gson; @@ -60,10 +61,12 @@ 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.block.ModBlocks; 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.SelfDecayProcessor; import org.dimdev.dimdoors.world.decay.processors.SimpleDecayProcesor; import net.minecraft.block.Block; @@ -106,7 +109,7 @@ public class LimboDecayProvider implements DataProvider { 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); + turnIntoSelf(new Identifier("dimdoors:sand"), SAND).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); @@ -152,6 +155,10 @@ public class LimboDecayProvider implements DataProvider { createSimplePattern(new Identifier("dimdoors:dark_oak_wood"), DARK_OAK_WOOD, DARK_OAK_LOG).run(consumer); } + private DecayPatternData turnIntoSelf(Identifier identifier, Block before) { + return new DecayPatternData(identifier, SimpleDecayPredicate.builder().block(before).create(), SelfDecayProcessor.instance()); + } + @Override public String getName() { diff --git a/src/main/java/org/dimdev/dimdoors/DimensionalDoorsInitializer.java b/src/main/java/org/dimdev/dimdoors/DimensionalDoorsInitializer.java index ba6c2652..309dc72b 100644 --- a/src/main/java/org/dimdev/dimdoors/DimensionalDoorsInitializer.java +++ b/src/main/java/org/dimdev/dimdoors/DimensionalDoorsInitializer.java @@ -41,12 +41,12 @@ 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.decay.LimboDecay; import org.dimdev.dimdoors.world.pocket.type.AbstractPocket; import org.dimdev.dimdoors.world.pocket.type.addon.PocketAddon; import org.jetbrains.annotations.NotNull; @@ -139,7 +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.get(ResourceType.SERVER_DATA).registerReloadListener(LimboDecay.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()); diff --git a/src/main/java/org/dimdev/dimdoors/world/decay/DecayLoader.java b/src/main/java/org/dimdev/dimdoors/world/decay/DecayLoader.java deleted file mode 100644 index 875d728f..00000000 --- a/src/main/java/org/dimdev/dimdoors/world/decay/DecayLoader.java +++ /dev/null @@ -1,77 +0,0 @@ -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 patterns = new SimpleTree<>(String.class); - - private DecayLoader() { - } - - public static DecayLoader getInstance() { - return INSTANCE; - } - - @Override - public void reload(ResourceManager manager) { - patterns.clear(); - CompletableFuture> futurePatternMap = loadResourcePathFromJsonToTree(manager, "decay_patterns", this::loadPattern); - patterns = futurePatternMap.join(); - } - - private DecayPattern loadPattern(JsonObject object) { - return DecayPattern.deserialize(object); - } - - private CompletableFuture> loadResourcePathFromJsonToTree(ResourceManager manager, String startingPath, Function reader) { - int sub = startingPath.endsWith("/") ? 0 : 1; - - Collection ids = manager.findResources(startingPath, str -> str.endsWith(".json")); - return CompletableFuture.supplyAsync(() -> { - SimpleTree 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 getPatterns() { - return patterns.values(); - } - - @Override - public Identifier getFabricId() { - return new Identifier("dimdoors", "decay_pattern"); - } -} diff --git a/src/main/java/org/dimdev/dimdoors/world/decay/DecayPattern.java b/src/main/java/org/dimdev/dimdoors/world/decay/DecayPattern.java index 5f6733d9..b749f06c 100644 --- a/src/main/java/org/dimdev/dimdoors/world/decay/DecayPattern.java +++ b/src/main/java/org/dimdev/dimdoors/world/decay/DecayPattern.java @@ -1,9 +1,8 @@ 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.block.BlockState; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -31,9 +30,9 @@ public class DecayPattern { 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)); + public boolean run(World world, BlockPos pos, BlockState origin, BlockState target) { + if(predicate.test(world, pos, origin, target)) { + ENTROPY_EVENT.invoker().entropy(world, pos, processor.process(world, pos, origin, target)); return true; } diff --git a/src/main/java/org/dimdev/dimdoors/world/decay/DecayPredicate.java b/src/main/java/org/dimdev/dimdoors/world/decay/DecayPredicate.java index 2b53f057..175b7de4 100644 --- a/src/main/java/org/dimdev/dimdoors/world/decay/DecayPredicate.java +++ b/src/main/java/org/dimdev/dimdoors/world/decay/DecayPredicate.java @@ -8,6 +8,7 @@ import org.dimdev.dimdoors.DimensionalDoorsInitializer; import org.dimdev.dimdoors.world.decay.predicates.SimpleDecayPredicate; import org.dimdev.dimdoors.world.decay.processors.SimpleDecayProcesor; +import net.minecraft.block.BlockState; import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; import net.minecraft.util.registry.Registry; @@ -39,7 +40,7 @@ public interface DecayPredicate { } @Override - public boolean test(World world, BlockPos pos) { + public boolean test(World world, BlockPos pos, BlockState origin, BlockState target) { return false; } }; @@ -64,7 +65,7 @@ public interface DecayPredicate { String getKey(); - boolean test(World world, BlockPos pos); + boolean test(World world, BlockPos pos, BlockState origin, BlockState target); interface DecayPredicateType { DecayPredicateType NONE_PREDICATE_TYPE = register(new Identifier("dimdoors", "none"), () -> DUMMY); diff --git a/src/main/java/org/dimdev/dimdoors/world/decay/DecayProcessor.java b/src/main/java/org/dimdev/dimdoors/world/decay/DecayProcessor.java index 26ab1b61..bade62f3 100644 --- a/src/main/java/org/dimdev/dimdoors/world/decay/DecayProcessor.java +++ b/src/main/java/org/dimdev/dimdoors/world/decay/DecayProcessor.java @@ -5,20 +5,10 @@ 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.SelfDecayProcessor; import org.dimdev.dimdoors.world.decay.processors.SimpleDecayProcesor; -import org.dimdev.dimdoors.world.pocket.type.Pocket; -import net.minecraft.nbt.NbtCompound; +import net.minecraft.block.BlockState; import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; import net.minecraft.util.registry.Registry; @@ -48,7 +38,7 @@ public interface DecayProcessor { } @Override - public int process(World world, BlockPos pos) { + public int process(World world, BlockPos pos, BlockState origin, BlockState target) { return 0; } @@ -75,11 +65,12 @@ public interface DecayProcessor { String getKey(); - int process(World world, BlockPos pos); + int process(World world, BlockPos pos, BlockState origin, BlockState target); interface DecayProcessorType { DecayProcessorType SIMPLE_PROCESSOR_TYPE = register(new Identifier("dimdoors", SimpleDecayProcesor.KEY), SimpleDecayProcesor::new); DecayProcessorType NONE_PROCESSOR_TYPE = register(new Identifier("dimdoors", "none"), () -> DUMMY); + DecayProcessorType SELF = register(new Identifier("dimdoors", SelfDecayProcessor.KEY), SelfDecayProcessor::instance); DecayProcessor fromJson(JsonObject nbt); diff --git a/src/main/java/org/dimdev/dimdoors/world/decay/LimboDecay.java b/src/main/java/org/dimdev/dimdoors/world/decay/LimboDecay.java new file mode 100644 index 00000000..da750482 --- /dev/null +++ b/src/main/java/org/dimdev/dimdoors/world/decay/LimboDecay.java @@ -0,0 +1,136 @@ +package org.dimdev.dimdoors.world.decay; + +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Collection; +import java.util.Random; +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 net.fabricmc.fabric.api.resource.SimpleSynchronousResourceReloadListener; + +import net.minecraft.block.BlockState; +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.api.util.Path; +import org.dimdev.dimdoors.api.util.SimpleTree; +import org.dimdev.dimdoors.world.decay.DecayPattern; +import org.jetbrains.annotations.NotNull; + +import net.minecraft.util.Identifier; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +/** + * Provides methods for applying Limbo decay. Limbo decay refers to the effect that most blocks placed in Limbo + * naturally change into stone, then cobble, then gravel, and finally Unraveled Fabric as time passes. + */ +public final class LimboDecay { + private static final Logger LOGGER = LogManager.getLogger(); + + private static final Random RANDOM = new Random(); + + /** + * Checks the blocks orthogonally around a given location (presumably the location of an Unraveled Fabric block) + * and applies Limbo decay to them. This gives the impression that decay spreads outward from Unraveled Fabric. + */ + public static void applySpreadDecay(World world, BlockPos pos) { + //Check if we randomly apply decay spread or not. This can be used to moderate the frequency of + //full spread decay checks, which can also shift its performance impact on the game. + if (RANDOM.nextDouble() < DimensionalDoorsInitializer.getConfig().getLimboConfig().decaySpreadChance) { + BlockState origin = world.getBlockState(pos); + + //Apply decay to the blocks above, below, and on all four sides. + //World.getBlockId() implements bounds checking, so we don't have to worry about reaching out of the world/* + /*boolean flag = */decayBlock(world, pos.up(), origin); + /*flag = flag && */decayBlock(world, pos.down(), origin); + /*flag = flag && */decayBlock(world, pos.north(), origin); + /*flag = flag && */decayBlock(world, pos.south(), origin); + /*flag = flag && */decayBlock(world, pos.west(), origin); + /*flag = flag && */decayBlock(world, pos.east(), origin); +// if (flag) { +// LOGGER.debug("Applied limbo decay to block at all six sides at position {} in dimension {}", pos, world.getRegistryKey().getValue()); +// } + } + } + + /** + * 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 origin) { + @NotNull Collection patterns = DecayLoader.getInstance().getPatterns(); + + if(patterns.isEmpty()) return false; + + BlockState target = world.getBlockState(pos); + + for (DecayPattern pattern : DecayLoader.getInstance().getPatterns()) { + if(pattern.run(world, pos, origin, target)) return true; + } + + return false; + } + + public static 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 patterns = new SimpleTree<>(String.class); + + private DecayLoader() { + } + + public static DecayLoader getInstance() { + return INSTANCE; + } + + @Override + public void reload(ResourceManager manager) { + patterns.clear(); + CompletableFuture> futurePatternMap = loadResourcePathFromJsonToTree(manager, "decay_patterns", this::loadPattern); + patterns = futurePatternMap.join(); + } + + private DecayPattern loadPattern(JsonObject object) { + return DecayPattern.deserialize(object); + } + + private CompletableFuture> loadResourcePathFromJsonToTree(ResourceManager manager, String startingPath, Function reader) { + int sub = startingPath.endsWith("/") ? 0 : 1; + + Collection ids = manager.findResources(startingPath, str -> str.endsWith(".json")); + return CompletableFuture.supplyAsync(() -> { + SimpleTree 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 getPatterns() { + return patterns.values(); + } + + @Override + public Identifier getFabricId() { + return new Identifier("dimdoors", "decay_pattern"); + } + } +} diff --git a/src/main/java/org/dimdev/dimdoors/world/decay/predicates/SimpleDecayPredicate.java b/src/main/java/org/dimdev/dimdoors/world/decay/predicates/SimpleDecayPredicate.java index d7b8103d..0699a62b 100644 --- a/src/main/java/org/dimdev/dimdoors/world/decay/predicates/SimpleDecayPredicate.java +++ b/src/main/java/org/dimdev/dimdoors/world/decay/predicates/SimpleDecayPredicate.java @@ -46,7 +46,7 @@ public class SimpleDecayPredicate implements DecayPredicate { } @Override - public boolean test(World world, BlockPos pos) { + public boolean test(World world, BlockPos pos, BlockState origin, BlockState target) { BlockState state = world.getBlockState(pos); return state.getBlock() == block; diff --git a/src/main/java/org/dimdev/dimdoors/world/decay/processors/SelfDecayProcessor.java b/src/main/java/org/dimdev/dimdoors/world/decay/processors/SelfDecayProcessor.java new file mode 100644 index 00000000..aa1591ae --- /dev/null +++ b/src/main/java/org/dimdev/dimdoors/world/decay/processors/SelfDecayProcessor.java @@ -0,0 +1,41 @@ +package org.dimdev.dimdoors.world.decay.processors; + +import static org.dimdev.dimdoors.world.decay.DecayProcessor.DecayProcessorType.SELF; + +import com.google.gson.JsonObject; +import org.dimdev.dimdoors.world.decay.DecayProcessor; + +import net.minecraft.block.BlockState; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +public class SelfDecayProcessor implements DecayProcessor { + public static final String KEY = "self"; + + private static final SelfDecayProcessor instance = new SelfDecayProcessor(); + + public static SelfDecayProcessor instance() { + return instance; + } + + @Override + public DecayProcessor fromJson(JsonObject json) { + return this; + } + + @Override + public DecayProcessorType getType() { + return SELF; + } + + @Override + public String getKey() { + return KEY; + } + + @Override + public int process(World world, BlockPos pos, BlockState origin, BlockState target) { + world.setBlockState(pos, origin); + return 0; + } +} diff --git a/src/main/java/org/dimdev/dimdoors/world/decay/processors/SimpleDecayProcesor.java b/src/main/java/org/dimdev/dimdoors/world/decay/processors/SimpleDecayProcesor.java index 2b11143c..709b2fc2 100644 --- a/src/main/java/org/dimdev/dimdoors/world/decay/processors/SimpleDecayProcesor.java +++ b/src/main/java/org/dimdev/dimdoors/world/decay/processors/SimpleDecayProcesor.java @@ -2,9 +2,9 @@ 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.BlockState; import net.minecraft.block.Blocks; import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; @@ -51,7 +51,7 @@ public class SimpleDecayProcesor implements DecayProcessor { } @Override - public int process(World world, BlockPos pos) { + public int process(World world, BlockPos pos, BlockState origin, BlockState target) { world.setBlockState(pos, block.getDefaultState()); return entropy; } diff --git a/src/main/java/org/dimdev/dimdoors/world/limbo/LimboDecay.java b/src/main/java/org/dimdev/dimdoors/world/limbo/LimboDecay.java deleted file mode 100644 index 9ef34b67..00000000 --- a/src/main/java/org/dimdev/dimdoors/world/limbo/LimboDecay.java +++ /dev/null @@ -1,138 +0,0 @@ -package org.dimdev.dimdoors.world.limbo; - -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; -import java.util.function.BiConsumer; -import java.util.function.Consumer; - -import com.google.common.collect.ImmutableMap; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonObject; -import com.mojang.serialization.Codec; -import com.mojang.serialization.JsonOps; -import com.mojang.serialization.codecs.UnboundedMapCodec; -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.world.decay.DecayLoader; -import org.dimdev.dimdoors.world.decay.DecayPattern; -import org.jetbrains.annotations.NotNull; - -import net.minecraft.block.Block; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.registry.Registry; -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.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; - -/** - * Provides methods for applying Limbo decay. Limbo decay refers to the effect that most blocks placed in Limbo - * naturally change into stone, then cobble, then gravel, and finally Unraveled Fabric as time passes. - */ -public final class LimboDecay { - private static final Logger LOGGER = LogManager.getLogger(); - - private static final Random RANDOM = new Random(); - - /** - * Checks the blocks orthogonally around a given location (presumably the location of an Unraveled Fabric block) - * and applies Limbo decay to them. This gives the impression that decay spreads outward from Unraveled Fabric. - */ - public static void applySpreadDecay(World world, BlockPos pos) { - //Check if we randomly apply decay spread or not. This can be used to moderate the frequency of - //full spread decay checks, which can also shift its performance impact on the game. - if (RANDOM.nextDouble() < DimensionalDoorsInitializer.getConfig().getLimboConfig().decaySpreadChance) { - //Apply decay to the blocks above, below, and on all four sides. - //World.getBlockId() implements bounds checking, so we don't have to worry about reaching out of the world - boolean flag = decayBlock(world, pos.up()); - flag = flag && decayBlock(world, pos.down()); - flag = flag && decayBlock(world, pos.north()); - flag = flag && decayBlock(world, pos.south()); - flag = flag && decayBlock(world, pos.west()); - flag = flag && decayBlock(world, pos.east()); - if (flag) { - LOGGER.debug("Applied limbo decay to block at all six sides at position {} in dimension {}", pos, world.getRegistryKey().getValue()); - } - } - } - - /** - * 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) { - @NotNull Collection patterns = DecayLoader.getInstance().getPatterns(); - - if(patterns.isEmpty()) return false; - - for (DecayPattern pattern : DecayLoader.getInstance().getPatterns()) { - if(pattern.run(world, pos)) return true; - } - - return false; - } -} diff --git a/src/main/resources/data/dimdoors/decay_patterns/sand.json b/src/main/resources/data/dimdoors/decay_patterns/sand.json index 53447afd..60f93e96 100644 --- a/src/main/resources/data/dimdoors/decay_patterns/sand.json +++ b/src/main/resources/data/dimdoors/decay_patterns/sand.json @@ -4,8 +4,6 @@ "block": "minecraft:sand" }, "processor": { - "type": "dimdoors:simple", - "block": "dimdoors:unravelled_fabric", - "entropy": 1 + "type": "dimdoors:self" } } \ No newline at end of file