Search in sources :

Example 11 with Siege

use of com.gmail.goosius.siegewar.objects.Siege in project SiegeWar by TownyAdvanced.

the class SiegeWarNationEventListener method onPreNationEnemyRemove.

@EventHandler
public void onPreNationEnemyRemove(NationPreRemoveEnemyEvent event) {
    boolean cancel = false;
    Nation nation = event.getNation();
    Nation enemyNation = event.getEnemy();
    for (Siege siege : SiegeController.getSieges()) {
        if (!siege.getStatus().isActive())
            continue;
        // Cancel if you are attacking them
        if (siege.getAttacker() == nation && siege.getDefendingNationIfPossibleElseTown() == enemyNation) {
            cancel = true;
            break;
        }
        // Cancel if they are attacking you
        if (siege.getAttacker() == enemyNation && siege.getDefendingNationIfPossibleElseTown() == nation) {
            cancel = true;
            break;
        }
        if (siege.getSiegeType() == SiegeType.REVOLT) {
            // Cancel if one of your towns is revolting against them
            if (siege.getTown().hasNation() && TownyAPI.getInstance().getTownNationOrNull(siege.getTown()) == nation && siege.getDefender() == enemyNation) {
                cancel = true;
                break;
            }
            // Cancel if one of their towns is revolting against you
            if (siege.getTown().hasNation() && TownyAPI.getInstance().getTownNationOrNull(siege.getTown()) == enemyNation && siege.getDefender() == nation) {
                cancel = true;
                break;
            }
        }
    }
    if (cancel) {
        event.setCancelled(true);
        event.setCancelMessage(Translation.of("plugin_prefix") + Translation.of("msg_err_cannot_remove_enemy"));
    }
}
Also used : Nation(com.palmergames.bukkit.towny.object.Nation) Siege(com.gmail.goosius.siegewar.objects.Siege) EventHandler(org.bukkit.event.EventHandler)

Example 12 with Siege

use of com.gmail.goosius.siegewar.objects.Siege in project SiegeWar by TownyAdvanced.

the class SiegeWarStatusScreenListener method onTownStatusScreen.

/*
	 * SiegeWar will add lines to towns which have a siege
	 */
