Search in sources :

Example 1 with BannerControlSession

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());
        }
    }
}
Also used : BannerControlSession(com.gmail.goosius.siegewar.objects.BannerControlSession) DecimalFormat(java.text.DecimalFormat) Translatable(com.palmergames.bukkit.towny.object.Translatable) ChatColor(org.bukkit.ChatColor) TownyException(com.palmergames.bukkit.towny.exceptions.TownyException)

Example 2 with BannerControlSession

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);
        }
    }
}
Also used : BannerControlSession(com.gmail.goosius.siegewar.objects.BannerControlSession) Translatable(com.palmergames.bukkit.towny.object.Translatable) ChatColor(org.bukkit.ChatColor)

Example 3 with BannerControlSession

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);
                    }
                });
            }
        }
    }
}
Also used : BannerControlSession(com.gmail.goosius.siegewar.objects.BannerControlSession) PotionEffect(org.bukkit.potion.PotionEffect) ArrayList(java.util.ArrayList) List(java.util.List)

Example 4 with BannerControlSession

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);
}
Also used : BannerControlSession(com.gmail.goosius.siegewar.objects.BannerControlSession) HashSet(java.util.HashSet)

Aggregations

BannerControlSession (com.gmail.goosius.siegewar.objects.BannerControlSession)4 Translatable (com.palmergames.bukkit.towny.object.Translatable)2 ChatColor (org.bukkit.ChatColor)2 TownyException (com.palmergames.bukkit.towny.exceptions.TownyException)1 DecimalFormat (java.text.DecimalFormat)1 ArrayList (java.util.ArrayList)1 HashSet (java.util.HashSet)1 List (java.util.List)1 PotionEffect (org.bukkit.potion.PotionEffect)1