-
-
Notifications
You must be signed in to change notification settings - Fork 40
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Battle Commanders / Mobile Spawn Points (#856)
* Added battle commanders feature --------- Authored-by: Goosius1 <[email protected]>
- Loading branch information
Showing
14 changed files
with
274 additions
and
8 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
65 changes: 65 additions & 0 deletions
65
src/main/java/com/gmail/goosius/siegewar/utils/SiegeWarBattleCommanderUtil.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
package com.gmail.goosius.siegewar.utils; | ||
|
||
import com.gmail.goosius.siegewar.SiegeController; | ||
import com.gmail.goosius.siegewar.enums.SiegeSide; | ||
import com.gmail.goosius.siegewar.enums.SiegeWarPermissionNodes; | ||
import com.gmail.goosius.siegewar.objects.Siege; | ||
import com.gmail.goosius.siegewar.settings.SiegeWarSettings; | ||
import com.palmergames.bukkit.towny.TownyAPI; | ||
import com.palmergames.bukkit.towny.object.Translatable; | ||
import com.palmergames.bukkit.towny.object.Translation; | ||
import org.bukkit.Bukkit; | ||
import org.bukkit.entity.Player; | ||
|
||
import java.util.Locale; | ||
|
||
public class SiegeWarBattleCommanderUtil { | ||
|
||
/** | ||
* Assign the siege commanders for this battle session | ||
* To qualify, a player must be: | ||
* - Online | ||
* - In the siege zone | ||
* - Nation king or general | ||
* - An official siege participant | ||
*/ | ||
public static void assignBattleCommanders() { | ||
if(!SiegeWarSettings.isBattleCommandersEnabled()) { | ||
return; | ||
} | ||
Player attackingCommander = null; | ||
Player defendingCommander = null; | ||
String attackingCommanderName; | ||
String defendingCommanderName; | ||
for(Siege siege: SiegeController.getSieges()) { | ||
if(siege.getStatus().isActive()) { | ||
//Wipe the current commanders | ||
siege.setAttackingCommander(null); | ||
siege.setDefendingCommander(null); | ||
//Find the commanders for the siege | ||
for(Player player: Bukkit.getOnlinePlayers()) { | ||
if (SiegeWarDistanceUtil.isPlayerRegisteredToActiveSiegeZone(player) | ||
&& player.hasPermission(SiegeWarPermissionNodes.SIEGEWAR_NATION_SIEGE_STARTCONQUESTSIEGE.getNode())) | ||
{ | ||
if(SiegeSide.getPlayerSiegeSide(siege,player) == SiegeSide.ATTACKERS) { | ||
if(attackingCommander == null) { | ||
attackingCommander = player; | ||
siege.setAttackingCommander(TownyAPI.getInstance().getResident(player)); | ||
} | ||
} else if (SiegeSide.getPlayerSiegeSide(siege,player) == SiegeSide.DEFENDERS) { | ||
if(defendingCommander == null) { | ||
defendingCommander = player; | ||
siege.setDefendingCommander(TownyAPI.getInstance().getResident(player)); | ||
} | ||
} | ||
} | ||
} | ||
|
||
//Display the commanders to all participants | ||
attackingCommanderName = attackingCommander == null ? Translation.of("no_battle_commander") : attackingCommander.getName(); | ||
defendingCommanderName = defendingCommander == null ? Translation.of("no_battle_commander") : defendingCommander.getName(); | ||
SiegeWarNotificationUtil.informSiegeParticipants(siege, Translatable.of("msg_battle_commanders_assigned", siege.getTown().getName(), attackingCommanderName, defendingCommanderName)); | ||
} | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
96 changes: 96 additions & 0 deletions
96
src/main/java/com/gmail/goosius/siegewar/utils/SiegeWarSpawnUtil.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,96 @@ | ||
package com.gmail.goosius.siegewar.utils; | ||
|
||
import com.gmail.goosius.siegewar.SiegeController; | ||
import com.gmail.goosius.siegewar.enums.SiegeSide; | ||
import com.gmail.goosius.siegewar.objects.BattleSession; | ||
import com.gmail.goosius.siegewar.objects.Siege; | ||
import com.gmail.goosius.siegewar.settings.SiegeWarSettings; | ||
import com.palmergames.bukkit.towny.TownyAPI; | ||
import com.palmergames.bukkit.towny.exceptions.TownyException; | ||
import com.palmergames.bukkit.towny.object.Resident; | ||
import com.palmergames.bukkit.towny.object.Town; | ||
import com.palmergames.bukkit.towny.object.Translatable; | ||
import com.palmergames.bukkit.towny.object.WorldCoord; | ||
import org.bukkit.entity.Player; | ||
|
||
import java.util.HashSet; | ||
import java.util.Set; | ||
|
||
public class SiegeWarSpawnUtil { | ||
|
||
private static final Set<Player> playersWithTeleportPasses = new HashSet<>(); | ||
|
||
public static boolean doesPlayerHasTeleportPass(Player player) { | ||
return playersWithTeleportPasses.contains(player); | ||
} | ||
|
||
private static void grandTeleportPassToPlayer(Player player) { | ||
playersWithTeleportPasses.add(player); | ||
} | ||
|
||
public static void removePlayerTeleportPass(Player player) { | ||
playersWithTeleportPasses.remove(player); | ||
} | ||
|
||
/** | ||
* Evaluate a spawn to siege request | ||
* | ||
* - If the primary nation/town has just 1 general/mayor in the siegezone, spawn to them. | ||
* - If any allied nation has just 1 general in the siegezone, spawn to them. | ||
* - Otherwise spawn is unavailable. | ||
* | ||
* @param player the player trying to spawn | ||
* @param besiegedTown the besieged town | ||
*/ | ||
public static void evaluateSpawnToSiegeRequest(Player player, Town besiegedTown) throws TownyException { | ||
if(!SiegeWarSettings.isBattleCommandersEnabled()) { | ||
throw new TownyException(Translatable.of("msg_err_cannot_spawn_feature_not_active")); | ||
} | ||
Siege siege = SiegeController.getSiege(besiegedTown); | ||
if(siege == null) { | ||
throw new TownyException(Translatable.of("msg_err_not_being_sieged", besiegedTown.getName())); | ||
} | ||
if(!siege.getStatus().isActive()) { | ||
throw new TownyException(Translatable.of("msg_err_cannot_spawn_siege_not_active")); | ||
} | ||
if(!BattleSession.getBattleSession().isActive()) { | ||
throw new TownyException(Translatable.of("msg_err_cannot_spawn_battle_session_not_active")); | ||
} | ||
SiegeSide playerSide = SiegeSide.getPlayerSiegeSide(siege, player); | ||
Resident battleCommanderResident; | ||
switch (playerSide) { | ||
case ATTACKERS: | ||
battleCommanderResident = siege.getAttackingCommander(); | ||
break; | ||
case DEFENDERS: | ||
battleCommanderResident = siege.getDefendingCommander(); | ||
break; | ||
default: | ||
throw new TownyException(Translatable.of("msg_err_cannot_spawn_not_participant")); | ||
} | ||
if(battleCommanderResident == null) { | ||
throw new TownyException(Translatable.of("msg_err_cannot_spawn_no_battle_commander")); | ||
} | ||
Player battleCommander = TownyAPI.getInstance().getPlayer(battleCommanderResident); | ||
if(battleCommander == null || !battleCommander.isOnline()) { | ||
throw new TownyException(Translatable.of("msg_err_cannot_spawn_no_battle_commander_offline")); | ||
} | ||
if(battleCommander.isDead()) { | ||
throw new TownyException(Translatable.of("msg_err_cannot_spawn_battle_commander_dead")); | ||
} | ||
if(!SiegeWarDistanceUtil.isPlayerRegisteredToActiveSiegeZone(battleCommander)) { | ||
throw new TownyException(Translatable.of("msg_err_cannot_spawn_battle_commander_not_in_siegezone")); | ||
} | ||
if(SiegeWarDistanceUtil.getActiveSiegeZonePlayerIsRegisteredTo(battleCommander) != siege) { | ||
throw new TownyException(Translatable.of("msg_err_cannot_spawn_battle_commander_not_in_siegezone")); | ||
} | ||
Resident spawnerResident = TownyAPI.getInstance().getResident(player); | ||
if(!WorldCoord.parseWorldCoord(player).equals(spawnerResident.getTown().getHomeBlock().getWorldCoord())) { | ||
throw new TownyException(Translatable.of("msg_err_cannot_spawn_not_in_homeblock")); | ||
} | ||
//Grant teleport pass in order to bypass SW's teleport blocker | ||
grandTeleportPassToPlayer(player); | ||
//SPAWN! | ||
player.teleport(battleCommander); | ||
} | ||
} |
Oops, something went wrong.