@EventHandler
public void onTownStatusScreen(TownStatusScreenEvent event) {
    if (SiegeWarSettings.getWarSiegeEnabled()) {
        final Translator translator = Translator.locale(Translation.getLocale(event.getCommandSender()));
        Town town = event.getTown();
        // Occupying Nation: Empire of the Fluffy Bunnies
        if (SiegeWarSettings.getWarSiegeInvadeEnabled() && TownOccupationController.isTownOccupied(town)) {
            Nation townOccupier = TownOccupationController.getTownOccupier(town);
            event.getStatusScreen().addComponentOf("siegeWar_townOccupier", translator.of("status_town_occupying_nation", townOccupier.getFormattedName()));
        }
        // Revolt Immunity Timer: 71.8 hours
        long immunity = TownMetaDataController.getRevoltImmunityEndTime(town);
        if (SiegeWarSettings.getRevoltSiegesEnabled() && immunity == -1l || System.currentTimeMillis() < immunity) {
            String time = immunity == -1l ? translator.of("msg_permanent") : TimeMgmt.getFormattedTimeValue(immunity - System.currentTimeMillis());
            event.getStatusScreen().addComponentOf("siegeWar_revoltImmunityTimer", translator.of("status_town_revolt_immunity_timer", time));
        }
        immunity = TownMetaDataController.getSiegeImmunityEndTime(town);
        if (SiegeController.hasSiege(town)) {
            List<String> out = new ArrayList<>();
            Siege siege = SiegeController.getSiege(town);
            SiegeStatus siegeStatus = siege.getStatus();
            String time = immunity == -1l ? translator.of("msg_permanent") : TimeMgmt.getFormattedTimeValue(immunity - System.currentTimeMillis());
            // > Type: Conquest
            out.add(translator.of("status_town_siege_type", siege.getSiegeType().getTranslatedName()));
            // > Status: In Progress
            out.add(translator.of("status_town_siege_status", getStatusTownSiegeSummary(siege, translator)));
            // > Attacker: Darkness
            out.add(translator.of("status_town_siege_attacker", siege.getAttackerNameForDisplay()));
            // > Defender: Light
            out.add(translator.of("status_town_siege_defender", siege.getDefenderNameForDisplay()));
            switch(siegeStatus) {
                case IN_PROGRESS:
                    // > Balance: 530
                    String balanceLine = translator.of("status_town_siege_status_siege_balance", siege.getSiegeBalance());
                    // > Balance: 530 | Pending: +130
                    int pending = SiegeWarBattleSessionUtil.calculateSiegeBalanceAdjustment(siege);
                    if (pending != 0)
                        balanceLine += translator.of("status_town_siege_pending_balance_adjustment", ((pending > 0 ? "+" : "") + pending));
                    out.add(balanceLine);
                    if (SiegeWarSettings.isBannerXYZTextEnabled()) {
                        // > Banner XYZ: {2223,82,9877}
                        out.add(translator.of("status_town_siege_status_banner_xyz", siege.getFlagLocation().getBlockX(), siege.getFlagLocation().getBlockY(), siege.getFlagLocation().getBlockZ()));
                    }
                    // >  Victory Timer: 5.3 hours
                    String victoryTimer = translator.of("status_town_siege_victory_timer", siege.getFormattedHoursUntilScheduledCompletion());
                    out.add(victoryTimer);
                    // >  War Chest: $12,800
                    if (TownyEconomyHandler.isActive()) {
                        String warChest = TownyEconomyHandler.getFormattedBalance(siege.getWarChestAmount());
                        out.add(translator.of("status_town_siege_status_warchest", warChest));
                    }
                    // Battle:
                    String battle = translator.of("status_town_siege_battle");
                    out.add(battle);
                    // > Banner Control: Attackers [4] Killbot401x, NerfeyMcNerferson, WarCriminal80372
                    if (siege.getBannerControllingSide() == SiegeSide.NOBODY) {
                        out.add(translator.of("status_town_banner_control_nobody", siege.getBannerControllingSide().getFormattedName().forLocale(event.getCommandSender())));
                    } else {
                        String[] bannerControllingResidents = TownyFormatter.getFormattedNames(siege.getBannerControllingResidents().toArray(new Resident[0]));
                        if (bannerControllingResidents.length > 34) {
                            String[] entire = bannerControllingResidents;
                            bannerControllingResidents = new String[36];
                            System.arraycopy(entire, 0, bannerControllingResidents, 0, 35);
                            bannerControllingResidents[35] = translator.of("status_town_reslist_overlength");
                        }
                        out.addAll(ChatTools.listArr(bannerControllingResidents, translator.of("status_town_banner_control", siege.getBannerControllingSide().getFormattedName().forLocale(event.getCommandSender()), siege.getBannerControllingResidents().size())));
                    }
                    // > Points: +90 / -220
                    out.add(translator.of("status_town_siege_battle_points", siege.getFormattedAttackerBattlePoints(), siege.getFormattedDefenderBattlePoints()));
                    // > Time Remaining: 22 minutes
                    out.add(translator.of("status_town_siege_battle_time_remaining", siege.getFormattedBattleTimeRemaining(translator)));
                    // > Breach Points: 15
                    if (SiegeWarSettings.isWallBreachingEnabled() && SiegeWarSettings.getWallBreachBonusBattlePoints() != 0)
                        out.add(translator.of("status_town_siege_breach_points", siege.getFormattedBreachPoints()));
                    break;
                case ATTACKER_WIN:
                case DEFENDER_SURRENDER:
                case DEFENDER_WIN:
                case ATTACKER_ABANDON:
                    String invadedPlunderedStatus = getInvadedPlunderedStatusLine(siege, translator);
                    if (!invadedPlunderedStatus.isEmpty())
                        out.add(invadedPlunderedStatus);
                    String siegeImmunityTimer = translator.of("status_town_siege_immunity_timer", time);
                    out.add(siegeImmunityTimer);
                    break;
                case PENDING_DEFENDER_SURRENDER:
                case PENDING_ATTACKER_ABANDON:
                case UNKNOWN:
                    break;
            }
            TextComponent hoverText = Component.empty();
            for (String line : out) {
                hoverText = hoverText.append(Component.text(line).append(Component.newline()));
            }
            event.getStatusScreen().addComponentOf("siegeWar_siegeHover", hoverFormat(translator.of("status_sieged")), HoverEvent.showText(hoverText));
        } else {
            if (!SiegeController.hasActiveSiege(town) && (System.currentTimeMillis() < immunity) || immunity == -1l) {
                // Siege:
                // > Immunity Timer: 40.8 hours
                String time = immunity == -1l ? Translation.of("msg_permanent") : TimeMgmt.getFormattedTimeValue(immunity - System.currentTimeMillis());
                TextComponent immunityComp = Component.newline().append(Component.text(Translation.of("status_town_siege"))).append(Component.newline()).append(Component.text(Translation.of("status_town_siege_immunity_timer", time)));
                event.getStatusScreen().addComponentOf("siegeWar_siegeImmunity", immunityComp);
            }
        }
    }
}
Also used : Nation(com.palmergames.bukkit.towny.object.Nation) TextComponent(com.palmergames.adventure.text.TextComponent) ArrayList(java.util.ArrayList) Siege(com.gmail.goosius.siegewar.objects.Siege) Translator(com.palmergames.bukkit.towny.object.Translator) Town(com.palmergames.bukkit.towny.object.Town) SiegeStatus(com.gmail.goosius.siegewar.enums.SiegeStatus) Resident(com.palmergames.bukkit.towny.object.Resident) EventHandler(org.bukkit.event.EventHandler)

