diff --git a/src/main/java/de/ellpeck/naturesaura/ModConfig.java b/src/main/java/de/ellpeck/naturesaura/ModConfig.java index d0ac637f..f0443d10 100644 --- a/src/main/java/de/ellpeck/naturesaura/ModConfig.java +++ b/src/main/java/de/ellpeck/naturesaura/ModConfig.java @@ -60,13 +60,13 @@ public final class ModConfig { @Comment("The percentage of particles that should be displayed, where 1 is 100% and 0 is 0%") @RangeDouble(min = 0, max = 1) public double particleAmount = 1; - @Comment("If particle spawning should respect the particle setting in Minecraft's video settings screen") public boolean respectVanillaParticleSettings = true; + @Comment("The percentage of particles that should spawn when there is an excess amount of Aura in the environment, where 1 is 100% and 0 is 0%") + public double excessParticleAmount = 1; @Comment("If debug information about Aura around the player should be displayed in the F3 debug menu if the player is in creative mode") public boolean debugText = true; - @Comment("If, when the F3 debug menu is open and the player is in creative mode, every Aura spot should be highlighted in the world for debug purposes") public boolean debugWorld = false; } diff --git a/src/main/java/de/ellpeck/naturesaura/chunk/AuraChunk.java b/src/main/java/de/ellpeck/naturesaura/chunk/AuraChunk.java index 67996874..875a57a3 100644 --- a/src/main/java/de/ellpeck/naturesaura/chunk/AuraChunk.java +++ b/src/main/java/de/ellpeck/naturesaura/chunk/AuraChunk.java @@ -61,9 +61,8 @@ public class AuraChunk implements IAuraChunk { return 0; MutableInt spot = this.getActualDrainSpot(pos, true); int curr = spot.intValue(); - if (curr < 0 && curr - amount > 0) { // Underflow protection + if (curr < 0 && curr - amount > 0) // Underflow protection return this.drainAura(pos.up(), amount, aimForZero, simulate); - } if (aimForZero) { if (curr > 0 && curr - amount < 0) amount = curr; diff --git a/src/main/java/de/ellpeck/naturesaura/chunk/effect/DrainSpotEffects.java b/src/main/java/de/ellpeck/naturesaura/chunk/effect/DrainSpotEffects.java index 77246290..d0888f58 100644 --- a/src/main/java/de/ellpeck/naturesaura/chunk/effect/DrainSpotEffects.java +++ b/src/main/java/de/ellpeck/naturesaura/chunk/effect/DrainSpotEffects.java @@ -14,6 +14,7 @@ public final class DrainSpotEffects { NaturesAuraAPI.DRAIN_SPOT_EFFECTS.put(SpreadEffect.NAME, SpreadEffect::new); NaturesAuraAPI.DRAIN_SPOT_EFFECTS.put(CacheRechargeEffect.NAME, CacheRechargeEffect::new); NaturesAuraAPI.DRAIN_SPOT_EFFECTS.put(AnimalEffect.NAME, AnimalEffect::new); + NaturesAuraAPI.DRAIN_SPOT_EFFECTS.put(NiceLookingEffect.NAME, NiceLookingEffect::new); NaturesAuraAPI.EFFECT_POWDERS.put(PlantBoostEffect.NAME, 0xc2f442); NaturesAuraAPI.EFFECT_POWDERS.put(CacheRechargeEffect.NAME, 0x1fb0d1); diff --git a/src/main/java/de/ellpeck/naturesaura/chunk/effect/NiceLookingEffect.java b/src/main/java/de/ellpeck/naturesaura/chunk/effect/NiceLookingEffect.java new file mode 100644 index 00000000..f53d9b37 --- /dev/null +++ b/src/main/java/de/ellpeck/naturesaura/chunk/effect/NiceLookingEffect.java @@ -0,0 +1,67 @@ +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; +import de.ellpeck.naturesaura.api.aura.type.IAuraType; +import de.ellpeck.naturesaura.packet.PacketHandler; +import de.ellpeck.naturesaura.packet.PacketParticles; +import net.minecraft.block.Block; +import net.minecraft.block.IGrowable; +import net.minecraft.block.state.IBlockState; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraft.world.chunk.Chunk; +import net.minecraftforge.common.IPlantable; +import org.apache.commons.lang3.mutable.MutableInt; + +public class NiceLookingEffect implements IDrainSpotEffect { + + public static final ResourceLocation NAME = new ResourceLocation(NaturesAura.MOD_ID, "nice_looking"); + + @Override + public void update(World world, Chunk chunk, IAuraChunk auraChunk, BlockPos pos, Integer spot) { + if (spot < 0) + return; + MutableInt aura = new MutableInt(); + MutableInt spots = new MutableInt(); + IAuraChunk.getSpotsInArea(world, pos, 35, (otherSpot, otherAmount) -> { + spots.add(1); + aura.add(otherAmount); + }); + int excess = aura.intValue(); + if (excess <= 0) + return; + int amount = Math.min(50, excess / 400); + if (amount < 2) + return; + if (spots.intValue() > 1) + amount = Math.max(2, amount / (spots.intValue() - 1)); + for (int i = amount + world.rand.nextInt(amount / 2); i > 1; i--) { + if (world.rand.nextFloat() >= 0.25F) + continue; + int x = pos.getX() + world.rand.nextInt(32) - 16; + int z = pos.getZ() + world.rand.nextInt(32) - 16; + BlockPos plantPos = new BlockPos(x, world.getHeight(x, z) - 1, z); + if (!world.isBlockLoaded(plantPos)) + continue; + IBlockState state = world.getBlockState(plantPos); + Block block = state.getBlock(); + if (block instanceof IGrowable || block instanceof IPlantable || block.isLeaves(state, world, plantPos)) + PacketHandler.sendToAllAround(world, plantPos, 32, + new PacketParticles(plantPos.getX(), plantPos.getY(), plantPos.getZ(), 21, excess)); + } + } + + @Override + public boolean appliesHere(Chunk chunk, IAuraChunk auraChunk, IAuraType type) { + return type == NaturesAuraAPI.TYPE_OVERWORLD; + } + + @Override + public ResourceLocation getName() { + return NAME; + } +} diff --git a/src/main/java/de/ellpeck/naturesaura/packet/PacketParticles.java b/src/main/java/de/ellpeck/naturesaura/packet/PacketParticles.java index 62efedba..b3b01858 100644 --- a/src/main/java/de/ellpeck/naturesaura/packet/PacketParticles.java +++ b/src/main/java/de/ellpeck/naturesaura/packet/PacketParticles.java @@ -1,5 +1,6 @@ package de.ellpeck.naturesaura.packet; +import de.ellpeck.naturesaura.ModConfig; import de.ellpeck.naturesaura.NaturesAura; import de.ellpeck.naturesaura.api.NaturesAuraAPI; import de.ellpeck.naturesaura.blocks.multi.Multiblocks; @@ -337,6 +338,22 @@ public class PacketParticles implements IMessage { return true; }); break; + case 21: // Nice looking effect + int excess = message.data[0]; + double setting = ModConfig.client.excessParticleAmount; + if (setting >= 1 || world.rand.nextFloat() <= setting) + NaturesAuraAPI.instance().spawnMagicParticle( + message.posX + world.rand.nextFloat(), + message.posY + world.rand.nextFloat(), + message.posZ + world.rand.nextFloat(), + world.rand.nextGaussian() * 0.01F, + world.rand.nextFloat() * 0.025F, + world.rand.nextGaussian() * 0.01F, + BiomeColorHelper.getFoliageColorAtPos(world, new BlockPos(message.posX, message.posY, message.posZ)), + Math.min(2F, 0.5F + world.rand.nextFloat() * (excess / 1000F)), + Math.min(300, 100 + world.rand.nextInt(excess / 30 + 1)), + 0F, false, true); + break; } } });