Slightly clean up flight and dimensions predicates

This commit is contained in:
Sollace 2021-12-12 13:10:24 +02:00
parent 2cb57f85f2
commit bb50b20be4
4 changed files with 27 additions and 14 deletions

View file

@ -1,11 +1,10 @@
package com.minelittlepony.unicopia;
import com.minelittlepony.unicopia.entity.player.Pony;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.sound.SoundEvent;
public enum FlightType {
UNSET,
NONE,
AVIAN,
INSECTOID,
@ -23,6 +22,10 @@ public enum FlightType {
return this == ARTIFICIAL;
}
public boolean isPresent() {
return this != UNSET;
}
public boolean canFly() {
return !isGrounded();
}
@ -41,6 +44,6 @@ public enum FlightType {
* This overrides what the race specifies.
*/
public interface Provider {
FlightType getFlightType(Pony player);
FlightType getFlightType();
}
}

View file

@ -205,21 +205,22 @@ public class DisguiseSpell extends AbstractSpell implements Suppressable, Flight
}
@Override
public FlightType getFlightType(Pony player) {
if (isSuppressed() || !disguise.isPresent()) {
return player.getSpecies().getFlightType();
public FlightType getFlightType() {
return getAppearance().map(Disguise::getFlightType).orElse(FlightType.UNSET);
}
return disguise.getFlightType();
public Optional<Disguise> getAppearance() {
return isSuppressed() ? Optional.empty() : Optional.ofNullable(disguise);
}
@Override
public Optional<Float> getTargetEyeHeight(Pony player) {
return isSuppressed() ? Optional.empty() : disguise.getStandingEyeHeight();
return getAppearance().flatMap(d -> d.getTargetEyeHeight(player));
}
@Override
public Optional<EntityDimensions> getTargetDimensions(Pony player) {
return isSuppressed() ? Optional.empty() : disguise.getDimensions();
return getAppearance().flatMap(d -> d.getTargetDimensions(player));
}
static abstract class PlayerAccess extends PlayerEntity {

View file

@ -17,6 +17,7 @@ import com.minelittlepony.unicopia.Owned;
import com.minelittlepony.unicopia.ability.magic.Caster;
import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType;
import com.minelittlepony.unicopia.entity.player.PlayerAttributes;
import com.minelittlepony.unicopia.entity.player.PlayerDimensions;
import com.minelittlepony.unicopia.entity.player.Pony;
import com.minelittlepony.unicopia.projectile.ProjectileUtil;
import com.minelittlepony.unicopia.util.NbtSerialisable;
@ -49,7 +50,7 @@ import net.minecraft.util.shape.VoxelShape;
import net.minecraft.util.shape.VoxelShapes;
import net.minecraft.world.WorldAccess;
public class Disguise implements NbtSerialisable {
public class Disguise implements NbtSerialisable, PlayerDimensions.Provider, FlightType.Provider {
private static final Optional<Float> BLOCK_HEIGHT = Optional.of(0.5F);
@NotNull
@ -206,7 +207,12 @@ public class Disguise implements NbtSerialisable {
}
}
@Override
public FlightType getFlightType() {
if (!isPresent()) {
return FlightType.UNSET;
}
if (entity == null) {
return FlightType.NONE;
}
@ -231,7 +237,8 @@ public class Disguise implements NbtSerialisable {
return FlightType.NONE;
}
public Optional<Float> getStandingEyeHeight() {
@Override
public Optional<Float> getTargetEyeHeight(Pony player) {
if (entity != null) {
if (entity instanceof FallingBlockEntity) {
return BLOCK_HEIGHT;
@ -255,7 +262,8 @@ public class Disguise implements NbtSerialisable {
return EntityBehaviour.forEntity(entity).getCameraDistance(entity, player);
}
public Optional<EntityDimensions> getDimensions() {
@Override
public Optional<EntityDimensions> getTargetDimensions(Pony player) {
return dimensions = EntityBehaviour.forEntity(entity).getDimensions(entity, dimensions);
}

View file

@ -134,7 +134,8 @@ public class PlayerPhysics extends EntityPhysics<PlayerEntity> implements Tickab
return pony.getSpellSlot().get(true)
.filter(effect -> !effect.isDead() && effect instanceof FlightType.Provider)
.map(effect -> ((FlightType.Provider)effect).getFlightType(pony))
.map(effect -> ((FlightType.Provider)effect).getFlightType())
.filter(FlightType::isPresent)
.orElse(pony.getSpecies().getFlightType());
}