From 76667f95acce17193cf5ac344e46c8b20ac116c7 Mon Sep 17 00:00:00 2001 From: Sollace Date: Fri, 25 Sep 2020 22:59:36 +0200 Subject: [PATCH] Fixed pegasi not taking fall damage when they're supposed to --- .../entity/player/PlayerDimensions.java | 4 +-- .../unicopia/entity/player/PlayerPhysics.java | 30 ++++++++++++------- .../unicopia/entity/player/Pony.java | 25 +++++----------- .../unicopia/mixin/MixinPlayerEntity.java | 19 +++++++----- 4 files changed, 40 insertions(+), 38 deletions(-) diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerDimensions.java b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerDimensions.java index b401be85..e75400bb 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerDimensions.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerDimensions.java @@ -71,7 +71,7 @@ public final class PlayerDimensions { } } - if (physics.isFlying && physics.isRainboom()) { + if (physics.isFlyingSurvival && physics.isRainboom()) { return 0.5F; } @@ -89,7 +89,7 @@ public final class PlayerDimensions { } } - if (physics.isFlying && physics.isRainboom()) { + if (physics.isFlyingSurvival && physics.isRainboom()) { return defaultBodyHeight / 2; } 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 e4cc8157..3df491a5 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerPhysics.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerPhysics.java @@ -29,7 +29,8 @@ public class PlayerPhysics extends EntityPhysics implements Tickable, Moti public int ticksNextLevel = 0; public float flightExperience = 0; - public boolean isFlying = false; + public boolean isFlyingEither = false; + public boolean isFlyingSurvival = false; public boolean isRainbooming = false; private double lastTickPosX = 0; @@ -106,13 +107,18 @@ public class PlayerPhysics extends EntityPhysics implements Tickable, Moti entity.abilities.allowFlying = checkCanFly(); if (!creative) { - entity.abilities.flying |= entity.abilities.allowFlying && isFlying && !entity.isOnGround() && !entity.isTouchingWater(); + entity.abilities.flying |= entity.abilities.allowFlying && isFlyingEither; + + if ((entity.isOnGround() && entity.isSneaking()) || entity.isTouchingWater()) { + entity.abilities.flying = false; + } } - isFlying = entity.abilities.flying && !creative; + isFlyingSurvival = entity.abilities.flying && !creative; + isFlyingEither = isFlyingSurvival || (creative && entity.abilities.flying); if (!creative && !entity.isFallFlying()) { - if (isFlying && !entity.hasVehicle()) { + if (isFlyingSurvival && !entity.hasVehicle()) { if (!isRainbooming && getHorizontalMotion(entity) > 0.2 && flightExperience < MAXIMUM_FLIGHT_EXPERIENCE) { flightExperience++; @@ -179,7 +185,7 @@ public class PlayerPhysics extends EntityPhysics implements Tickable, Moti if (entity.isOnGround()) { entity.abilities.flying = false; - isFlying = false; + isFlyingSurvival = false; } } @@ -287,14 +293,14 @@ public class PlayerPhysics extends EntityPhysics implements Tickable, Moti if (entity.abilities.allowFlying) { entity.abilities.flying |= flying; - isFlying = entity.abilities.flying; + isFlyingSurvival = entity.abilities.flying; - if (isFlying) { + if (isFlyingSurvival) { ticksNextLevel = 0; } } else { entity.abilities.flying = false; - isFlying = false; + isFlyingSurvival = false; } } @@ -303,7 +309,8 @@ public class PlayerPhysics extends EntityPhysics implements Tickable, Moti super.toNBT(compound); compound.putInt("flightDuration", ticksNextLevel); compound.putFloat("flightExperience", flightExperience); - compound.putBoolean("isFlying", isFlying); + compound.putBoolean("isFlying", isFlyingSurvival); + compound.putBoolean("isFlyingEither", isFlyingEither); compound.putBoolean("isRainbooming", isRainbooming); } @@ -312,7 +319,8 @@ public class PlayerPhysics extends EntityPhysics implements Tickable, Moti super.fromNBT(compound); ticksNextLevel = compound.getInt("flightDuration"); flightExperience = compound.getFloat("flightExperience"); - isFlying = compound.getBoolean("isFlying"); + isFlyingSurvival = compound.getBoolean("isFlying"); + isFlyingEither = compound.getBoolean("isFlyingEither"); isRainbooming = compound.getBoolean("isRainbooming"); pony.getOwner().calculateDimensions(); @@ -320,7 +328,7 @@ public class PlayerPhysics extends EntityPhysics implements Tickable, Moti @Override public boolean isFlying() { - return isFlying; + return isFlyingSurvival; } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java index 12148826..6eeee864 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java @@ -69,8 +69,6 @@ public class Pony implements Caster, Equine, Transmi private final Interpolator interpolator = new LinearInterpolator(); - private float nextStepDistance = 1; - private final PlayerEntity entity; private boolean dirty; @@ -244,7 +242,8 @@ public class Pony implements Caster, Equine, Transmi EntityAttributeInstance attr = entity.getAttributes().getCustomInstance(PlayerAttributes.ENTITY_GRAVTY_MODIFIER); if (attr.hasModifier(PlayerAttributes.BAT_HANGING)) { - gravity.isFlying = false; + gravity.isFlyingSurvival = false; + gravity.isFlyingEither = false; entity.abilities.flying = false; if (Entity.squaredHorizontalLength(entity.getVelocity()) > 0.01 || entity.isSneaking() || !canHangAt()) { @@ -280,11 +279,12 @@ public class Pony implements Caster, Equine, Transmi prevSneaking = entity.isSneaking(); } - public float onImpact(float distance) { - if (getSpecies().canFly()) { - distance = Math.max(0, distance - 5); + public Optional onImpact(float distance, float damageMultiplier) { + if (getSpecies().canFly() && !entity.isCreative() && !entity.isSpectator()) { + return Optional.of(Math.max(0, distance - 5)); } - return distance; + + return Optional.empty(); } @Override @@ -323,17 +323,6 @@ public class Pony implements Caster, Equine, Transmi return entity.getHealth() > 0; } - public boolean stepOnCloud() { - if (entity.fallDistance > 1 || entity.distanceTraveled > nextStepDistance) { - nextStepDistance = entity.distanceTraveled + 2; - entity.fallDistance = 0; - - return true; - } - - return false; - } - public Optional trySleep(BlockPos pos) { if (findAllSpellsInRange(10).filter(p -> p instanceof Pony).map(Pony.class::cast).map(Pony::getSpecies).anyMatch(r -> r.isEnemy(getSpecies()))) { diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinPlayerEntity.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinPlayerEntity.java index 9319226b..34cc4e31 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/MixinPlayerEntity.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinPlayerEntity.java @@ -3,7 +3,6 @@ package com.minelittlepony.unicopia.mixin; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @@ -19,6 +18,7 @@ import net.minecraft.entity.LivingEntity; import net.minecraft.entity.attribute.DefaultAttributeContainer; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; +import net.minecraft.stat.Stats; import net.minecraft.util.Unit; import net.minecraft.util.math.BlockPos; import net.minecraft.world.GameMode; @@ -33,12 +33,17 @@ abstract class MixinPlayerEntity extends LivingEntity implements PonyContainer

info) { + get().onImpact(fallDistance, damageMultiplier).ifPresent(newDistance -> { + PlayerEntity self = (PlayerEntity)(Object)this; + + if (newDistance >= 2) { + self.increaseStat(Stats.FALL_ONE_CM, Math.round(newDistance * 100)); + } + + info.setReturnValue(super.handleFallDamage(newDistance, damageMultiplier)); + }); } @Inject(method = "createPlayerAttributes()Lnet/minecraft/entity/attribute/DefaultAttributeContainer$Builder;", at = @At("RETURN"))