From aa1973181fae2b33073f97b54f51951ada568d6f Mon Sep 17 00:00:00 2001 From: Sollace Date: Sat, 23 Mar 2024 23:40:00 +0000 Subject: [PATCH] #317 +Allow bats and hippos to walk on clouds without having to give them other pegasus abilities Separate cloud interaction and ability to collect weather jars/use rainboom ability into two flags --- .../unicopia/EquineContext.java | 2 +- .../unicopia/EquinePredicates.java | 3 +-- .../com/minelittlepony/unicopia/Race.java | 20 +++++++++++++++++++ .../ability/PegasusCaptureStormAbility.java | 2 +- .../ability/PegasusRainboomAbility.java | 2 +- .../unicopia/entity/ItemImpl.java | 2 +- .../unicopia/item/FriendshipBraceletItem.java | 7 +++++-- 7 files changed, 30 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/minelittlepony/unicopia/EquineContext.java b/src/main/java/com/minelittlepony/unicopia/EquineContext.java index bea77626..2bd9bf0b 100644 --- a/src/main/java/com/minelittlepony/unicopia/EquineContext.java +++ b/src/main/java/com/minelittlepony/unicopia/EquineContext.java @@ -22,7 +22,7 @@ public interface EquineContext { } default boolean collidesWithClouds() { - return getCompositeRace().any(Race::canInteractWithClouds); + return getCompositeRace().canInteractWithClouds(); } static EquineContext of(ShapeContext context) { diff --git a/src/main/java/com/minelittlepony/unicopia/EquinePredicates.java b/src/main/java/com/minelittlepony/unicopia/EquinePredicates.java index 6286b123..2e67d2c2 100644 --- a/src/main/java/com/minelittlepony/unicopia/EquinePredicates.java +++ b/src/main/java/com/minelittlepony/unicopia/EquinePredicates.java @@ -20,7 +20,7 @@ public interface EquinePredicates { Predicate BAT = physicalRaceMatches(Race.BAT::equals); Predicate CHANGELING = physicalRaceMatches(Race.CHANGELING::equals); - Predicate RACE_INTERACT_WITH_CLOUDS = raceMatches(Race::canInteractWithClouds); + Predicate RACE_CAN_INFLUENCE_WEATHER = raceMatches(Race::canInfluenceWeather); Predicate RAGING = IS_PLAYER.and(SpellType.RAGE::isOn); Predicate PLAYER_EARTH = IS_PLAYER.and(ofRace(Race.EARTH)); @@ -28,7 +28,6 @@ public interface EquinePredicates { Predicate PLAYER_UNICORN = IS_PLAYER.and(raceMatches(Race::canCast)); Predicate PLAYER_CHANGELING = IS_PLAYER.and(ofRace(Race.CHANGELING)); Predicate PLAYER_KIRIN = IS_PLAYER.and(ofRace(Race.KIRIN)); - Predicate PLAYER_PEGASUS = IS_PLAYER.and(e -> ((PlayerEntity)e).getAbilities().creativeMode || RACE_INTERACT_WITH_CLOUDS.test(e)); Predicate PLAYER_SEAPONY = IS_PLAYER.and(raceMatches(Race::isFish)); Predicate PLAYER_CAN_USE_EARTH = IS_PLAYER.and(raceMatches(Race::canUseEarth)); diff --git a/src/main/java/com/minelittlepony/unicopia/Race.java b/src/main/java/com/minelittlepony/unicopia/Race.java index a6d73d72..a6ae1c58 100644 --- a/src/main/java/com/minelittlepony/unicopia/Race.java +++ b/src/main/java/com/minelittlepony/unicopia/Race.java @@ -108,9 +108,17 @@ public record Race (Supplier compositeSupplier, Availability availabi } public boolean canInteractWithClouds() { + return canFly() && this != CHANGELING; + } + + public boolean canInfluenceWeather() { return canFly() && this != CHANGELING && this != BAT && this != HIPPOGRIFF; } + public boolean hasPersistentWeatherMagic() { + return canInfluenceWeather(); + } + public Identifier getId() { return REGISTRY.getId(this); } @@ -225,6 +233,18 @@ public record Race (Supplier compositeSupplier, Availability availabi return any(Race::canCast); } + public boolean canInteractWithClouds() { + return any(Race::canInteractWithClouds); + } + + public boolean canInfluenceWeather() { + return any(Race::canInfluenceWeather); + } + + public boolean hasPersistentWeatherMagic() { + return any(Race::hasPersistentWeatherMagic); + } + public FlightType flightType() { if (pseudo() == null) { return physical().flightType(); diff --git a/src/main/java/com/minelittlepony/unicopia/ability/PegasusCaptureStormAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/PegasusCaptureStormAbility.java index 3bbdd31f..b02579df 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/PegasusCaptureStormAbility.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/PegasusCaptureStormAbility.java @@ -35,7 +35,7 @@ public class PegasusCaptureStormAbility implements Ability { @Override public boolean canUse(Race race) { - return race.canInteractWithClouds(); + return race.canInfluenceWeather(); } @Nullable diff --git a/src/main/java/com/minelittlepony/unicopia/ability/PegasusRainboomAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/PegasusRainboomAbility.java index bbe7256e..606cd65f 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/PegasusRainboomAbility.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/PegasusRainboomAbility.java @@ -28,7 +28,7 @@ public class PegasusRainboomAbility implements Ability { @Override public boolean canUse(Race race) { - return race.canInteractWithClouds(); + return race.canInfluenceWeather(); } @Nullable diff --git a/src/main/java/com/minelittlepony/unicopia/entity/ItemImpl.java b/src/main/java/com/minelittlepony/unicopia/entity/ItemImpl.java index 3d594ea7..59d84ddb 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/ItemImpl.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/ItemImpl.java @@ -160,7 +160,7 @@ public class ItemImpl implements Equine { @Override public boolean collidesWithClouds() { - return entity.getStack().isIn(UTags.FLOATS_ON_CLOUDS) || getSpecies().canInteractWithClouds(); + return entity.getStack().isIn(UTags.FLOATS_ON_CLOUDS) || getSpecies().hasPersistentWeatherMagic(); } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/item/FriendshipBraceletItem.java b/src/main/java/com/minelittlepony/unicopia/item/FriendshipBraceletItem.java index 8a9c2416..40e10dc4 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/FriendshipBraceletItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/FriendshipBraceletItem.java @@ -39,8 +39,11 @@ public class FriendshipBraceletItem extends WearableItem implements DyeableItem, public TypedActionResult use(World world, PlayerEntity player, Hand hand) { ItemStack stack = player.getStackInHand(hand); - if (!isSigned(stack) && (EquinePredicates.PLAYER_UNICORN.test(player) || EquinePredicates.PLAYER_PEGASUS.test(player) - || AmuletSelectors.PEARL_NECKLACE.test(player))) { + if (!isSigned(stack) && ( + EquinePredicates.PLAYER_UNICORN.test(player) + || EquinePredicates.RACE_CAN_INFLUENCE_WEATHER.test(player) + || AmuletSelectors.PEARL_NECKLACE.test(player) + )) { player.setCurrentHand(hand); ItemStack result = stack.copy();