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"));
}
}
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);
}
}
}
}
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);
}
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;
}
}
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);
}
}
}
Aggregations