89 lines
3.1 KiB
Java
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()
|
|
);
|
|
}
|
|
}
|