From 6af7634d6c9f107b3ca26dc2d5125d2b1de714a9 Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Tue, 13 Nov 2018 11:39:28 +0100 Subject: [PATCH] generify the drain spot system so that addon devs can more easily use it --- .../de/ellpeck/naturesaura/NaturesAura.java | 2 ++ .../naturesaura/api/NaturesAuraAPI.java | 11 +++++++++ .../api/aura/chunk/IAuraChunk.java | 2 -- .../api/aura/chunk/IDrainSpotEffect.java | 3 +++ .../blocks/tiles/TileEntityHopperUpgrade.java | 1 - .../blocks/tiles/TileEntityPlacer.java | 1 - .../tiles/TileEntityPotionGenerator.java | 1 - .../{aura => }/chunk/AuraChunk.java | 23 +++++++------------ .../chunk/effect/DrainSpotEffects.java | 12 ++++++++++ .../chunk/effect/GrassDieEffect.java | 12 +++++++++- .../chunk/effect/PlantBoostEffect.java | 12 +++++++++- .../chunk/effect/ReplenishingEffect.java | 12 +++++++++- .../naturesaura/events/CommonEvents.java | 2 +- .../naturesaura/packet/PacketAuraChunk.java | 2 +- 14 files changed, 71 insertions(+), 25 deletions(-) rename src/main/java/de/ellpeck/naturesaura/{aura => }/chunk/AuraChunk.java (87%) create mode 100644 src/main/java/de/ellpeck/naturesaura/chunk/effect/DrainSpotEffects.java rename src/main/java/de/ellpeck/naturesaura/{aura => }/chunk/effect/GrassDieEffect.java (89%) rename src/main/java/de/ellpeck/naturesaura/{aura => }/chunk/effect/PlantBoostEffect.java (89%) rename src/main/java/de/ellpeck/naturesaura/{aura => }/chunk/effect/ReplenishingEffect.java (87%) diff --git a/src/main/java/de/ellpeck/naturesaura/NaturesAura.java b/src/main/java/de/ellpeck/naturesaura/NaturesAura.java index 958f30a3..f1e6cfcc 100644 --- a/src/main/java/de/ellpeck/naturesaura/NaturesAura.java +++ b/src/main/java/de/ellpeck/naturesaura/NaturesAura.java @@ -6,6 +6,7 @@ import de.ellpeck.naturesaura.api.aura.container.IAuraContainer; import de.ellpeck.naturesaura.api.aura.item.IAuraRecharge; import de.ellpeck.naturesaura.blocks.ModBlocks; import de.ellpeck.naturesaura.blocks.multi.Multiblocks; +import de.ellpeck.naturesaura.chunk.effect.DrainSpotEffects; import de.ellpeck.naturesaura.commands.CommandAura; import de.ellpeck.naturesaura.compat.Compat; import de.ellpeck.naturesaura.events.CommonEvents; @@ -78,6 +79,7 @@ public final class NaturesAura { ModRecipes.init(); ModRegistry.init(event); OreDict.init(); + DrainSpotEffects.init(); proxy.init(event); } diff --git a/src/main/java/de/ellpeck/naturesaura/api/NaturesAuraAPI.java b/src/main/java/de/ellpeck/naturesaura/api/NaturesAuraAPI.java index 34e6ff1e..ae653012 100644 --- a/src/main/java/de/ellpeck/naturesaura/api/NaturesAuraAPI.java +++ b/src/main/java/de/ellpeck/naturesaura/api/NaturesAuraAPI.java @@ -1,6 +1,7 @@ package de.ellpeck.naturesaura.api; import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk; +import de.ellpeck.naturesaura.api.aura.chunk.IDrainSpotEffect; import de.ellpeck.naturesaura.api.aura.container.IAuraContainer; import de.ellpeck.naturesaura.api.aura.item.IAuraRecharge; import de.ellpeck.naturesaura.api.aura.type.BasicAuraType; @@ -24,6 +25,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.function.BiConsumer; +import java.util.function.Supplier; /** * The main class of the Nature's Aura API. This is where you can find recipe @@ -68,6 +70,15 @@ public final class NaturesAuraAPI { public static final IAuraType TYPE_NETHER = new BasicAuraType(new ResourceLocation(MOD_ID, "nether"), DimensionType.NETHER, 0x871c0c).register(); public static final IAuraType TYPE_END = new BasicAuraType(new ResourceLocation(MOD_ID, "end"), DimensionType.THE_END, 0x302624).register(); public static final IAuraType TYPE_OTHER = new BasicAuraType(new ResourceLocation(MOD_ID, "other"), null, 0x2fa8a0).register(); + /** + * A map of all {@link IDrainSpotEffect} suppliers which are effects that + * happen passively at every spot that Aura has been drained from in the + * world. These effects include things like vegetational increase and + * natural decay. To register your own drain spot effects, just add a + * supplier for them to this map and they will automatically be executed + * once a second for every drain spot currently loaded. + */ + public static final Map> DRAIN_SPOT_EFFECTS = new HashMap<>(); /** * The capability for any item or block that stores Aura in the form of an diff --git a/src/main/java/de/ellpeck/naturesaura/api/aura/chunk/IAuraChunk.java b/src/main/java/de/ellpeck/naturesaura/api/aura/chunk/IAuraChunk.java index 07acfc00..a91b9b59 100644 --- a/src/main/java/de/ellpeck/naturesaura/api/aura/chunk/IAuraChunk.java +++ b/src/main/java/de/ellpeck/naturesaura/api/aura/chunk/IAuraChunk.java @@ -112,8 +112,6 @@ public interface IAuraChunk extends ICapabilityProvider, INBTSerializable supplier : NaturesAuraAPI.DRAIN_SPOT_EFFECTS.values()) { + IDrainSpotEffect effect = supplier.get(); + if (effect.appliesToType(this.type)) + this.effects.add(effect); + } } @Override @@ -116,7 +109,7 @@ public class AuraChunk implements IAuraChunk { for (Map.Entry entry : this.drainSpots.entrySet()) { for (IDrainSpotEffect effect : this.effects) { - world.profiler.func_194340_a(() -> NaturesAura.MOD_ID + ":" + effect.getClass().getSimpleName()); + world.profiler.func_194340_a(() -> effect.getName().toString()); effect.update(world, this.chunk, this, entry.getKey(), entry.getValue()); world.profiler.endSection(); } diff --git a/src/main/java/de/ellpeck/naturesaura/chunk/effect/DrainSpotEffects.java b/src/main/java/de/ellpeck/naturesaura/chunk/effect/DrainSpotEffects.java new file mode 100644 index 00000000..7f9bbe48 --- /dev/null +++ b/src/main/java/de/ellpeck/naturesaura/chunk/effect/DrainSpotEffects.java @@ -0,0 +1,12 @@ +package de.ellpeck.naturesaura.chunk.effect; + +import de.ellpeck.naturesaura.api.NaturesAuraAPI; + +public final class DrainSpotEffects { + + public static void init() { + NaturesAuraAPI.DRAIN_SPOT_EFFECTS.put(GrassDieEffect.NAME, GrassDieEffect::new); + NaturesAuraAPI.DRAIN_SPOT_EFFECTS.put(PlantBoostEffect.NAME, PlantBoostEffect::new); + NaturesAuraAPI.DRAIN_SPOT_EFFECTS.put(ReplenishingEffect.NAME, ReplenishingEffect::new); + } +} diff --git a/src/main/java/de/ellpeck/naturesaura/aura/chunk/effect/GrassDieEffect.java b/src/main/java/de/ellpeck/naturesaura/chunk/effect/GrassDieEffect.java similarity index 89% rename from src/main/java/de/ellpeck/naturesaura/aura/chunk/effect/GrassDieEffect.java rename to src/main/java/de/ellpeck/naturesaura/chunk/effect/GrassDieEffect.java index f9697be1..2fa53569 100644 --- a/src/main/java/de/ellpeck/naturesaura/aura/chunk/effect/GrassDieEffect.java +++ b/src/main/java/de/ellpeck/naturesaura/chunk/effect/GrassDieEffect.java @@ -1,5 +1,6 @@ -package de.ellpeck.naturesaura.aura.chunk.effect; +package de.ellpeck.naturesaura.chunk.effect; +import de.ellpeck.naturesaura.NaturesAura; import de.ellpeck.naturesaura.api.NaturesAuraAPI; import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk; import de.ellpeck.naturesaura.api.aura.chunk.IDrainSpotEffect; @@ -8,6 +9,7 @@ import de.ellpeck.naturesaura.blocks.ModBlocks; import net.minecraft.block.*; import net.minecraft.block.state.IBlockState; import net.minecraft.init.Blocks; +import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; @@ -15,6 +17,9 @@ import net.minecraft.world.chunk.Chunk; import org.apache.commons.lang3.mutable.MutableInt; public class GrassDieEffect implements IDrainSpotEffect { + + public static final ResourceLocation NAME = new ResourceLocation(NaturesAura.MOD_ID, "grass_die"); + @Override public void update(World world, Chunk chunk, IAuraChunk auraChunk, BlockPos pos, MutableInt spot) { if (spot.intValue() < 0) { @@ -56,4 +61,9 @@ public class GrassDieEffect implements IDrainSpotEffect { public boolean appliesToType(IAuraType type) { return type == NaturesAuraAPI.TYPE_OVERWORLD; } + + @Override + public ResourceLocation getName() { + return NAME; + } } diff --git a/src/main/java/de/ellpeck/naturesaura/aura/chunk/effect/PlantBoostEffect.java b/src/main/java/de/ellpeck/naturesaura/chunk/effect/PlantBoostEffect.java similarity index 89% rename from src/main/java/de/ellpeck/naturesaura/aura/chunk/effect/PlantBoostEffect.java rename to src/main/java/de/ellpeck/naturesaura/chunk/effect/PlantBoostEffect.java index 6007e9b7..8d589ed1 100644 --- a/src/main/java/de/ellpeck/naturesaura/aura/chunk/effect/PlantBoostEffect.java +++ b/src/main/java/de/ellpeck/naturesaura/chunk/effect/PlantBoostEffect.java @@ -1,5 +1,6 @@ -package de.ellpeck.naturesaura.aura.chunk.effect; +package de.ellpeck.naturesaura.chunk.effect; +import de.ellpeck.naturesaura.NaturesAura; import de.ellpeck.naturesaura.api.NaturesAuraAPI; import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk; import de.ellpeck.naturesaura.api.aura.chunk.IDrainSpotEffect; @@ -10,6 +11,7 @@ import net.minecraft.block.Block; import net.minecraft.block.IGrowable; import net.minecraft.block.state.IBlockState; import net.minecraft.init.Blocks; +import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; @@ -17,6 +19,9 @@ import net.minecraft.world.chunk.Chunk; import org.apache.commons.lang3.mutable.MutableInt; public class PlantBoostEffect implements IDrainSpotEffect { + + public static final ResourceLocation NAME = new ResourceLocation(NaturesAura.MOD_ID, "plant_boost"); + @Override public void update(World world, Chunk chunk, IAuraChunk auraChunk, BlockPos pos, MutableInt spot) { if (spot.intValue() <= 0) @@ -58,4 +63,9 @@ public class PlantBoostEffect implements IDrainSpotEffect { public boolean appliesToType(IAuraType type) { return type == NaturesAuraAPI.TYPE_OVERWORLD; } + + @Override + public ResourceLocation getName() { + return NAME; + } } diff --git a/src/main/java/de/ellpeck/naturesaura/aura/chunk/effect/ReplenishingEffect.java b/src/main/java/de/ellpeck/naturesaura/chunk/effect/ReplenishingEffect.java similarity index 87% rename from src/main/java/de/ellpeck/naturesaura/aura/chunk/effect/ReplenishingEffect.java rename to src/main/java/de/ellpeck/naturesaura/chunk/effect/ReplenishingEffect.java index 4fdaf551..4ab9eada 100644 --- a/src/main/java/de/ellpeck/naturesaura/aura/chunk/effect/ReplenishingEffect.java +++ b/src/main/java/de/ellpeck/naturesaura/chunk/effect/ReplenishingEffect.java @@ -1,12 +1,14 @@ -package de.ellpeck.naturesaura.aura.chunk.effect; +package de.ellpeck.naturesaura.chunk.effect; import de.ellpeck.naturesaura.Helper; +import de.ellpeck.naturesaura.NaturesAura; import de.ellpeck.naturesaura.api.NaturesAuraAPI; import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk; import de.ellpeck.naturesaura.api.aura.chunk.IDrainSpotEffect; import de.ellpeck.naturesaura.api.aura.chunk.ISpotDrainable; import de.ellpeck.naturesaura.api.aura.container.IAuraContainer; import de.ellpeck.naturesaura.api.aura.type.IAuraType; +import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraft.world.chunk.Chunk; @@ -16,6 +18,9 @@ import java.util.ArrayList; import java.util.List; public class ReplenishingEffect implements IDrainSpotEffect { + + public static final ResourceLocation NAME = new ResourceLocation(NaturesAura.MOD_ID, "replenishing"); + @Override public void update(World world, Chunk chunk, IAuraChunk auraChunk, BlockPos pos, MutableInt spot) { int amount = spot.intValue(); @@ -52,4 +57,9 @@ public class ReplenishingEffect implements IDrainSpotEffect { public boolean appliesToType(IAuraType type) { return true; } + + @Override + public ResourceLocation getName() { + return NAME; + } } diff --git a/src/main/java/de/ellpeck/naturesaura/events/CommonEvents.java b/src/main/java/de/ellpeck/naturesaura/events/CommonEvents.java index b6fefff3..a6d347ec 100644 --- a/src/main/java/de/ellpeck/naturesaura/events/CommonEvents.java +++ b/src/main/java/de/ellpeck/naturesaura/events/CommonEvents.java @@ -4,7 +4,7 @@ import de.ellpeck.naturesaura.ModConfig; import de.ellpeck.naturesaura.NaturesAura; import de.ellpeck.naturesaura.api.NaturesAuraAPI; import de.ellpeck.naturesaura.api.aura.type.IAuraType; -import de.ellpeck.naturesaura.aura.chunk.AuraChunk; +import de.ellpeck.naturesaura.chunk.AuraChunk; import de.ellpeck.naturesaura.packet.PacketHandler; import net.minecraft.util.ResourceLocation; import net.minecraft.world.WorldServer; diff --git a/src/main/java/de/ellpeck/naturesaura/packet/PacketAuraChunk.java b/src/main/java/de/ellpeck/naturesaura/packet/PacketAuraChunk.java index 32864afe..24be563c 100644 --- a/src/main/java/de/ellpeck/naturesaura/packet/PacketAuraChunk.java +++ b/src/main/java/de/ellpeck/naturesaura/packet/PacketAuraChunk.java @@ -2,7 +2,7 @@ package de.ellpeck.naturesaura.packet; import de.ellpeck.naturesaura.NaturesAura; import de.ellpeck.naturesaura.api.NaturesAuraAPI; -import de.ellpeck.naturesaura.aura.chunk.AuraChunk; +import de.ellpeck.naturesaura.chunk.AuraChunk; import io.netty.buffer.ByteBuf; import net.minecraft.client.Minecraft; import net.minecraft.util.math.BlockPos;