diff --git a/src/main/java/com/minelittlepony/unicopia/EquinePredicates.java b/src/main/java/com/minelittlepony/unicopia/EquinePredicates.java index eb308efb..8662861b 100644 --- a/src/main/java/com/minelittlepony/unicopia/EquinePredicates.java +++ b/src/main/java/com/minelittlepony/unicopia/EquinePredicates.java @@ -2,12 +2,8 @@ package com.minelittlepony.unicopia; import java.util.function.Predicate; -import org.jetbrains.annotations.Nullable; - import com.minelittlepony.unicopia.ability.magic.Caster; -import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType; import com.minelittlepony.unicopia.entity.Equine; -import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.item.enchantment.UEnchantments; import net.minecraft.enchantment.EnchantmentHelper; @@ -31,10 +27,6 @@ public interface EquinePredicates { Predicate HAS_WANT_IT_NEED_IT = e -> EnchantmentHelper.getEquipmentLevel(UEnchantments.WANT_IT_NEED_IT, e) > 0; - static Predicate carryingSpell(@Nullable SpellType type) { - return IS_PLAYER.and(e -> Pony.of((PlayerEntity)e).getSpellSlot().get(type, false).isPresent()); - } - static Predicate ofRace(Race race) { return raceMatches(race::equals); } diff --git a/src/main/java/com/minelittlepony/unicopia/ability/BatEeeeAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/BatEeeeAbility.java index 6bd06037..b1af8057 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/BatEeeeAbility.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/BatEeeeAbility.java @@ -1,7 +1,6 @@ package com.minelittlepony.unicopia.ability; import java.util.Random; -import java.util.function.Predicate; import com.minelittlepony.unicopia.AwaitTickQueue; import com.minelittlepony.unicopia.EquinePredicates; @@ -13,7 +12,6 @@ import com.minelittlepony.unicopia.advancement.UCriteria; import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.util.MagicalDamageSource; -import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; import net.minecraft.sound.SoundCategory; import net.minecraft.util.math.Vec3d; @@ -24,8 +22,6 @@ import net.minecraft.util.math.Vec3d; */ public class BatEeeeAbility implements Ability { - private static final Predicate HAS_SHIELD = EquinePredicates.carryingSpell(SpellType.SHIELD); - @Override public int getWarmupTime(Pony player) { return 1; @@ -84,7 +80,7 @@ public class BatEeeeAbility implements Ability { } int total = player.findAllEntitiesInRange(5).mapToInt(e -> { - if (e instanceof LivingEntity && !HAS_SHIELD.test(e)) { + if (e instanceof LivingEntity && !SpellType.SHIELD.isOn(e)) { boolean isEarthPony = EquinePredicates.PLAYER_EARTH.test(e); e.damage(MagicalDamageSource.create("eeee", player), isEarthPony ? 0.1F : 0.3F); diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/Suppressable.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/IllusionarySpell.java similarity index 78% rename from src/main/java/com/minelittlepony/unicopia/ability/magic/Suppressable.java rename to src/main/java/com/minelittlepony/unicopia/ability/magic/IllusionarySpell.java index b38cb9ee..7acf2371 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/Suppressable.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/IllusionarySpell.java @@ -5,7 +5,7 @@ import com.minelittlepony.unicopia.ability.magic.spell.Spell; /** * Magic effects that can be suppressed by other nearby effects. */ -public interface Suppressable extends Spell { +public interface IllusionarySpell extends Spell { /** * Returns true if this spell is currently still suppressed. @@ -13,7 +13,7 @@ public interface Suppressable extends Spell { boolean isSuppressed(); /** - * Returns true if this spell can be suppressed by the given other spell and caster. + * Returns true if this illusion can be suppressed by the given other spell and caster. */ boolean isVulnerable(Caster otherSource, Spell other); diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/SpellPredicate.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/SpellPredicate.java index c0ae2284..96d50971 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/SpellPredicate.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/SpellPredicate.java @@ -5,15 +5,21 @@ import java.util.function.Predicate; import com.minelittlepony.unicopia.ability.magic.spell.AbstractDisguiseSpell; import com.minelittlepony.unicopia.ability.magic.spell.ProjectileSpell; import com.minelittlepony.unicopia.ability.magic.spell.Spell; +import com.minelittlepony.unicopia.ability.magic.spell.effect.ShieldSpell; + +import net.minecraft.entity.Entity; public interface SpellPredicate extends Predicate { - SpellPredicate CAN_SUPPRESS = s -> s instanceof Suppressable; - + SpellPredicate CAN_SUPPRESS = s -> s instanceof IllusionarySpell; SpellPredicate HAS_PROJECTILE_EVENTS = s -> s instanceof ProjectileSpell; - SpellPredicate IS_DISGUISE = s -> s instanceof AbstractDisguiseSpell; + SpellPredicate IS_SHIELD_LIKE = spell -> spell instanceof ShieldSpell; default boolean isOn(Caster caster) { return caster.getSpellSlot().contains(this); } + + default boolean isOn(Entity entity) { + return Caster.of(entity).filter(this::isOn).isPresent(); + } } \ No newline at end of file diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/AbstractAreaEffectSpell.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/AbstractAreaEffectSpell.java index 916a50da..c92c596e 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/AbstractAreaEffectSpell.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/AbstractAreaEffectSpell.java @@ -6,7 +6,6 @@ import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType; import com.minelittlepony.unicopia.ability.magic.spell.trait.SpellTraits; public abstract class AbstractAreaEffectSpell extends AbstractSpell { - protected AbstractAreaEffectSpell(SpellType type, SpellTraits traits) { super(type, traits); } @@ -15,5 +14,4 @@ public abstract class AbstractAreaEffectSpell extends AbstractSpell { public boolean apply(Caster source) { return toPlaceable().apply(source); } - } diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/AbstractDisguiseSpell.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/AbstractDisguiseSpell.java index e6e03455..542e5600 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/AbstractDisguiseSpell.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/AbstractDisguiseSpell.java @@ -15,8 +15,7 @@ import net.minecraft.entity.projectile.ProjectileEntity; import net.minecraft.nbt.NbtCompound; /** - * Shapeshifts the player. - *

+ * Base implementation for a spell that changes the player's appearance. */ public abstract class AbstractDisguiseSpell extends AbstractSpell implements Disguise, ProjectileImpactListener { diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/ChangelingDisguiseSpell.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/DispersableDisguiseSpell.java similarity index 92% rename from src/main/java/com/minelittlepony/unicopia/ability/magic/spell/ChangelingDisguiseSpell.java rename to src/main/java/com/minelittlepony/unicopia/ability/magic/spell/DispersableDisguiseSpell.java index 192d9412..727c6257 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/ChangelingDisguiseSpell.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/DispersableDisguiseSpell.java @@ -3,7 +3,7 @@ package com.minelittlepony.unicopia.ability.magic.spell; import java.util.Optional; import com.minelittlepony.unicopia.ability.magic.Caster; -import com.minelittlepony.unicopia.ability.magic.Suppressable; +import com.minelittlepony.unicopia.ability.magic.IllusionarySpell; import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType; import com.minelittlepony.unicopia.ability.magic.spell.trait.SpellTraits; import com.minelittlepony.unicopia.ability.magic.spell.trait.Trait; @@ -20,11 +20,11 @@ import net.minecraft.nbt.NbtCompound; *

* Internal. Used by the changeling ability. */ -public class ChangelingDisguiseSpell extends AbstractDisguiseSpell implements Suppressable { +public class DispersableDisguiseSpell extends AbstractDisguiseSpell implements IllusionarySpell { private int suppressionCounter; - public ChangelingDisguiseSpell(SpellType type, SpellTraits traits) { + public DispersableDisguiseSpell(SpellType type, SpellTraits traits) { super(type, traits); } diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/PlaceableSpell.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/PlaceableSpell.java index 85a70bab..50ef1743 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/PlaceableSpell.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/PlaceableSpell.java @@ -19,12 +19,11 @@ import net.minecraft.nbt.NbtCompound; import net.minecraft.util.Identifier; import net.minecraft.util.math.Vec3d; -// TODO: We'll need a recipe to make a spell placeable /** * A spell that can be attached to a specific location in the world. *

* The spell's effects are still powered by the casting player, so if the player dies or leaves the area, their - * spell loses effect until they return. + * spell loses affect until they return. */ public class PlaceableSpell extends AbstractDelegatingSpell { @Nullable diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/JoustingSpell.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/RainboomAbilitySpell.java similarity index 96% rename from src/main/java/com/minelittlepony/unicopia/ability/magic/spell/JoustingSpell.java rename to src/main/java/com/minelittlepony/unicopia/ability/magic/spell/RainboomAbilitySpell.java index 977dd19f..40c57bad 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/JoustingSpell.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/RainboomAbilitySpell.java @@ -27,7 +27,7 @@ import net.minecraft.world.GameRules; *

* Used by the Rainboom ability. */ -public class JoustingSpell extends AbstractSpell { +public class RainboomAbilitySpell extends AbstractSpell { private final int rad = 5; private final Shape effect_range = new Sphere(false, rad); @@ -36,7 +36,7 @@ public class JoustingSpell extends AbstractSpell { private int age; - public JoustingSpell(SpellType type, SpellTraits traits) { + public RainboomAbilitySpell(SpellType type, SpellTraits traits) { super(type, traits); } diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/DarkVortexSpell.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/DarkVortexSpell.java index a78f8d6b..2e4380ff 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/DarkVortexSpell.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/DarkVortexSpell.java @@ -1,5 +1,6 @@ package com.minelittlepony.unicopia.ability.magic.spell.effect; +import com.minelittlepony.unicopia.USounds; import com.minelittlepony.unicopia.ability.magic.Caster; import com.minelittlepony.unicopia.ability.magic.spell.Situation; import com.minelittlepony.unicopia.ability.magic.spell.trait.SpellTraits; @@ -23,7 +24,7 @@ public class DarkVortexSpell extends AttractiveSpell { .with(Trait.DARKNESS, 100) .build(); - private int accumulatedMass = 0; + private float accumulatedMass = 0; protected DarkVortexSpell(SpellType type, SpellTraits traits) { super(type, traits); @@ -41,7 +42,11 @@ public class DarkVortexSpell extends AttractiveSpell { return true; } - if (accumulatedMass > 20) { + if (!source.isClient()) { + accumulatedMass += 0.001F * (1 + getTraits().get(Trait.STRENGTH, 70, 120) - 70); + } + + if (accumulatedMass > 20 * getTraits().get(Trait.POWER, 1, 60) / 10F) { if (!source.isClient()) { Vec3d pos = source.getOriginVector(); source.getWorld().createExplosion( @@ -72,6 +77,10 @@ public class DarkVortexSpell extends AttractiveSpell { }).ifPresent(p -> { p.setAttribute(0, radius); }); + + if (source.getEntity().age % 20 == 0) { + source.playSound(USounds.AMBIENT_WIND_GUST, 1, 1); + } } @Override @@ -83,13 +92,10 @@ public class DarkVortexSpell extends AttractiveSpell { protected long applyEntities(Caster source) { if (!source.isClient()) { PosHelper.getAllInRegionMutable(source.getOrigin(), new Sphere(false, 1 + ((int)getDrawDropOffRange(source) / 2F))).forEach(i -> { - if (!source.getWorld().isAir(i)) { + if (!source.getWorld().isAir(i) && source.getWorld().random.nextInt(120) == 0) { source.getWorld().breakBlock(i, false); - if (source.getWorld().random.nextInt(accumulatedMass + 1) == 0) { - accumulatedMass++; - setDirty(); - } - + accumulatedMass++; + setDirty(); } }); } @@ -112,12 +118,12 @@ public class DarkVortexSpell extends AttractiveSpell { @Override public void toNBT(NbtCompound compound) { super.toNBT(compound); - compound.putInt("accumulatedMass", accumulatedMass); + compound.putFloat("accumulatedMass", accumulatedMass); } @Override public void fromNBT(NbtCompound compound) { super.fromNBT(compound); - accumulatedMass = compound.getInt("accumulatedMass"); + accumulatedMass = compound.getFloat("accumulatedMass"); } } diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/RevealingSpell.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/DisperseIllusionSpell.java similarity index 90% rename from src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/RevealingSpell.java rename to src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/DisperseIllusionSpell.java index 1d127087..f3625be9 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/RevealingSpell.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/DisperseIllusionSpell.java @@ -14,10 +14,10 @@ import net.minecraft.sound.SoundEvents; import net.minecraft.util.math.Vec3d; /** - * An area-effect spell that suppresses other forms of magic + * An area-effect spell that disperses illussions. */ -public class RevealingSpell extends AbstractAreaEffectSpell { - protected RevealingSpell(SpellType type, SpellTraits traits) { +public class DisperseIllusionSpell extends AbstractAreaEffectSpell { + protected DisperseIllusionSpell(SpellType type, SpellTraits traits) { super(type, traits); } diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/ShieldSpell.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/ShieldSpell.java index 6b208fb1..38af19fa 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/ShieldSpell.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/ShieldSpell.java @@ -10,6 +10,7 @@ import com.minelittlepony.unicopia.Affinity; import com.minelittlepony.unicopia.EquinePredicates; import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.ability.magic.Caster; +import com.minelittlepony.unicopia.ability.magic.SpellPredicate; import com.minelittlepony.unicopia.ability.magic.spell.Situation; import com.minelittlepony.unicopia.ability.magic.spell.trait.SpellTraits; import com.minelittlepony.unicopia.ability.magic.spell.trait.Trait; @@ -128,6 +129,7 @@ public class ShieldSpell extends AbstractSpell { return source.findAllEntitiesInRange(radius) .filter(entity -> { return !FriendshipBraceletItem.isComrade(source, entity) + && !SpellPredicate.IS_SHIELD_LIKE.isOn(entity) && isValidTarget(entity) && !(ownerIsValid && (Pony.equal(entity, owner) || owner.isConnectedThroughVehicle(entity))); }) diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/SpellType.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/SpellType.java index 7eda7047..a0257c4f 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/SpellType.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/effect/SpellType.java @@ -12,10 +12,10 @@ import com.minelittlepony.unicopia.Affinity; import com.minelittlepony.unicopia.ability.magic.Affine; import com.minelittlepony.unicopia.ability.magic.Caster; import com.minelittlepony.unicopia.ability.magic.SpellPredicate; -import com.minelittlepony.unicopia.ability.magic.spell.CompoundSpell; import com.minelittlepony.unicopia.ability.magic.spell.AbstractDisguiseSpell; -import com.minelittlepony.unicopia.ability.magic.spell.ChangelingDisguiseSpell; -import com.minelittlepony.unicopia.ability.magic.spell.JoustingSpell; +import com.minelittlepony.unicopia.ability.magic.spell.CompoundSpell; +import com.minelittlepony.unicopia.ability.magic.spell.DispersableDisguiseSpell; +import com.minelittlepony.unicopia.ability.magic.spell.RainboomAbilitySpell; import com.minelittlepony.unicopia.ability.magic.spell.PlaceableSpell; import com.minelittlepony.unicopia.ability.magic.spell.Spell; import com.minelittlepony.unicopia.ability.magic.spell.ThrowableSpell; @@ -43,8 +43,8 @@ public final class SpellType implements Affine, SpellPredicate< public static final SpellType PLACED_SPELL = register("placed", Affinity.NEUTRAL, 0, false, PlaceableSpell::new); public static final SpellType THROWN_SPELL = register("thrown", Affinity.NEUTRAL, 0, false, ThrowableSpell::new); - public static final SpellType CHANGELING_DISGUISE = register("disguise", Affinity.BAD, 0x19E48E, false, ChangelingDisguiseSpell::new); - public static final SpellType RAINBOOM = register("rainboom", Affinity.GOOD, 0xBDBDF9, false, JoustingSpell::new); + public static final SpellType CHANGELING_DISGUISE = register("disguise", Affinity.BAD, 0x19E48E, false, DispersableDisguiseSpell::new); + public static final SpellType RAINBOOM = register("rainboom", Affinity.GOOD, 0xBDBDF9, false, RainboomAbilitySpell::new); public static final SpellType FROST = register("frost", Affinity.GOOD, 0xBDBDF9, true, IceSpell.DEFAULT_TRAITS, IceSpell::new); public static final SpellType SCORCH = register("scorch", Affinity.BAD, 0, true, ScorchSpell.DEFAULT_TRAITS, ScorchSpell::new); @@ -55,7 +55,7 @@ public final class SpellType implements Affine, SpellPredicate< public static final SpellType DARK_VORTEX = register("dark_vortex", Affinity.BAD, 0, true, DarkVortexSpell.DEFAULT_TRAITS, DarkVortexSpell::new); public static final SpellType NECROMANCY = register("necromancy", Affinity.BAD, 0x8A3A3A, true, NecromancySpell::new); public static final SpellType SIPHONING = register("siphoning", Affinity.NEUTRAL, 0xe308ab, true, SiphoningSpell::new); - public static final SpellType REVEALING = register("reveal", Affinity.GOOD, 0x5CE81F, true, RevealingSpell::new); + public static final SpellType REVEALING = register("reveal", Affinity.GOOD, 0x5CE81F, true, DisperseIllusionSpell::new); public static final SpellType AWKWARD = register("awkward", Affinity.GOOD, 0xE1239C, true, AwkwardSpell::new); public static final SpellType TRANSFORMATION = register("transformation", Affinity.GOOD, 0x3A59AA, true, TransformationSpell::new); public static final SpellType FEATHER_FALL = register("feather_fall", Affinity.GOOD, 0x00EEFF, true, FeatherFallSpell.DEFAULT_TRAITS, FeatherFallSpell::new);