diff --git a/src/main/java/com/minelittlepony/unicopia/entity/Living.java b/src/main/java/com/minelittlepony/unicopia/entity/Living.java index 7977898e..f2a028ad 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/Living.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/Living.java @@ -15,8 +15,10 @@ import com.minelittlepony.unicopia.ability.magic.Caster; import com.minelittlepony.unicopia.ability.magic.SpellContainer; import com.minelittlepony.unicopia.ability.magic.SpellPredicate; import com.minelittlepony.unicopia.ability.magic.SpellContainer.Operation; +import com.minelittlepony.unicopia.ability.magic.spell.AbstractDisguiseSpell; import com.minelittlepony.unicopia.ability.magic.spell.Situation; import com.minelittlepony.unicopia.advancement.UCriteria; +import com.minelittlepony.unicopia.entity.behaviour.EntityAppearance; import com.minelittlepony.unicopia.entity.duck.LivingEntityDuck; import com.minelittlepony.unicopia.entity.effect.UEffects; import com.minelittlepony.unicopia.entity.player.Pony; @@ -328,6 +330,13 @@ public abstract class Living implements Equine, Caste return Optional.empty(); } + public Optional chooseClimbingPos() { + return getSpellSlot().get(SpellPredicate.IS_DISGUISE, false) + .map(AbstractDisguiseSpell::getDisguise) + .filter(EntityAppearance::canClimbWalls) + .map(v -> entity.getBlockPos()); + } + private boolean tryCaptureLightning() { return getInventoryStacks().filter(stack -> !stack.isEmpty() && stack.getItem() == UItems.EMPTY_JAR).findFirst().map(stack -> { invinsibilityTicks = 20; 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 e1242b8b..755146cd 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java @@ -171,7 +171,6 @@ public class Pony extends Living implements Copyable, Update if (animation.isOf(Animation.NONE)) { return 0; } - System.out.println(animationMaxDuration); return 1 - (((float)animationDuration) / animationMaxDuration); } @@ -360,6 +359,11 @@ public class Pony extends Living implements Copyable, Update powers.tick(); + if (entity.getClimbingPos().isPresent() && entity.isSneaky()) { + Vec3d vel = entity.getVelocity(); + entity.setVelocity(vel.x, 0, vel.z); + } + return false; } @@ -397,6 +401,14 @@ public class Pony extends Living implements Copyable, Update return state.isSolidSurface(asWorld(), pos, entity, Direction.DOWN); } + @Override + public Optional chooseClimbingPos() { + if (getObservedSpecies() == Race.CHANGELING && getSpellSlot().get(SpellPredicate.IS_DISGUISE, false).isEmpty()) { + return Optional.of(entity.getBlockPos()); + } + return super.chooseClimbingPos(); + } + private void updateAnimations() { if (animationDuration > 0 && --animationDuration <= 0) { setAnimation(AnimationInstance.NONE); diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinLivingEntity.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinLivingEntity.java index e6cbed71..a185d11a 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/MixinLivingEntity.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinLivingEntity.java @@ -17,7 +17,6 @@ import com.minelittlepony.unicopia.ability.magic.spell.AbstractDisguiseSpell; import com.minelittlepony.unicopia.entity.*; import com.minelittlepony.unicopia.entity.behaviour.EntityAppearance; import com.minelittlepony.unicopia.entity.duck.*; -import com.minelittlepony.unicopia.entity.player.Pony; import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; @@ -85,12 +84,9 @@ abstract class MixinLivingEntity extends Entity implements LivingEntityDuck, Equ @Inject(method = "isClimbing()Z", at = @At("HEAD"), cancellable = true) public void onIsClimbing(CallbackInfoReturnable info) { - if (get() instanceof Pony && horizontalCollision) { - ((Pony)get()).getSpellSlot().get(SpellPredicate.IS_DISGUISE, false) - .map(AbstractDisguiseSpell::getDisguise) - .filter(EntityAppearance::canClimbWalls) - .ifPresent(v -> { - climbingPos = Optional.of(getBlockPos()); + if (horizontalCollision) { + get().chooseClimbingPos().ifPresent(pos -> { + climbingPos = Optional.of(pos); info.setReturnValue(true); }); }