Files
purpur-tyrant/src/main/java/games/dmg/spigottyrant/AssassinAbilityService.java
T
dmg 1642d46f1b
Release / release (push) Successful in 2m17s
CI / build (push) Successful in 1m1s
feat(assassin): add stealth and double jump
2026-08-14 23:08:18 -04:00

89 lines
3.1 KiB
Java

package games.dmg.spigottyrant;
import java.time.Instant;
import java.util.EnumMap;
import java.util.Map;
public final class AssassinAbilityService {
private final AbilityReadinessService readiness;
private final PluginSettings settings;
public AssassinAbilityService(
AbilityReadinessService readiness,
PluginSettings settings
) {
this.readiness = readiness;
this.settings = settings;
}
public AbilityUseResult activateInvisibility(
PlayerState player,
Instant now,
boolean nearTyrant
) {
if (player.tyrantClass() != TyrantClass.ASSASSIN) {
return new AbilityUseResult(player, AbilityUseStatus.WRONG_CLASS);
}
if (!player.readyAbilityItems().contains(Ability.ASSASSIN_INVISIBILITY)) {
return new AbilityUseResult(player, AbilityUseStatus.NOT_READY);
}
PlayerState used = readiness.consume(
player, Ability.ASSASSIN_INVISIBILITY, now, settings.assassinCooldown()
);
Instant activeUntil = now.plus(
nearTyrant
? settings.assassinInvisibilityDuration().multipliedBy(2)
: settings.assassinInvisibilityDuration()
);
return new AbilityUseResult(
withDeadline(used, Ability.ASSASSIN_INVISIBILITY_ACTIVE, activeUntil),
AbilityUseStatus.ACTIVATED
);
}
public AbilityUseResult doubleJump(PlayerState player, Instant now) {
if (player.tyrantClass() != TyrantClass.ASSASSIN) {
return new AbilityUseResult(player, AbilityUseStatus.WRONG_CLASS);
}
if (player.cooldownEnds().getOrDefault(
Ability.ASSASSIN_DOUBLE_JUMP, Instant.MIN
).isAfter(now)) {
return new AbilityUseResult(player, AbilityUseStatus.COOLDOWN);
}
Map<Ability, Instant> deadlines = new EnumMap<>(Ability.class);
deadlines.putAll(player.cooldownEnds());
deadlines.put(
Ability.ASSASSIN_DOUBLE_JUMP,
now.plus(settings.assassinDoubleJumpCooldown())
);
deadlines.put(
Ability.ASSASSIN_SPEED_ACTIVE,
now.plus(settings.assassinSpeedDuration())
);
deadlines.put(
Ability.ASSASSIN_WEAKNESS_ACTIVE,
now.plus(settings.assassinWeaknessDuration())
);
return new AbilityUseResult(copy(player, deadlines), AbilityUseStatus.ACTIVATED);
}
private static PlayerState withDeadline(
PlayerState player,
Ability ability,
Instant deadline
) {
Map<Ability, Instant> deadlines = new EnumMap<>(Ability.class);
deadlines.putAll(player.cooldownEnds());
deadlines.put(ability, deadline);
return copy(player, deadlines);
}
private static PlayerState copy(PlayerState player, Map<Ability, Instant> deadlines) {
return new PlayerState(
player.playerId(), player.latestName(), player.lastLogin(), player.optedOutUntil(),
player.tyrantClass(), player.followerOf(), deadlines,
player.readyAbilityItems(), player.capturedMobs()
);
}
}