improved plant boost and particle height calculations

This commit is contained in:
Ell 2023-02-05 15:49:29 +01:00
parent 2953dd0eea
commit fe71e62ad4
3 changed files with 17 additions and 4 deletions

View file

@ -321,4 +321,16 @@ public final class Helper {
} }
return ItemStack.EMPTY; return ItemStack.EMPTY;
} }
public static BlockPos getClosestAirAboveGround(Level level, BlockPos pos, int radius) {
for (var i = 0; i < radius; i++) {
var up = pos.above(i);
if (level.isEmptyBlock(up) && !level.isEmptyBlock(up.below()))
return up;
var dn = pos.below(i);
if (level.isEmptyBlock(dn) && !level.isEmptyBlock(dn.below()))
return dn;
}
return pos;
}
} }

View file

@ -1,5 +1,6 @@
package de.ellpeck.naturesaura.chunk.effect; package de.ellpeck.naturesaura.chunk.effect;
import de.ellpeck.naturesaura.Helper;
import de.ellpeck.naturesaura.ModConfig; 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;
@ -65,9 +66,9 @@ public class PlantBoostEffect implements IDrainSpotEffect {
return; return;
for (var i = this.amount / 2 + level.random.nextInt(this.amount / 2); i >= 0; i--) { for (var i = this.amount / 2 + level.random.nextInt(this.amount / 2); i >= 0; i--) {
var x = Mth.floor(pos.getX() + (2 * level.random.nextFloat() - 1) * this.dist); var x = Mth.floor(pos.getX() + (2 * level.random.nextFloat() - 1) * this.dist);
var y = Mth.floor(pos.getY() + (2 * level.random.nextFloat() - 1) * this.dist); var y = Mth.floor(pos.getY() + (2 * level.random.nextFloat() - 1) * this.dist / 2);
var z = Mth.floor(pos.getZ() + (2 * level.random.nextFloat() - 1) * this.dist); var z = Mth.floor(pos.getZ() + (2 * level.random.nextFloat() - 1) * this.dist);
var plantPos = new BlockPos(x, y, z).below(); var plantPos = Helper.getClosestAirAboveGround(level, new BlockPos(x, y, z), this.dist / 2).below();
if (plantPos.distSqr(pos) <= this.dist * this.dist && level.isLoaded(plantPos)) { if (plantPos.distSqr(pos) <= this.dist * this.dist && level.isLoaded(plantPos)) {
if (NaturesAuraAPI.instance().isEffectPowderActive(level, plantPos, PlantBoostEffect.NAME)) if (NaturesAuraAPI.instance().isEffectPowderActive(level, plantPos, PlantBoostEffect.NAME))
continue; continue;

View file

@ -34,7 +34,6 @@ import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.BonemealableBlock; import net.minecraft.world.level.block.BonemealableBlock;
import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.LeavesBlock;
import net.minecraft.world.level.block.MyceliumBlock; import net.minecraft.world.level.block.MyceliumBlock;
import net.minecraft.world.level.levelgen.Heightmap;
import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.BlockHitResult;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
@ -110,8 +109,9 @@ public class ClientEvents {
var amount = Mth.floor(190 * ModConfig.instance.excessParticleAmount.get()); var amount = Mth.floor(190 * ModConfig.instance.excessParticleAmount.get());
for (var i = 0; i < amount; i++) { for (var i = 0; i < amount; i++) {
var x = Mth.floor(mc.player.getX()) + mc.level.random.nextInt(64) - 32; var x = Mth.floor(mc.player.getX()) + mc.level.random.nextInt(64) - 32;
var y = Mth.floor(mc.player.getY()) + mc.level.random.nextInt(32) - 16;
var z = Mth.floor(mc.player.getZ()) + mc.level.random.nextInt(64) - 32; var z = Mth.floor(mc.player.getZ()) + mc.level.random.nextInt(64) - 32;
var pos = new BlockPos(x, mc.level.getHeight(Heightmap.Types.WORLD_SURFACE, x, z) - 1, z); var pos = Helper.getClosestAirAboveGround(mc.level, new BlockPos(x, y, z), 16).below();
var state = mc.level.getBlockState(pos); var state = mc.level.getBlockState(pos);
var block = state.getBlock(); var block = state.getBlock();
if (block instanceof BonemealableBlock || block instanceof IPlantable || block instanceof LeavesBlock || block instanceof MyceliumBlock) { if (block instanceof BonemealableBlock || block instanceof IPlantable || block instanceof LeavesBlock || block instanceof MyceliumBlock) {