Example 13 with Siege

use of com.gmail.goosius.siegewar.objects.Siege in project SiegeWar by TownyAdvanced.

the class SiegeWarAdminCommand method parseSiegeWarSiegeCommand.

private void parseSiegeWarSiegeCommand(CommandSender sender, String[] args) {
    if (args.length >= 2) {
        Town town = TownyUniverse.getInstance().getTown(args[0]);
        if (town == null) {
            Messaging.sendErrorMsg(sender, Translatable.of("msg_err_town_not_registered", args[0]));
            return;
        }
        List<String> ignoreActiveSiegeArgs = Arrays.asList("setplundered", "setcaptured", "remove");
        if (!SiegeController.hasActiveSiege(town) && !ignoreActiveSiegeArgs.contains(args[1].toLowerCase())) {
            Messaging.sendErrorMsg(sender, Translatable.of("msg_err_not_being_sieged", town.getName()));
            return;
        }
        if (!SiegeController.hasSiege(town) && ignoreActiveSiegeArgs.contains(args[1].toLowerCase())) {
            Messaging.sendErrorMsg(sender, Translatable.of("msg_err_not_being_sieged", town.getName()));
            return;
        }
        Siege siege = SiegeController.getSiege(town);
        switch(args[1].toLowerCase()) {
            case "setbalance":
                if (args.length < 3) {
                    showSiegeHelp(sender);
                }
                try {
                    Integer.parseInt(args[2]);
                } catch (NumberFormatException e) {
                    Messaging.sendErrorMsg(sender, Translatable.of("msg_error_must_be_num"));
                    return;
                }
                int newPoints = Integer.parseInt(args[2]);
                siege.setSiegeBalance(newPoints);
                SiegeController.saveSiege(siege);
                Messaging.sendMsg(sender, Translatable.of("msg_swa_set_siege_balance_success", newPoints, town.getName()));
                return;
            case "end":
                if (siege.getSiegeBalance() < 1)
                    DefenderTimedWin.defenderTimedWin(siege);
                else
                    AttackerTimedWin.attackerTimedWin(siege);
                return;
            case "setplundered":
                boolean plundered = Boolean.parseBoolean(args[2]);
                siege.setTownPlundered(plundered);
                SiegeController.saveSiege(siege);
                Messaging.sendMsg(sender, Translatable.of("msg_swa_set_plunder_success", Boolean.toString(plundered).toUpperCase(), town.getName()));
                return;
            case "setinvaded":
                if (siege.getSiegeType() == SiegeType.REVOLT || siege.getSiegeType() == SiegeType.SUPPRESSION) {
                    Messaging.sendErrorMsg(sender, Translatable.of("msg_err_swa_cannot_set_invade_due_to_siege_type", args[0]));
                    return;
                }
                boolean invaded = Boolean.parseBoolean(args[2]);
                if (invaded) {
                    siege.setTownInvaded(true);
                    TownOccupationController.setTownOccupation(town, (Nation) siege.getAttacker());
                } else {
                    siege.setTownInvaded(false);
                    TownOccupationController.removeTownOccupation(town);
                }
                SiegeController.saveSiege(siege);
                Messaging.sendMsg(sender, Translatable.of("msg_swa_set_invade_success", Boolean.toString(invaded).toUpperCase(), town.getName()));
                return;
            case "remove":
                SiegeController.removeSiege(siege, SiegeSide.ATTACKERS);
                Messaging.sendMsg(sender, Translatable.of("msg_swa_remove_siege_success"));
                return;
        }
    } else
        showSiegeHelp(sender);
}
Also used : Town(com.palmergames.bukkit.towny.object.Town) Siege(com.gmail.goosius.siegewar.objects.Siege)

