diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/Caster.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/Caster.java index 7d92f682..23f91c12 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/Caster.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/Caster.java @@ -10,7 +10,6 @@ import com.minelittlepony.unicopia.EquinePredicates; import com.minelittlepony.unicopia.Owned; import com.minelittlepony.unicopia.entity.Physics; import com.minelittlepony.unicopia.entity.PonyContainer; -import com.minelittlepony.unicopia.network.EffectSync; import com.minelittlepony.unicopia.particle.ParticleSource; import com.minelittlepony.unicopia.util.VecHelper; @@ -28,7 +27,7 @@ public interface Caster extends Owned, Levelled, Affi Physics getPhysics(); - EffectSync getSpellSlot(); + SpellContainer getSpellSlot(); default void setSpell(@Nullable Spell spell) { getSpellSlot().put(spell); diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/SpellContainer.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/SpellContainer.java new file mode 100644 index 00000000..942e68b1 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/SpellContainer.java @@ -0,0 +1,44 @@ +package com.minelittlepony.unicopia.ability.magic; + +import java.util.Optional; + +import javax.annotation.Nullable; + +import com.minelittlepony.unicopia.ability.magic.spell.SpellPredicate; + +public interface SpellContainer { + SpellContainer EMPTY = new SpellContainer() { + @Override + public Optional get(SpellPredicate type, boolean update) { + return Optional.empty(); + } + + @Override + public void put(Spell effect) { + } + }; + + /** + * Gets the active effect for this caster updating it if needed. + */ + default Optional get(boolean update) { + return get(null, update); + } + + /** + * Returns true if this caster has an active effect attached to it. + */ + default boolean isPresent() { + return get(true).isPresent(); + } + + /** + * Gets the active effect for this caster updating it if needed. + */ + Optional get(@Nullable SpellPredicate type, boolean update); + + /** + * Sets the active effect. + */ + void put(@Nullable Spell effect); +} diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/Thrown.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/Thrown.java index 2a7d47dd..b7c9f5ae 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/Thrown.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/Thrown.java @@ -28,7 +28,7 @@ public interface Thrown extends Spell, ProjectileDelegate { * * @param source The entity we are currently attached to. */ - boolean onThrownTick(Caster source); + boolean onThrownTick(MagicProjectileEntity projectile); @Override default void onImpact(MagicProjectileEntity projectile, BlockPos pos, BlockState state) { diff --git a/src/main/java/com/minelittlepony/unicopia/entity/Living.java b/src/main/java/com/minelittlepony/unicopia/entity/Living.java index a233e7ea..54bb9fd0 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/Living.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/Living.java @@ -6,6 +6,7 @@ import java.util.stream.Stream; import javax.annotation.Nullable; import com.minelittlepony.unicopia.ability.magic.Caster; +import com.minelittlepony.unicopia.ability.magic.SpellContainer; import com.minelittlepony.unicopia.ability.magic.spell.SpellPredicate; import com.minelittlepony.unicopia.ability.magic.spell.SpellType; import com.minelittlepony.unicopia.item.UItems; @@ -59,7 +60,7 @@ public abstract class Living implements Equine, Caste } @Override - public EffectSync getSpellSlot() { + public SpellContainer getSpellSlot() { return effectDelegate; } diff --git a/src/main/java/com/minelittlepony/unicopia/network/EffectSync.java b/src/main/java/com/minelittlepony/unicopia/network/EffectSync.java index ac2bc0f4..5c21cf7c 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/EffectSync.java +++ b/src/main/java/com/minelittlepony/unicopia/network/EffectSync.java @@ -6,6 +6,7 @@ import javax.annotation.Nullable; import com.minelittlepony.unicopia.ability.magic.Caster; import com.minelittlepony.unicopia.ability.magic.Spell; +import com.minelittlepony.unicopia.ability.magic.SpellContainer; import com.minelittlepony.unicopia.ability.magic.spell.SpellPredicate; import com.minelittlepony.unicopia.ability.magic.spell.SpellType; @@ -20,7 +21,7 @@ import net.minecraft.util.Identifier; * * @param The owning entity */ -public class EffectSync { +public class EffectSync implements SpellContainer { private Optional spell = Optional.empty(); @@ -36,16 +37,7 @@ public class EffectSync { this.param = param; } - /** - * Gets the active effect for this caster updating it if needed. - */ - public Optional get(boolean update) { - return get(null, update); - } - - /** - * Gets the active effect for this caster updating it if needed. - */ + @Override @SuppressWarnings("unchecked") public Optional get(@Nullable SpellPredicate type, boolean update) { if (update) { @@ -59,9 +51,7 @@ public class EffectSync { return Optional.empty(); } - /** - * Returns true if this caster has an active effect attached to it. - */ + @Override public boolean isPresent() { sync(false); return checkReference(); @@ -90,6 +80,7 @@ public class EffectSync { } } + @Override public void put(@Nullable Spell effect) { updateReference(effect); owner.getEntity().getDataTracker().set(param, effect == null ? new CompoundTag() : SpellType.toNBT(effect)); diff --git a/src/main/java/com/minelittlepony/unicopia/projectile/MagicProjectileEntity.java b/src/main/java/com/minelittlepony/unicopia/projectile/MagicProjectileEntity.java index 6815b9f5..e950cdf5 100644 --- a/src/main/java/com/minelittlepony/unicopia/projectile/MagicProjectileEntity.java +++ b/src/main/java/com/minelittlepony/unicopia/projectile/MagicProjectileEntity.java @@ -7,6 +7,7 @@ import com.minelittlepony.unicopia.ability.magic.Caster; import com.minelittlepony.unicopia.ability.magic.Levelled; import com.minelittlepony.unicopia.ability.magic.Magical; import com.minelittlepony.unicopia.ability.magic.Spell; +import com.minelittlepony.unicopia.ability.magic.SpellContainer; import com.minelittlepony.unicopia.ability.magic.spell.SpellPredicate; import com.minelittlepony.unicopia.ability.magic.spell.SpellType; import com.minelittlepony.unicopia.entity.EntityPhysics; @@ -116,7 +117,7 @@ public class MagicProjectileEntity extends ThrownItemEntity implements Magical, } @Override - public EffectSync getSpellSlot() { + public SpellContainer getSpellSlot() { return effectDelegate; }