diff --git a/src/main/java/com/minelittlepony/unicopia/block/data/WeatherConditions.java b/src/main/java/com/minelittlepony/unicopia/block/data/WeatherConditions.java index 0ff2a6fa..3e7501c0 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/data/WeatherConditions.java +++ b/src/main/java/com/minelittlepony/unicopia/block/data/WeatherConditions.java @@ -9,6 +9,7 @@ import net.minecraft.nbt.NbtCompound; import net.minecraft.registry.tag.BlockTags; import net.minecraft.util.Identifier; import net.minecraft.util.math.*; +import net.minecraft.util.math.random.Random; import net.minecraft.world.Heightmap.Type; import net.minecraft.world.PersistentState; import net.minecraft.world.World; @@ -115,7 +116,12 @@ public class WeatherConditions extends PersistentState implements Tickable { Vec3d thermalGradient = THERMAL_FIELD.computeAverage(world, pos, probedPosition).multiply(terrainFactor); Vec3d wind = get(world).getWindDirection().multiply(1 - windFactor); - return terrainGradient.add(thermalGradient).add(wind).normalize().add(0, getUpdraft(probedPosition.set(pos), world), 0); + return terrainGradient + .add(thermalGradient) + .add(wind) + .normalize() + .add(0, getUpdraft(probedPosition.set(pos), world), 0) + .multiply(localAltitude / MAX_WIND_HEIGHT); } public static double getUpdraft(BlockPos.Mutable pos, World world) { @@ -148,6 +154,34 @@ public class WeatherConditions extends PersistentState implements Tickable { return 0; } + public static Vec3d getGustStrength(World world, BlockPos pos) { + Random random = getPositionalRandom(world, pos); + float strength = 0.015F * random.nextFloat(); + + if (random.nextInt(30) == 0) { + strength *= 10; + } + if (random.nextInt(30) == 0) { + strength *= 10; + } + if (random.nextInt(40) == 0) { + strength *= 100; + } + + strength = Math.min(strength, 7); + + float pitch = (180 * random.nextFloat()) - 90; + float yaw = (180 * random.nextFloat()) - 90; + + return new Vec3d(strength * world.getRainGradient(1), pitch, yaw); + } + + public static Random getPositionalRandom(World world, BlockPos pos) { + long posLong = ChunkPos.toLong(pos); + long time = world.getTime(); + return Random.create(posLong + time); + } + private static int getSurfaceBelow(BlockPos.Mutable pos, World world) { do { pos.move(Direction.DOWN); diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerPhysics.java b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerPhysics.java index 0f819cbf..984fcb9a 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerPhysics.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerPhysics.java @@ -32,13 +32,14 @@ import net.minecraft.nbt.NbtCompound; import net.minecraft.particle.ParticleTypes; import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundEvents; +import net.minecraft.text.Text; import net.minecraft.util.math.*; -import net.minecraft.util.math.random.Random; import net.minecraft.world.event.GameEvent; public class PlayerPhysics extends EntityPhysics implements Tickable, Motion, NbtSerialisable { private static final int MAX_WALL_HIT_CALLDOWN = 30; private static final int MAX_TICKS_TO_GLIDE = 20; + private static final int MAX_TICKS_TO_WEATHER_EFFECTS = 100; private static final int IDLE_FLAP_INTERVAL = 20; private static final int GLIDING_SOUND_INTERVAL = 200; @@ -564,42 +565,24 @@ public class PlayerPhysics extends EntityPhysics implements Tickab } private void applyTurbulance(MutableVector velocity) { + float effectStrength = Math.min(1, (float)ticksInAir / MAX_TICKS_TO_WEATHER_EFFECTS); + Vec3d gust = WeatherConditions.getGustStrength(entity.world, entity.getBlockPos()); - Vec3d wind = WeatherConditions.getAirflow(entity.getBlockPos(), entity.world).multiply(0.04); - velocity.x += wind.x; - velocity.y += wind.y; - velocity.z += wind.z; - - Random rng = Random.create(entity.world.getTime()); - - float glance = 360 * rng.nextFloat(); - float forward = 0.015F * rng.nextFloat() * entity.world.getRainGradient(1); - - if (entity.world.random.nextInt(30) == 0) { - forward *= 10; - } - if (entity.world.random.nextInt(30) == 0) { - forward *= 10; - } - if (entity.world.random.nextInt(40) == 0) { - forward *= 100; - } - - if (entity.world.isThundering() && rng.nextInt(60) == 0) { - velocity.y += forward * 3 * getGravitySignum(); - } - - if (forward >= 1) { + if (effectStrength * gust.getX() >= 1) { SoundEmitter.playSoundAt(entity, USounds.AMBIENT_WIND_GUST, SoundCategory.AMBIENT, 3, 1); } - forward = Math.min(forward, 7); - forward /= 1 + (EnchantmentHelper.getEquipmentLevel(UEnchantments.HEAVY, entity) * 0.8F); + float weight = 1 + (EnchantmentHelper.getEquipmentLevel(UEnchantments.HEAVY, entity) * 0.8F) + (pony.getActualSpecies().canUseEarth() ? 1 : 0); - velocity.x += - forward * MathHelper.sin((entity.getYaw() + glance) * 0.017453292F); - velocity.z += forward * MathHelper.cos((entity.getYaw() + glance) * 0.017453292F); + velocity.add(WeatherConditions.getAirflow(entity.getBlockPos(), entity.world), 0.04F * effectStrength); + velocity.add(Vec3d.fromPolar( + (entity.getPitch() + (float)gust.getY()) * MathHelper.RADIANS_PER_DEGREE, + (entity.getYaw() + (float)gust.getZ()) * MathHelper.RADIANS_PER_DEGREE + ), + effectStrength * (float)gust.getX() / weight + ); - if (!entity.world.isClient && entity.world.isThundering() && entity.world.random.nextInt(9000) == 0) { + if (!entity.world.isClient && effectStrength > 0.9F && entity.world.isThundering() && entity.world.random.nextInt(9000) == 0) { LightningEntity lightning = EntityType.LIGHTNING_BOLT.create(entity.world); lightning.refreshPositionAfterTeleport(entity.getX(), entity.getY(), entity.getZ()); diff --git a/src/main/java/com/minelittlepony/unicopia/util/MutableVector.java b/src/main/java/com/minelittlepony/unicopia/util/MutableVector.java index 291a2275..c76e0209 100644 --- a/src/main/java/com/minelittlepony/unicopia/util/MutableVector.java +++ b/src/main/java/com/minelittlepony/unicopia/util/MutableVector.java @@ -20,6 +20,24 @@ public class MutableVector { z = vec.z; } + public void add(Vec3d vector) { + add(vector.x, vector.y, vector.z); + } + + public void add(Vec3d vector, float scale) { + add(vector.x, vector.y, vector.z, scale); + } + + public void add(double x, double y, double z, float scale) { + add(x * scale, y * scale, z * scale); + } + + public void add(double x, double y, double z) { + this.x += x; + this.y += y; + this.z += z; + } + public Vec3d toImmutable() { return new Vec3d(x, y, z); }