Example 14 with Siege

use of com.gmail.goosius.siegewar.objects.Siege in project SiegeWar by TownyAdvanced.

the class CannonsIntegration method filterExplodeListByCannonEffects.

/**
 * Filter a given explode list by cannon effects
 * @param givenExplodeList given list of exploding blocks
 * @param event the explosion event
 *
 * @return filtered list
 * @throws TownyException if something is misconfigured
 */
public static List<Block> filterExplodeListByCannonEffects(List<Block> givenExplodeList, TownyExplodingBlocksEvent event) throws TownyException {
    if (SiegeWar.isCannonsPluginInstalled() && SiegeWarSettings.isWallBreachingEnabled() && SiegeWarSettings.isWallBreachingCannonsIntegrationEnabled() && BattleSession.getBattleSession().isActive() && event.getEntity() != null && event.getEntity() instanceof Projectile && ((Projectile) event.getEntity()).getShooter() instanceof Player) {
        // Prepare filtered list
        List<Block> filteredExplodeList = new ArrayList<>(givenExplodeList);
        // Prepare some cache sets, to optimize processing
        Set<Town> cachedProtectedTowns = new HashSet<>();
        Set<Town> cachedUnprotectedTowns = new HashSet<>();
        Set<Material> cachedProtectedMaterials = new HashSet<>();
        Set<Material> cachedUnprotectedMaterials = new HashSet<>();
        // Find the blocks explosions which were removed by Towny, and see if they should be re-added.
        Player player = (Player) (((Projectile) event.getEntity()).getShooter());
        Town town;
        Siege siege;
        // The pre-towny-protection list
        List<Block> vanillaExplodeList = event.getVanillaBlockList();
        for (Block block : vanillaExplodeList) {
            if (givenExplodeList.contains(block))
                // Block is unprotected & will explode. No breach points needed
                continue;
            town = TownyAPI.getInstance().getTown(block.getLocation());
            if (town == null)
                continue;
            if (cachedProtectedTowns.contains(town))
                continue;
            siege = SiegeController.getSiege(town);
            if (siege == null || !siege.getStatus().isActive()) {
                // No siege or inactive siege. Town is safe
                cachedProtectedTowns.add(town);
                continue;
            }
            if (!canPlayerUseBreachPointsByCannon(player, siege))
                continue;
            // Player can breach at the siege. Town is unsafe
            cachedUnprotectedTowns.add(town);
            if (!SiegeWarWallBreachUtil.payBreachPoints(SiegeWarSettings.getWallBreachingCannonExplosionCostPerBlock(), siege))
                // Insufficient breach points to explode this block
                continue;
            // Ensure height is ok
            if (!SiegeWarWallBreachUtil.validateBreachHeight(block, town, siege))
                continue;
            // Ensure material is ok
            if (cachedProtectedMaterials.contains(block.getType())) {
                // In cache, protected
                continue;
            } else if (!cachedUnprotectedMaterials.contains(block.getType())) {
                // Not in cache
                if (SiegeWarWallBreachUtil.validateDestroyMaterial(block, block.getLocation())) {
                    cachedUnprotectedMaterials.add(block.getType());
                } else {
                    cachedProtectedMaterials.add(block.getType());
                    continue;
                }
            }
            /*
                 * Player has now paid the required breach points.
                 * Allow block to explode
                 */
            filteredExplodeList.add(block);
        }
        // Send message if a wall breach is about to occur
        if (filteredExplodeList.size() > givenExplodeList.size())
            player.spigot().sendMessage(ChatMessageType.ACTION_BAR, new TextComponent(ChatColor.RED + Translatable.of("msg_wall_breach_successful").forLocale(player)));
        // Return filtered list
        return filteredExplodeList;
    } else {
        // Return given list
        return givenExplodeList;
    }
}
Also used : TextComponent(net.md_5.bungee.api.chat.TextComponent) Player(org.bukkit.entity.Player) Town(com.palmergames.bukkit.towny.object.Town) ArrayList(java.util.ArrayList) Block(org.bukkit.block.Block) Material(org.bukkit.Material) Projectile(org.bukkit.entity.Projectile) HashSet(java.util.HashSet) Siege(com.gmail.goosius.siegewar.objects.Siege)

