use of com.gmail.goosius.siegewar.objects.BannerControlSession in project SiegeWar by TownyAdvanced.
the class SiegeWarBannerControlUtil method evaluateExistingBannerControlSessions.
private static void evaluateExistingBannerControlSessions(Siege siege) {
String inProgressMessage;
String remainingSessionTime;
ChatColor bossBarMessageColor = ChatColor.valueOf(SiegeWarSettings.getBannerControlCaptureMessageColor().toUpperCase());
if (!BattleSession.getBattleSession().isActive())
return;
for (BannerControlSession bannerControlSession : siege.getBannerControlSessions().values()) {
try {
// Check if session failed
if (!doesPlayerMeetBasicSessionRequirements(siege, bannerControlSession.getPlayer(), bannerControlSession.getResident())) {
siege.removeBannerControlSession(bannerControlSession);
Translatable errorMessage = SiegeWarSettings.isTrapWarfareMitigationEnabled() ? Translatable.of("msg_siege_war_banner_control_session_failure_with_altitude") : Translatable.of("msg_siege_war_banner_control_session_failure");
BossBarUtil.removeBannerCapBossBar(bannerControlSession.getPlayer());
Messaging.sendMsg(bannerControlSession.getPlayer(), errorMessage);
// Update beacon
CosmeticUtil.evaluateBeacon(bannerControlSession.getPlayer(), siege);
// Remove glowing effect
if (bannerControlSession.getPlayer().hasPotionEffect(PotionEffectType.GLOWING)) {
Bukkit.getScheduler().scheduleSyncDelayedTask(SiegeWar.getSiegeWar(), new Runnable() {
@Override
public void run() {
bannerControlSession.getPlayer().removePotionEffect(PotionEffectType.GLOWING);
}
});
}
continue;
}
// Check if session is in progress or succeeded. Countdown accurate to 1 second, not less
if ((System.currentTimeMillis() / 1000) < (bannerControlSession.getSessionEndTime() / 1000)) {
// Session still in progress
remainingSessionTime = TimeMgmt.getFormattedTimeValue(bannerControlSession.getSessionEndTime() - System.currentTimeMillis());
inProgressMessage = bossBarMessageColor + Translatable.of("msg_siege_war_banner_control_remaining_session_time", remainingSessionTime).forLocale(bannerControlSession.getPlayer());
BossBarUtil.updateBannerCapBossBar(bannerControlSession.getPlayer(), inProgressMessage, bannerControlSession);
} else {
// Session success
siege.removeBannerControlSession(bannerControlSession);
// Update beacon
CosmeticUtil.evaluateBeacon(bannerControlSession.getPlayer(), siege);
// Remove bossbar
BossBarUtil.removeBannerCapBossBar(bannerControlSession.getPlayer());
// Remove glowing effect
if (bannerControlSession.getPlayer().hasPotionEffect(PotionEffectType.GLOWING)) {
Bukkit.getScheduler().scheduleSyncDelayedTask(SiegeWar.getSiegeWar(), new Runnable() {
@Override
public void run() {
bannerControlSession.getPlayer().removePotionEffect(PotionEffectType.GLOWING);
}
});
}
// Update siege
if (bannerControlSession.getSiegeSide() == siege.getBannerControllingSide()) {
// Player contributes to ongoing banner control
siege.addBannerControllingResident(bannerControlSession.getResident());
Messaging.sendMsg(bannerControlSession.getPlayer(), Translatable.of("msg_siege_war_banner_control_session_success"));
} else {
// Player gains banner control for their side
boolean reversal = false;
if (siege.getBannerControllingSide() != SiegeSide.NOBODY && bannerControlSession.getSiegeSide() != siege.getBannerControllingSide()) {
reversal = true;
// Apply reversal bonus if required setting is enabled
if (SiegeWarSettings.isWarSiegeBannerControlReversalBonusEnabled()) {
siege.setNumberOfBannerControlReversals(siege.getNumberOfBannerControlReversals() + 1);
}
}
siege.clearBannerControllingResidents();
siege.setBannerControllingSide(bannerControlSession.getSiegeSide());
siege.addBannerControllingResident(bannerControlSession.getResident());
// Inform player
Messaging.sendMsg(bannerControlSession.getPlayer(), Translatable.of("msg_siege_war_banner_control_session_success"));
// Inform town/nation participants
Translatable[] message = new Translatable[2];
if (reversal) {
if (bannerControlSession.getSiegeSide() == SiegeSide.ATTACKERS) {
message[0] = Translatable.of("msg_siege_war_banner_control_reversed_by_attacker", siege.getTown().getFormattedName());
} else {
message[0] = Translatable.of("msg_siege_war_banner_control_reversed_by_defender", siege.getTown().getFormattedName());
}
if (SiegeWarSettings.isWarSiegeBannerControlReversalBonusEnabled()) {
double battlePointMultiplierDouble = siege.getNumberOfBannerControlReversals() * SiegeWarSettings.getWarSiegeBannerControlReversalBonusFactor();
DecimalFormat decimalFormat = new DecimalFormat("#.##");
message[1] = Translatable.of("msg_siege_war_banner_control_reversal_bonus", decimalFormat.format(battlePointMultiplierDouble));
}
} else {
if (bannerControlSession.getSiegeSide() == SiegeSide.ATTACKERS) {
message[0] = Translatable.of("msg_siege_war_banner_control_gained_by_attacker", siege.getTown().getFormattedName());
} else {
message[0] = Translatable.of("msg_siege_war_banner_control_gained_by_defender", siege.getTown().getFormattedName());
}
}
SiegeWarNotificationUtil.informSiegeParticipants(siege, message);
}
}
} catch (Exception e) {
SiegeWar.severe("Problem evaluating banner control session for player " + bannerControlSession.getPlayer().getName());
}
}
}
use of com.gmail.goosius.siegewar.objects.BannerControlSession in project SiegeWar by TownyAdvanced.
the class SiegeWarBannerControlUtil method addNewBannerControlSession.
private static void addNewBannerControlSession(Siege siege, final Player player, Resident resident, SiegeSide siegeSide) {
// Add session
int sessionDurationMillis = (int) (SiegeWarSettings.getWarSiegeBannerControlSessionDurationMinutes() * TimeMgmt.ONE_MINUTE_IN_MILLIS);
long sessionEndTime = System.currentTimeMillis() + sessionDurationMillis;
BannerControlSession bannerControlSession = new BannerControlSession(resident, player, siegeSide, sessionEndTime);
siege.addBannerControlSession(player, bannerControlSession);
// Notify Player in console
String messageKey = SiegeWarSettings.isTrapWarfareMitigationEnabled() ? "msg_siege_war_banner_control_session_started_with_altitude" : "msg_siege_war_banner_control_session_started";
String sessionDurationText = TimeMgmt.getFormattedTimeValue(sessionDurationMillis);
Messaging.sendMsg(player, Translatable.of(messageKey, TownySettings.getTownBlockSize(), SiegeWarSettings.getBannerControlVerticalDistanceUpBlocks(), SiegeWarSettings.getBannerControlVerticalDistanceDownBlocks(), sessionDurationText));
// Notify player in action bar
ChatColor bossBarMessageColor = ChatColor.valueOf(SiegeWarSettings.getBannerControlCaptureMessageColor().toUpperCase());
String actionBarMessage = bossBarMessageColor + Translatable.of("msg_siege_war_banner_control_remaining_session_time", sessionDurationText).forLocale(bannerControlSession.getPlayer());
BossBarUtil.updateBannerCapBossBar(bannerControlSession.getPlayer(), actionBarMessage, bannerControlSession);
CosmeticUtil.evaluateBeacon(player, siege);
// If this is a switching session, notify participating nations/towns
if (siegeSide != siege.getBannerControllingSide()) {
boolean firstControlSwitchingSession = true;
for (BannerControlSession otherSession : siege.getBannerControlSessions().values()) {
if (otherSession != bannerControlSession && otherSession.getSiegeSide() != siege.getBannerControllingSide()) {
firstControlSwitchingSession = false;
break;
}
}
if (firstControlSwitchingSession) {
Translatable message = siegeSide == SiegeSide.ATTACKERS ? Translatable.of("msg_siege_war_attacking_troops_at_siege_banner", siege.getTown().getFormattedName()) : Translatable.of("msg_siege_war_defending_troops_at_siege_banner", siege.getTown().getFormattedName());
SiegeWarNotificationUtil.informSiegeParticipants(siege, message);
}
}
}
use of com.gmail.goosius.siegewar.objects.BannerControlSession in project SiegeWar by TownyAdvanced.
the class SiegeWarBannerControlUtil method grantGlowingToSessionWithLowestTimer.
/**
* Given a list of sessions, grant glowing to the session with the lowest timer.
* Ensure all others do NOT glow.
*
* @param sessions given list of sessions.
*/
private static void grantGlowingToSessionWithLowestTimer(Set<BannerControlSession> sessions) {
// Calculate glow duration
int effectDurationSeconds = SiegeWarSettings.getWarSiegeBannerControlSessionDurationMinutes() * 60;
final int effectDurationTicks = (int) (TimeTools.convertToTicks(effectDurationSeconds));
if (sessions.size() > 0) {
// Find player with lowest timer
BannerControlSession glowingSession = null;
for (BannerControlSession bannerControlSession : sessions) {
if (glowingSession == null || bannerControlSession.getSessionEndTime() < glowingSession.getSessionEndTime()) {
glowingSession = bannerControlSession;
}
}
// Ensure the player glows
BannerControlSession glowingSessionFinal = glowingSession;
Bukkit.getScheduler().scheduleSyncDelayedTask(SiegeWar.getSiegeWar(), new Runnable() {
public void run() {
List<PotionEffect> potionEffects = new ArrayList<>();
potionEffects.add(new PotionEffect(PotionEffectType.GLOWING, effectDurationTicks, 0));
glowingSessionFinal.getPlayer().addPotionEffects(potionEffects);
}
});
// Ensure nobody else glows
for (BannerControlSession bannerControlSession : sessions) {
if (bannerControlSession == glowingSession)
continue;
if (bannerControlSession.getPlayer().hasPotionEffect(PotionEffectType.GLOWING)) {
Bukkit.getScheduler().scheduleSyncDelayedTask(SiegeWar.getSiegeWar(), new Runnable() {
public void run() {
bannerControlSession.getPlayer().removePotionEffect(PotionEffectType.GLOWING);
}
});
}
}
}
}
use of com.gmail.goosius.siegewar.objects.BannerControlSession in project SiegeWar by TownyAdvanced.
the class SiegeWarBannerControlUtil method evaluatePlayerGlowing.
/**
* This method evaluates whether players should be made to glow
*
* Glowing Rules:
* - The capper with the lowest time-to-cap on each side, glows.
*
* @param siege the siege
*/
private static void evaluatePlayerGlowing(Siege siege) throws Exception {
// Create attacker and defender capper maps
Set<BannerControlSession> attackerSessions = new HashSet<>();
Set<BannerControlSession> defenderSessions = new HashSet<>();
for (BannerControlSession bannerControlSession : siege.getBannerControlSessions().values()) {
if (bannerControlSession.getSiegeSide() == SiegeSide.ATTACKERS) {
attackerSessions.add(bannerControlSession);
} else {
defenderSessions.add(bannerControlSession);
}
}
// Ensure glowing
grantGlowingToSessionWithLowestTimer(attackerSessions);
grantGlowingToSessionWithLowestTimer(defenderSessions);
}
Aggregations