Skip to content

Commit

Permalink
Fixed ability spells not cancelling when the player loses access to t…
Browse files Browse the repository at this point in the history
…he granting ability. Fixes #272
  • Loading branch information
Sollace committed Feb 21, 2024
1 parent 53497c7 commit 00a20fb
Show file tree
Hide file tree
Showing 6 changed files with 21 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import org.jetbrains.annotations.Nullable;

import com.minelittlepony.unicopia.*;
import com.minelittlepony.unicopia.ability.Ability;
import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType;
import com.minelittlepony.unicopia.entity.*;
import com.minelittlepony.unicopia.entity.damage.UDamageSources;
Expand Down Expand Up @@ -103,6 +104,10 @@ default boolean canCastAt(Vec3d pos) {
return !Ether.get(asWorld()).anyMatch(SpellType.ARCANE_PROTECTION, (spell, caster) -> spell.blocksMagicFor(caster, this, pos));
}

default boolean canUse(Ability<?> ability) {
return false;
}

static Stream<Caster<?>> stream(Stream<Entity> entities) {
return entities.map(Caster::of).flatMap(Optional::stream);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import java.util.Optional;

import com.minelittlepony.unicopia.ability.Abilities;
import com.minelittlepony.unicopia.ability.magic.Caster;
import com.minelittlepony.unicopia.ability.magic.IllusionarySpell;
import com.minelittlepony.unicopia.ability.magic.spell.effect.CustomisedSpellType;
Expand Down Expand Up @@ -55,6 +56,10 @@ public boolean update(Caster<?> source, boolean tick) {
}
}

if (!source.canUse(Abilities.DISGUISE)) {
setDead();
}

Entity owner = source.asEntity();
Entity appearance = getDisguise().getAppearance();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.minelittlepony.unicopia.InteractionManager;
import com.minelittlepony.unicopia.USounds;
import com.minelittlepony.unicopia.ability.Abilities;
import com.minelittlepony.unicopia.ability.magic.Caster;
import com.minelittlepony.unicopia.ability.magic.spell.effect.*;
import com.minelittlepony.unicopia.client.render.PlayerPoser.Animation;
Expand Down Expand Up @@ -45,7 +46,7 @@ public void setExtenguishing() {
@Override
public boolean tick(Caster<?> source, Situation situation) {

if (situation != Situation.BODY || source.asEntity().isRemoved()) {
if (situation != Situation.BODY || source.asEntity().isRemoved() || !source.canUse(Abilities.RAGE)) {
return false;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

import com.minelittlepony.unicopia.InteractionManager;
import com.minelittlepony.unicopia.UTags;
import com.minelittlepony.unicopia.ability.Abilities;
import com.minelittlepony.unicopia.ability.magic.Caster;
import com.minelittlepony.unicopia.ability.magic.spell.effect.*;
import com.minelittlepony.unicopia.entity.damage.UDamageTypes;
Expand Down Expand Up @@ -43,7 +44,7 @@ public RainboomAbilitySpell(CustomisedSpellType<?> type) {
@Override
public boolean tick(Caster<?> source, Situation situation) {

if (situation != Situation.BODY) {
if (situation != Situation.BODY || !source.canUse(Abilities.RAINBOOM)) {
return false;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import com.minelittlepony.unicopia.ability.data.Rot;
import com.minelittlepony.unicopia.ability.magic.Caster;
import com.minelittlepony.unicopia.ability.magic.spell.effect.*;
import com.minelittlepony.unicopia.entity.player.Pony;
import com.minelittlepony.unicopia.server.world.UGameRules;
import com.minelittlepony.unicopia.server.world.UnicopiaWorldProperties;

Expand All @@ -31,11 +30,7 @@ public TimeControlAbilitySpell(CustomisedSpellType<?> type) {
@Override
public boolean tick(Caster<?> source, Situation situation) {

if (!source.asWorld().getGameRules().getBoolean(UGameRules.DO_TIME_MAGIC)) {
return false;
}

if (situation != Situation.BODY || !(source instanceof Pony pony) || !Abilities.TIME.canUse(pony.getCompositeRace())) {
if (!source.asWorld().getGameRules().getBoolean(UGameRules.DO_TIME_MAGIC) || situation != Situation.BODY || !source.canUse(Abilities.TIME)) {
return false;
}

Expand Down
6 changes: 6 additions & 0 deletions src/main/java/com/minelittlepony/unicopia/entity/Living.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import com.minelittlepony.unicopia.UTags;
import com.minelittlepony.unicopia.Unicopia;
import com.minelittlepony.unicopia.ability.Abilities;
import com.minelittlepony.unicopia.ability.Ability;
import com.minelittlepony.unicopia.ability.magic.Caster;
import com.minelittlepony.unicopia.ability.magic.SpellContainer;
import com.minelittlepony.unicopia.ability.magic.SpellPredicate;
Expand Down Expand Up @@ -614,6 +615,11 @@ public void updateVelocity() {
updateVelocity(entity);
}

@Override
public boolean canUse(Ability<?> ability) {
return ability.canUse(getCompositeRace());
}

public static Optional<Living<?>> getOrEmpty(Entity entity) {
return Equine.of(entity, a -> a instanceof Living);
}
Expand Down

0 comments on commit 00a20fb

Please sign in to comment.