Example 15 with Siege

use of com.gmail.goosius.siegewar.objects.Siege in project SiegeWar by TownyAdvanced.

the class PlaceBlock method evaluatePlaceColouredBannerNearTown.

/**
 * Evaluates coloured banner near a town
 *
 * Effects depend on multiple factors, including:
 *  - Whether the town is peaceful or not
 *  - Whether there is already a siege at the town.
 *  - The allegiances of the town and of the banner placer
 *
 * @param player the player placing the banner
 * @param residentsTown the town of the player placing the banner
 * @param residentsNation the nation of the player placing the banner (can be null)
 * @param nearbyTownBlock the nearby town block
 * @param nearbyTown the nearby town
 * @param bannerBlock the banner block
 */
public static void evaluatePlaceColouredBannerNearTown(Player player, Town residentsTown, Nation residentsNation, TownBlock nearbyTownBlock, Town nearbyTown, Block bannerBlock) throws TownyException {
    if (nearbyTown.isNeutral()) {
        // Town is peaceful, so this action is a subversion or peaceful-revolt attempt
        if (residentsTown == nearbyTown) {
            PeacefullyRevolt.processActionRequest(player, nearbyTown);
        } else {
            PeacefullySubvertTown.processActionRequest(player, residentsNation, nearbyTown);
        }
    } else {
        // Town is not peaceful, so this action is a start-siege or invade-town request
        if (SiegeController.hasSiege(nearbyTown)) {
            // If there is a siege, it is an attempt to invade the town
            Siege siege = SiegeController.getSiege(nearbyTown);
            InvadeTown.processInvadeTownRequest(player, residentsNation, nearbyTown, siege);
        } else {
            // If there is no siege, it is an attempt to start a new siege
            evaluateStartNewSiegeAttempt(player, residentsTown, residentsNation, nearbyTownBlock, nearbyTown, bannerBlock);
        }
    }
}
Also used : Siege(com.gmail.goosius.siegewar.objects.Siege)

Aggregations

Siege (com.gmail.goosius.siegewar.objects.Siege)22 Resident (com.palmergames.bukkit.towny.object.Resident)7 Town (com.palmergames.bukkit.towny.object.Town)7 Translator (com.palmergames.bukkit.towny.object.Translator)6 EventHandler (org.bukkit.event.EventHandler)5 TownyException (com.palmergames.bukkit.towny.exceptions.TownyException)4 Nation (com.palmergames.bukkit.towny.object.Nation)4 ArrayList (java.util.ArrayList)4 TextComponent (net.md_5.bungee.api.chat.TextComponent)3 Location (org.bukkit.Location)3 Player (org.bukkit.entity.Player)3 Material (org.bukkit.Material)2 Block (org.bukkit.block.Block)2 SiegeSide (com.gmail.goosius.siegewar.enums.SiegeSide)1 SiegeStatus (com.gmail.goosius.siegewar.enums.SiegeStatus)1 BattleSessionEndedEvent (com.gmail.goosius.siegewar.events.BattleSessionEndedEvent)1 SiegeWarStartEvent (com.gmail.goosius.siegewar.events.SiegeWarStartEvent)1 BattleSession (com.gmail.goosius.siegewar.objects.BattleSession)1 TextComponent (com.palmergames.adventure.text.TextComponent)1 TownyUniverse (com.palmergames.bukkit.towny.TownyUniverse)1