added a nice looking aura effect

This commit is contained in:
Ellpeck 2019-01-27 19:12:48 +01:00
parent 95e7f398e3
commit 37bd687d1f
5 changed files with 88 additions and 4 deletions

View file

@ -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%") @Comment("The percentage of particles that should be displayed, where 1 is 100% and 0 is 0%")
@RangeDouble(min = 0, max = 1) @RangeDouble(min = 0, max = 1)
public double particleAmount = 1; public double particleAmount = 1;
@Comment("If particle spawning should respect the particle setting in Minecraft's video settings screen") @Comment("If particle spawning should respect the particle setting in Minecraft's video settings screen")
public boolean respectVanillaParticleSettings = true; 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") @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; 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") @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; public boolean debugWorld = false;
} }

View file

@ -61,9 +61,8 @@ public class AuraChunk implements IAuraChunk {
return 0; return 0;
MutableInt spot = this.getActualDrainSpot(pos, true); MutableInt spot = this.getActualDrainSpot(pos, true);
int curr = spot.intValue(); 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); return this.drainAura(pos.up(), amount, aimForZero, simulate);
}
if (aimForZero) { if (aimForZero) {
if (curr > 0 && curr - amount < 0) if (curr > 0 && curr - amount < 0)
amount = curr; amount = curr;

View file

@ -14,6 +14,7 @@ public final class DrainSpotEffects {
NaturesAuraAPI.DRAIN_SPOT_EFFECTS.put(SpreadEffect.NAME, SpreadEffect::new); NaturesAuraAPI.DRAIN_SPOT_EFFECTS.put(SpreadEffect.NAME, SpreadEffect::new);
NaturesAuraAPI.DRAIN_SPOT_EFFECTS.put(CacheRechargeEffect.NAME, CacheRechargeEffect::new); NaturesAuraAPI.DRAIN_SPOT_EFFECTS.put(CacheRechargeEffect.NAME, CacheRechargeEffect::new);
NaturesAuraAPI.DRAIN_SPOT_EFFECTS.put(AnimalEffect.NAME, AnimalEffect::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(PlantBoostEffect.NAME, 0xc2f442);
NaturesAuraAPI.EFFECT_POWDERS.put(CacheRechargeEffect.NAME, 0x1fb0d1); NaturesAuraAPI.EFFECT_POWDERS.put(CacheRechargeEffect.NAME, 0x1fb0d1);

View file

@ -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;
}
}

View file

@ -1,5 +1,6 @@
package de.ellpeck.naturesaura.packet; package de.ellpeck.naturesaura.packet;
import de.ellpeck.naturesaura.ModConfig;
import de.ellpeck.naturesaura.NaturesAura; import de.ellpeck.naturesaura.NaturesAura;
import de.ellpeck.naturesaura.api.NaturesAuraAPI; import de.ellpeck.naturesaura.api.NaturesAuraAPI;
import de.ellpeck.naturesaura.blocks.multi.Multiblocks; import de.ellpeck.naturesaura.blocks.multi.Multiblocks;
@ -337,6 +338,22 @@ public class PacketParticles implements IMessage {
return true; return true;
}); });
break; 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;
} }
} }
}); });