mirror of
https://github.com/taoneill/war.git
synced 2024-09-28 22:47:30 +02:00
Closes gh-353. Closes gh-354. Finally some new gameplay elements. Added Bomb and Cake structures. Use /setbomb <name>, /setcake <name>, /deletebomb and /deletecake. Grab the bomb and blow up your enemy's spawn for a point. Don't get touched or you blow up. Return the cake to your spawn to get a point and a replenished lifepool.
This commit is contained in:
parent
940ad072d4
commit
934292df88
@ -18,6 +18,8 @@ import org.bukkit.inventory.ItemStack;
|
|||||||
import org.getspout.spoutapi.SpoutManager;
|
import org.getspout.spoutapi.SpoutManager;
|
||||||
import org.getspout.spoutapi.player.SpoutPlayer;
|
import org.getspout.spoutapi.player.SpoutPlayer;
|
||||||
|
|
||||||
|
import com.tommytony.war.Bomb;
|
||||||
|
import com.tommytony.war.Cake;
|
||||||
import com.tommytony.war.FlagReturn;
|
import com.tommytony.war.FlagReturn;
|
||||||
import com.tommytony.war.Monument;
|
import com.tommytony.war.Monument;
|
||||||
import com.tommytony.war.Team;
|
import com.tommytony.war.Team;
|
||||||
@ -127,7 +129,21 @@ public class WarBlockListener extends BlockListener {
|
|||||||
if (team != null && zone != null && zone.isFlagThief(player.getName())) {
|
if (team != null && zone != null && zone.isFlagThief(player.getName())) {
|
||||||
War.war.badMsg(player, "Can't drop the flag. What are you doing? Run!");
|
War.war.badMsg(player, "Can't drop the flag. What are you doing? Run!");
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// a bomb thief can't drop his bomb
|
||||||
|
if (team != null && zone != null && zone.isBombThief(player.getName())) {
|
||||||
|
War.war.badMsg(player, "Can't drop the bomb. What are you doing? Run for your enemy's spawn!");
|
||||||
|
event.setCancelled(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// a cake thief can't drop his cake
|
||||||
|
if (team != null && zone != null && zone.isBombThief(player.getName())) {
|
||||||
|
War.war.badMsg(player, "Can't drop the cake. What are you doing? Run to your spawn!");
|
||||||
|
event.setCancelled(true);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// unbreakableZoneBlocks
|
// unbreakableZoneBlocks
|
||||||
@ -254,6 +270,8 @@ public class WarBlockListener extends BlockListener {
|
|||||||
if (warzone.isFlagThief(player.getName())) {
|
if (warzone.isFlagThief(player.getName())) {
|
||||||
// detect audacious thieves
|
// detect audacious thieves
|
||||||
War.war.badMsg(player, "You can only steal one flag at a time!");
|
War.war.badMsg(player, "You can only steal one flag at a time!");
|
||||||
|
} else if (warzone.isBombThief(player.getName()) || warzone.isCakeThief(player.getName())) {
|
||||||
|
War.war.badMsg(player, "You can only steal one thing at a time!");
|
||||||
} else {
|
} else {
|
||||||
Team lostFlagTeam = warzone.getTeamForFlagBlock(block);
|
Team lostFlagTeam = warzone.getTeamForFlagBlock(block);
|
||||||
if (lostFlagTeam.getPlayers().size() != 0) {
|
if (lostFlagTeam.getPlayers().size() != 0) {
|
||||||
@ -297,6 +315,90 @@ public class WarBlockListener extends BlockListener {
|
|||||||
War.war.msg(player, "You can't steal team " + lostFlagTeam.getName() + "'s flag since no players are on that team.");
|
War.war.msg(player, "You can't steal team " + lostFlagTeam.getName() + "'s flag since no players are on that team.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
event.setCancelled(true);
|
||||||
|
return;
|
||||||
|
} else if (team != null && warzone.isBombBlock(block)) {
|
||||||
|
if (warzone.isBombThief(player.getName())) {
|
||||||
|
// detect audacious thieves
|
||||||
|
War.war.badMsg(player, "You can only steal one bomb at a time!");
|
||||||
|
} else if (warzone.isFlagThief(player.getName()) || warzone.isCakeThief(player.getName())) {
|
||||||
|
War.war.badMsg(player, "You can only steal one thing at a time!");
|
||||||
|
} else {
|
||||||
|
Bomb bomb = warzone.getBombForBlock(block);
|
||||||
|
// player just broke the bomb block: cancel to avoid drop, give player the block, set block to air
|
||||||
|
ItemStack tntBlock = new ItemStack(Material.TNT);
|
||||||
|
player.getInventory().clear();
|
||||||
|
player.getInventory().addItem(tntBlock);
|
||||||
|
warzone.addBombThief(bomb, player.getName());
|
||||||
|
block.setType(Material.AIR);
|
||||||
|
|
||||||
|
for (Team t : warzone.getTeams()) {
|
||||||
|
t.teamcast(team.getKind().getColor() + player.getName() + ChatColor.WHITE + " has bomb " + ChatColor.GREEN + bomb.getName() + ChatColor.WHITE + ".");
|
||||||
|
|
||||||
|
if (War.war.isSpoutServer()) {
|
||||||
|
for (Player p : t.getPlayers()) {
|
||||||
|
SpoutPlayer sp = SpoutManager.getPlayer(p);
|
||||||
|
if (sp.isSpoutCraftEnabled()) {
|
||||||
|
sp.sendNotification(
|
||||||
|
SpoutMessenger.cleanForNotification(team.getKind().getColor() + player.getName() + ChatColor.YELLOW + " has "),
|
||||||
|
SpoutMessenger.cleanForNotification(ChatColor.YELLOW + "bomb " + ChatColor.GREEN + bomb.getName() + ChatColor.YELLOW + "!"),
|
||||||
|
Material.TNT,
|
||||||
|
(short)0,
|
||||||
|
5000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
t.teamcast("Prevent " + team.getKind().getColor() + player.getName() + ChatColor.WHITE
|
||||||
|
+ " from reaching your spawn with the bomb!");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
War.war.msg(player, "You have bomb " + bomb.getName() + ". Reach another team's spawn to score. Don't get touched by anyone or you'll blow up!");
|
||||||
|
}
|
||||||
|
|
||||||
|
event.setCancelled(true);
|
||||||
|
return;
|
||||||
|
} else if (team != null && warzone.isCakeBlock(block)) {
|
||||||
|
if (warzone.isCakeThief(player.getName())) {
|
||||||
|
// detect audacious thieves
|
||||||
|
War.war.badMsg(player, "You can only steal one cake at a time!");
|
||||||
|
} else if (warzone.isFlagThief(player.getName()) || warzone.isBombThief(player.getName())) {
|
||||||
|
War.war.badMsg(player, "You can only steal one thing at a time!");
|
||||||
|
} else {
|
||||||
|
Cake cake = warzone.getCakeForBlock(block);
|
||||||
|
// player just broke the cake block: cancel to avoid drop, give player the block, set block to air
|
||||||
|
ItemStack cakeBlock = new ItemStack(Material.CAKE);
|
||||||
|
player.getInventory().clear();
|
||||||
|
player.getInventory().addItem(cakeBlock);
|
||||||
|
warzone.addCakeThief(cake, player.getName());
|
||||||
|
block.setType(Material.AIR);
|
||||||
|
|
||||||
|
for (Team t : warzone.getTeams()) {
|
||||||
|
t.teamcast(team.getKind().getColor() + player.getName() + ChatColor.WHITE + " has cake " + ChatColor.GREEN + cake.getName() + ChatColor.WHITE + ".");
|
||||||
|
|
||||||
|
if (War.war.isSpoutServer()) {
|
||||||
|
for (Player p : t.getPlayers()) {
|
||||||
|
SpoutPlayer sp = SpoutManager.getPlayer(p);
|
||||||
|
if (sp.isSpoutCraftEnabled()) {
|
||||||
|
sp.sendNotification(
|
||||||
|
SpoutMessenger.cleanForNotification(team.getKind().getColor() + player.getName() + ChatColor.YELLOW + " has "),
|
||||||
|
SpoutMessenger.cleanForNotification(ChatColor.YELLOW + "cake " + ChatColor.GREEN + cake.getName() + ChatColor.YELLOW + "!"),
|
||||||
|
Material.CAKE,
|
||||||
|
(short)0,
|
||||||
|
5000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
t.teamcast("Prevent " + team.getKind().getColor() + player.getName() + ChatColor.WHITE
|
||||||
|
+ " from reaching their spawn with the cake!");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
War.war.msg(player, "You have cake " + cake.getName() + ". Reach your team's spawn to score and replenish your lifepool.");
|
||||||
|
}
|
||||||
|
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
return;
|
return;
|
||||||
} else if (!warzone.isMonumentCenterBlock(block)) {
|
} else if (!warzone.isMonumentCenterBlock(block)) {
|
||||||
|
@ -93,6 +93,14 @@ public class WarCommandHandler {
|
|||||||
commandObj = new SetMonumentCommand(this, sender, arguments);
|
commandObj = new SetMonumentCommand(this, sender, arguments);
|
||||||
} else if (command.equals("deletemonument")) {
|
} else if (command.equals("deletemonument")) {
|
||||||
commandObj = new DeleteMonumentCommand(this, sender, arguments);
|
commandObj = new DeleteMonumentCommand(this, sender, arguments);
|
||||||
|
} else if (command.equals("setbomb")) {
|
||||||
|
commandObj = new SetBombCommand(this, sender, arguments);
|
||||||
|
} else if (command.equals("deletebomb")) {
|
||||||
|
commandObj = new DeleteBombCommand(this, sender, arguments);
|
||||||
|
} else if (command.equals("setcake")) {
|
||||||
|
commandObj = new SetCakeCommand(this, sender, arguments);
|
||||||
|
} else if (command.equals("deletecake")) {
|
||||||
|
commandObj = new DeleteCakeCommand(this, sender, arguments);
|
||||||
}else if (command.equals("setteamconfig") || command.equals("teamcfg")) {
|
}else if (command.equals("setteamconfig") || command.equals("teamcfg")) {
|
||||||
commandObj = new SetTeamConfigCommand(this, sender, arguments);
|
commandObj = new SetTeamConfigCommand(this, sender, arguments);
|
||||||
} else if (command.equals("setzoneconfig") || command.equals("zonecfg")) {
|
} else if (command.equals("setzoneconfig") || command.equals("zonecfg")) {
|
||||||
|
@ -30,13 +30,17 @@ import org.bukkit.event.entity.EntityRegainHealthEvent;
|
|||||||
import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason;
|
import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason;
|
||||||
import org.bukkit.event.entity.FoodLevelChangeEvent;
|
import org.bukkit.event.entity.FoodLevelChangeEvent;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.getspout.spoutapi.SpoutManager;
|
||||||
|
import org.getspout.spoutapi.player.SpoutPlayer;
|
||||||
|
|
||||||
|
import com.tommytony.war.Bomb;
|
||||||
import com.tommytony.war.Team;
|
import com.tommytony.war.Team;
|
||||||
import com.tommytony.war.Warzone;
|
import com.tommytony.war.Warzone;
|
||||||
import com.tommytony.war.config.TeamConfig;
|
import com.tommytony.war.config.TeamConfig;
|
||||||
import com.tommytony.war.config.WarConfig;
|
import com.tommytony.war.config.WarConfig;
|
||||||
import com.tommytony.war.config.WarzoneConfig;
|
import com.tommytony.war.config.WarzoneConfig;
|
||||||
import com.tommytony.war.jobs.DeferredBlockResetsJob;
|
import com.tommytony.war.jobs.DeferredBlockResetsJob;
|
||||||
|
import com.tommytony.war.spout.SpoutMessenger;
|
||||||
import com.tommytony.war.utils.DeferredBlockReset;
|
import com.tommytony.war.utils.DeferredBlockReset;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -79,14 +83,16 @@ public class WarEntityListener extends EntityListener {
|
|||||||
|| (attackerTeam != null && defenderTeam != null && attacker.getEntityId() == defender.getEntityId())) {
|
|| (attackerTeam != null && defenderTeam != null && attacker.getEntityId() == defender.getEntityId())) {
|
||||||
// Make sure one of the players isn't in the spawn
|
// Make sure one of the players isn't in the spawn
|
||||||
if (defenderTeam.getSpawnVolume().contains(d.getLocation())) { // attacking person in spawn
|
if (defenderTeam.getSpawnVolume().contains(d.getLocation())) { // attacking person in spawn
|
||||||
if (!defenderWarzone.isFlagThief(d.getName())) { // thieves can always be attacked
|
if (!defenderWarzone.isFlagThief(d.getName())
|
||||||
|
&& !defenderWarzone.isBombThief(d.getName())) { // thieves can always be attacked
|
||||||
War.war.badMsg(a, "Can't attack a player that's inside his team's spawn.");
|
War.war.badMsg(a, "Can't attack a player that's inside his team's spawn.");
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else if (attackerTeam.getSpawnVolume().contains(a.getLocation()) && !attackerTeam.getSpawnVolume().contains(d.getLocation())) {
|
} else if (attackerTeam.getSpawnVolume().contains(a.getLocation()) && !attackerTeam.getSpawnVolume().contains(d.getLocation())) {
|
||||||
// only let a player inside spawn attack an enemy player if that player enters the spawn
|
// only let a player inside spawn attack an enemy player if that player enters the spawn
|
||||||
if (!attackerWarzone.isFlagThief(a.getName())) { // thieves can always attack
|
if (!attackerWarzone.isFlagThief(a.getName())
|
||||||
|
&& !defenderWarzone.isBombThief(d.getName())) { // thieves can always attack
|
||||||
War.war.badMsg(a, "Can't attack a player from inside your spawn.");
|
War.war.badMsg(a, "Can't attack a player from inside your spawn.");
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
return;
|
return;
|
||||||
@ -152,6 +158,38 @@ public class WarEntityListener extends EntityListener {
|
|||||||
defenderWarzone.handleDeath(d);
|
defenderWarzone.handleDeath(d);
|
||||||
|
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
|
} else if (defenderWarzone.isBombThief(d.getName()) && d.getLocation().distance(a.getLocation()) < 2) {
|
||||||
|
Bomb bomb = defenderWarzone.getBombForThief(d.getName());
|
||||||
|
|
||||||
|
// Kill the bomber
|
||||||
|
defenderWarzone.handleDeath(d);
|
||||||
|
|
||||||
|
// blow up bomb man if attacker is close enough
|
||||||
|
defenderWarzone.getWorld().createExplosion(a.getLocation(), 4F);
|
||||||
|
|
||||||
|
// Notify everyone
|
||||||
|
for (Team t : defenderWarzone.getTeams()) {
|
||||||
|
if (War.war.isSpoutServer()) {
|
||||||
|
for (Player p : t.getPlayers()) {
|
||||||
|
SpoutPlayer sp = SpoutManager.getPlayer(p);
|
||||||
|
if (sp.isSpoutCraftEnabled()) {
|
||||||
|
sp.sendNotification(
|
||||||
|
SpoutMessenger.cleanForNotification(attackerTeam.getKind().getColor() + a.getName() + ChatColor.YELLOW + " made "),
|
||||||
|
SpoutMessenger.cleanForNotification(defenderTeam.getKind().getColor() + d.getName() + ChatColor.YELLOW + " blow up!"),
|
||||||
|
Material.TNT,
|
||||||
|
(short)0,
|
||||||
|
10000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// bring back tnt
|
||||||
|
bomb.getVolume().resetBlocks();
|
||||||
|
bomb.addBombBlocks();
|
||||||
|
|
||||||
|
t.teamcast(attackerTeam.getKind().getColor() + a.getName() + ChatColor.WHITE
|
||||||
|
+ " made " + defenderTeam.getKind().getColor() + d.getName() + ChatColor.WHITE + " blow up!");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else if (attackerTeam != null && defenderTeam != null && attackerTeam == defenderTeam && attackerWarzone == defenderWarzone && attacker.getEntityId() != defender.getEntityId()) {
|
} else if (attackerTeam != null && defenderTeam != null && attackerTeam == defenderTeam && attackerWarzone == defenderWarzone && attacker.getEntityId() != defender.getEntityId()) {
|
||||||
// same team, but not same person
|
// same team, but not same person
|
||||||
|
@ -28,6 +28,8 @@ import org.bukkit.inventory.PlayerInventory;
|
|||||||
import org.getspout.spoutapi.SpoutManager;
|
import org.getspout.spoutapi.SpoutManager;
|
||||||
import org.getspout.spoutapi.player.SpoutPlayer;
|
import org.getspout.spoutapi.player.SpoutPlayer;
|
||||||
|
|
||||||
|
import com.tommytony.war.Bomb;
|
||||||
|
import com.tommytony.war.Cake;
|
||||||
import com.tommytony.war.FlagReturn;
|
import com.tommytony.war.FlagReturn;
|
||||||
import com.tommytony.war.LoadoutSelection;
|
import com.tommytony.war.LoadoutSelection;
|
||||||
import com.tommytony.war.Team;
|
import com.tommytony.war.Team;
|
||||||
@ -79,6 +81,14 @@ public class WarPlayerListener extends PlayerListener {
|
|||||||
// a flag thief can't drop his flag
|
// a flag thief can't drop his flag
|
||||||
War.war.badMsg(player, "Can't drop items while stealing flag. What are you doing?! Run!");
|
War.war.badMsg(player, "Can't drop items while stealing flag. What are you doing?! Run!");
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
|
} else if (zone.isBombThief(player.getName())) {
|
||||||
|
// a bomb thief can't drop his bomb
|
||||||
|
War.war.badMsg(player, "Can't drop items while stealing bomb. What are you doing?! Run for your enemy's spawn!");
|
||||||
|
event.setCancelled(true);
|
||||||
|
} else if (zone.isCakeThief(player.getName())) {
|
||||||
|
// a cake thief can't drop his cake
|
||||||
|
War.war.badMsg(player, "Can't drop items while stealing cake. What are you doing?! Run!");
|
||||||
|
event.setCancelled(true);
|
||||||
} else if (zone.getWarzoneConfig().getBoolean(WarzoneConfig.NODROPS)) {
|
} else if (zone.getWarzoneConfig().getBoolean(WarzoneConfig.NODROPS)) {
|
||||||
War.war.badMsg(player, "Can't drop items in this warzone.");
|
War.war.badMsg(player, "Can't drop items in this warzone.");
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
@ -504,10 +514,9 @@ public class WarPlayerListener extends PlayerListener {
|
|||||||
if (playerWarzone.isTeamFlagStolen(playerTeam) && playerTeam.getTeamConfig().resolveBoolean(TeamConfig.FLAGMUSTBEHOME)) {
|
if (playerWarzone.isTeamFlagStolen(playerTeam) && playerTeam.getTeamConfig().resolveBoolean(TeamConfig.FLAGMUSTBEHOME)) {
|
||||||
War.war.badMsg(player, "You can't capture the enemy flag until your team's flag is returned.");
|
War.war.badMsg(player, "You can't capture the enemy flag until your team's flag is returned.");
|
||||||
} else {
|
} else {
|
||||||
synchronized (playerWarzone) {
|
|
||||||
// flags can be captured at own spawn or own flag pole
|
// flags can be captured at own spawn or own flag pole
|
||||||
playerTeam.addPoint();
|
playerTeam.addPoint();
|
||||||
Team victim = playerWarzone.getVictimTeamForThief(player.getName());
|
Team victim = playerWarzone.getVictimTeamForFlagThief(player.getName());
|
||||||
|
|
||||||
// Notify everyone
|
// Notify everyone
|
||||||
for (Team t : playerWarzone.getTeams()) {
|
for (Team t : playerWarzone.getTeams()) {
|
||||||
@ -544,9 +553,145 @@ public class WarPlayerListener extends PlayerListener {
|
|||||||
playerTeam.resetSign();
|
playerTeam.resetSign();
|
||||||
playerWarzone.getLobby().resetTeamGateSign(playerTeam);
|
playerWarzone.getLobby().resetTeamGateSign(playerTeam);
|
||||||
}
|
}
|
||||||
playerWarzone.removeThief(player.getName());
|
playerWarzone.removeFlagThief(player.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bomb detonation
|
||||||
|
if (playerWarzone.isBombThief(player.getName())) {
|
||||||
|
boolean inEnemySpawn = false;
|
||||||
|
Team victim = null;
|
||||||
|
for (Team team : playerWarzone.getTeams()) {
|
||||||
|
if (team != playerTeam
|
||||||
|
&& team.getSpawnVolume().contains(player.getLocation())
|
||||||
|
&& team.getPlayers().size() > 0) {
|
||||||
|
inEnemySpawn = true;
|
||||||
|
victim = team;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (inEnemySpawn) {
|
||||||
|
Bomb bomb = playerWarzone.getBombForThief(player.getName());
|
||||||
|
|
||||||
|
// Boom!
|
||||||
|
playerWarzone.getWorld().createExplosion(player.getLocation(), 1F);
|
||||||
|
|
||||||
|
playerTeam.addPoint();
|
||||||
|
|
||||||
|
// Notify everyone
|
||||||
|
for (Team t : playerWarzone.getTeams()) {
|
||||||
|
if (War.war.isSpoutServer()) {
|
||||||
|
for (Player p : t.getPlayers()) {
|
||||||
|
SpoutPlayer sp = SpoutManager.getPlayer(p);
|
||||||
|
if (sp.isSpoutCraftEnabled()) {
|
||||||
|
sp.sendNotification(
|
||||||
|
SpoutMessenger.cleanForNotification(playerTeam.getKind().getColor() + player.getName() + ChatColor.YELLOW + " blew up "),
|
||||||
|
SpoutMessenger.cleanForNotification(victim.getKind().getColor() + victim.getName() + ChatColor.YELLOW + "'s spawn!"),
|
||||||
|
victim.getKind().getMaterial(),
|
||||||
|
victim.getKind().getData(),
|
||||||
|
10000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
t.teamcast(playerTeam.getKind().getColor() + player.getName() + ChatColor.WHITE
|
||||||
|
+ " blew up team " + victim.getName() + "'s spawn. Team " + playerTeam.getName() + " scores one point.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Detect win conditions
|
||||||
|
if (playerTeam.getPoints() >= playerTeam.getTeamConfig().resolveInt(TeamConfig.MAXSCORE)) {
|
||||||
|
if (playerWarzone.hasPlayerState(player.getName())) {
|
||||||
|
playerWarzone.restorePlayerState(player);
|
||||||
|
}
|
||||||
|
playerWarzone.handleScoreCapReached(player, playerTeam.getName());
|
||||||
|
event.setTo(playerWarzone.getTeleport());
|
||||||
|
} else {
|
||||||
|
// just added a point
|
||||||
|
|
||||||
|
// bring back flag to team that lost it
|
||||||
|
victim.getSpawnVolume().resetBlocks();
|
||||||
|
victim.initializeTeamSpawn();
|
||||||
|
|
||||||
|
// bring back tnt
|
||||||
|
bomb.getVolume().resetBlocks();
|
||||||
|
bomb.addBombBlocks();
|
||||||
|
|
||||||
|
playerWarzone.respawnPlayer(event, playerTeam, player);
|
||||||
|
playerTeam.resetSign();
|
||||||
|
playerWarzone.getLobby().resetTeamGateSign(playerTeam);
|
||||||
|
}
|
||||||
|
|
||||||
|
playerWarzone.removeBombThief(player.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cake retrieval
|
||||||
|
if (playerWarzone.isCakeThief(player.getName())) {
|
||||||
|
boolean inSpawn = playerTeam.getSpawnVolume().contains(player.getLocation());
|
||||||
|
|
||||||
|
if (inSpawn) {
|
||||||
|
boolean hasOpponent = false;
|
||||||
|
for (Team t : playerWarzone.getTeams()) {
|
||||||
|
if (t != playerTeam && t.getPlayers().size() > 0) {
|
||||||
|
hasOpponent = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Don't let someone alone make points off cakes
|
||||||
|
if (hasOpponent) {
|
||||||
|
Cake cake = playerWarzone.getCakeForThief(player.getName());
|
||||||
|
|
||||||
|
// Woot!
|
||||||
|
playerTeam.addPoint();
|
||||||
|
playerTeam.setRemainingLives(playerTeam.getTeamConfig().resolveInt(TeamConfig.LIFEPOOL));
|
||||||
|
|
||||||
|
// Notify everyone
|
||||||
|
for (Team t : playerWarzone.getTeams()) {
|
||||||
|
if (War.war.isSpoutServer()) {
|
||||||
|
for (Player p : t.getPlayers()) {
|
||||||
|
SpoutPlayer sp = SpoutManager.getPlayer(p);
|
||||||
|
if (sp.isSpoutCraftEnabled()) {
|
||||||
|
sp.sendNotification(
|
||||||
|
SpoutMessenger.cleanForNotification(playerTeam.getKind().getColor() + player.getName() + ChatColor.YELLOW + " captured"),
|
||||||
|
SpoutMessenger.cleanForNotification(ChatColor.YELLOW + "cake " + ChatColor.GREEN + cake.getName() + ChatColor.YELLOW + "!"),
|
||||||
|
playerTeam.getKind().getMaterial(),
|
||||||
|
playerTeam.getKind().getData(),
|
||||||
|
10000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
t.teamcast(playerTeam.getKind().getColor() + player.getName() + ChatColor.WHITE
|
||||||
|
+ " captured cake " + ChatColor.GREEN + cake.getName() + ChatColor.WHITE + ". Team " + playerTeam.getName() + " scores one point and gets a full lifepool.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Detect win conditions
|
||||||
|
if (playerTeam.getPoints() >= playerTeam.getTeamConfig().resolveInt(TeamConfig.MAXSCORE)) {
|
||||||
|
if (playerWarzone.hasPlayerState(player.getName())) {
|
||||||
|
playerWarzone.restorePlayerState(player);
|
||||||
|
}
|
||||||
|
playerWarzone.handleScoreCapReached(player, playerTeam.getName());
|
||||||
|
event.setTo(playerWarzone.getTeleport());
|
||||||
|
} else {
|
||||||
|
// just added a point
|
||||||
|
|
||||||
|
// bring back cake
|
||||||
|
cake.getVolume().resetBlocks();
|
||||||
|
cake.addCakeBlocks();
|
||||||
|
|
||||||
|
playerWarzone.respawnPlayer(event, playerTeam, player);
|
||||||
|
playerTeam.resetSign();
|
||||||
|
playerWarzone.getLobby().resetTeamGateSign(playerTeam);
|
||||||
|
}
|
||||||
|
|
||||||
|
playerWarzone.removeCakeThief(player.getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,67 @@
|
|||||||
|
package bukkit.tommytony.war.command;
|
||||||
|
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import bukkit.tommytony.war.WarCommandHandler;
|
||||||
|
|
||||||
|
import com.tommytony.war.Bomb;
|
||||||
|
import com.tommytony.war.Monument;
|
||||||
|
import com.tommytony.war.Warzone;
|
||||||
|
import com.tommytony.war.ZoneLobby;
|
||||||
|
import com.tommytony.war.mappers.WarzoneYmlMapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes a bomb.
|
||||||
|
*
|
||||||
|
* @author tommytony
|
||||||
|
*/
|
||||||
|
public class DeleteBombCommand extends AbstractZoneMakerCommand {
|
||||||
|
public DeleteBombCommand(WarCommandHandler handler, CommandSender sender, String[] args) throws NotZoneMakerException {
|
||||||
|
super(handler, sender, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean handle() {
|
||||||
|
Warzone zone;
|
||||||
|
|
||||||
|
if (this.args.length == 0) {
|
||||||
|
return false;
|
||||||
|
} else if (this.args.length == 2) {
|
||||||
|
zone = Warzone.getZoneByName(this.args[0]);
|
||||||
|
this.args[0] = this.args[1];
|
||||||
|
} else if (this.args.length == 1) {
|
||||||
|
if (!(this.getSender() instanceof Player)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
zone = Warzone.getZoneByLocation((Player) this.getSender());
|
||||||
|
if (zone == null) {
|
||||||
|
ZoneLobby lobby = ZoneLobby.getLobbyByLocation((Player) this.getSender());
|
||||||
|
if (lobby == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
zone = lobby.getZone();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (zone == null) {
|
||||||
|
return false;
|
||||||
|
} else if (!this.isSenderAuthorOfZone(zone)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Bomb bomb = zone.getBomb(this.args[0]);
|
||||||
|
if (bomb != null) {
|
||||||
|
bomb.getVolume().resetBlocks();
|
||||||
|
zone.getBombs().remove(bomb);
|
||||||
|
WarzoneYmlMapper.save(zone, false);
|
||||||
|
this.msg("Bomb " + bomb.getName() + " removed.");
|
||||||
|
} else {
|
||||||
|
this.badMsg("No such bomb.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,66 @@
|
|||||||
|
package bukkit.tommytony.war.command;
|
||||||
|
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import bukkit.tommytony.war.WarCommandHandler;
|
||||||
|
|
||||||
|
import com.tommytony.war.Cake;
|
||||||
|
import com.tommytony.war.Warzone;
|
||||||
|
import com.tommytony.war.ZoneLobby;
|
||||||
|
import com.tommytony.war.mappers.WarzoneYmlMapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes a cake.
|
||||||
|
*
|
||||||
|
* @author tommytony
|
||||||
|
*/
|
||||||
|
public class DeleteCakeCommand extends AbstractZoneMakerCommand {
|
||||||
|
public DeleteCakeCommand(WarCommandHandler handler, CommandSender sender, String[] args) throws NotZoneMakerException {
|
||||||
|
super(handler, sender, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean handle() {
|
||||||
|
Warzone zone;
|
||||||
|
|
||||||
|
if (this.args.length == 0) {
|
||||||
|
return false;
|
||||||
|
} else if (this.args.length == 2) {
|
||||||
|
zone = Warzone.getZoneByName(this.args[0]);
|
||||||
|
this.args[0] = this.args[1];
|
||||||
|
} else if (this.args.length == 1) {
|
||||||
|
if (!(this.getSender() instanceof Player)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
zone = Warzone.getZoneByLocation((Player) this.getSender());
|
||||||
|
if (zone == null) {
|
||||||
|
ZoneLobby lobby = ZoneLobby.getLobbyByLocation((Player) this.getSender());
|
||||||
|
if (lobby == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
zone = lobby.getZone();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (zone == null) {
|
||||||
|
return false;
|
||||||
|
} else if (!this.isSenderAuthorOfZone(zone)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Cake cake = zone.getCake(this.args[0]);
|
||||||
|
if (cake != null) {
|
||||||
|
cake.getVolume().resetBlocks();
|
||||||
|
zone.getCakes().remove(cake);
|
||||||
|
WarzoneYmlMapper.save(zone, false);
|
||||||
|
this.msg("Cake " + cake.getName() + " removed.");
|
||||||
|
} else {
|
||||||
|
this.badMsg("No such cake.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@ -78,15 +78,6 @@ public class JoinCommand extends AbstractWarCommand {
|
|||||||
if (!previousTeam.removePlayer(player.getName())) {
|
if (!previousTeam.removePlayer(player.getName())) {
|
||||||
War.war.log("Could not remove player " + player.getName() + " from team " + previousTeam.getName(), java.util.logging.Level.WARNING);
|
War.war.log("Could not remove player " + player.getName() + " from team " + previousTeam.getName(), java.util.logging.Level.WARNING);
|
||||||
}
|
}
|
||||||
if (oldZone.isFlagThief(player.getName())) {
|
|
||||||
Team victim = oldZone.getVictimTeamForThief(player.getName());
|
|
||||||
victim.getFlagVolume().resetBlocks();
|
|
||||||
victim.initializeTeamFlag();
|
|
||||||
zone.removeThief(player.getName());
|
|
||||||
for (Team t : oldZone.getTeams()) {
|
|
||||||
t.teamcast("Team " + victim.getName() + " flag was returned.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
previousTeam.resetSign();
|
previousTeam.resetSign();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@ public class NextBattleCommand extends AbstractZoneMakerCommand {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
zone.clearFlagThieves();
|
zone.clearThieves();
|
||||||
for (Team team : zone.getTeams()) {
|
for (Team team : zone.getTeams()) {
|
||||||
team.teamcast("The battle was interrupted. " + zone.getTeamInformation() + " Resetting warzone " + zone.getName() + " and life pools...");
|
team.teamcast("The battle was interrupted. " + zone.getTeamInformation() + " Resetting warzone " + zone.getName() + " and life pools...");
|
||||||
}
|
}
|
||||||
|
@ -42,7 +42,7 @@ public class ResetZoneCommand extends AbstractZoneMakerCommand {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
zone.clearFlagThieves();
|
zone.clearThieves();
|
||||||
for (Team team : zone.getTeams()) {
|
for (Team team : zone.getTeams()) {
|
||||||
team.teamcast("The war has ended. " + zone.getTeamInformation() + " Resetting warzone " + zone.getName() + " and teams...");
|
team.teamcast("The war has ended. " + zone.getTeamInformation() + " Resetting warzone " + zone.getName() + " and teams...");
|
||||||
for (Player p : team.getPlayers()) {
|
for (Player p : team.getPlayers()) {
|
||||||
|
@ -0,0 +1,64 @@
|
|||||||
|
package bukkit.tommytony.war.command;
|
||||||
|
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import bukkit.tommytony.war.WarCommandHandler;
|
||||||
|
|
||||||
|
import com.tommytony.war.Bomb;
|
||||||
|
import com.tommytony.war.Warzone;
|
||||||
|
import com.tommytony.war.mappers.WarzoneYmlMapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Places a bomb
|
||||||
|
*
|
||||||
|
* @author tommytony
|
||||||
|
*/
|
||||||
|
public class SetBombCommand extends AbstractZoneMakerCommand {
|
||||||
|
public SetBombCommand(WarCommandHandler handler, CommandSender sender, String[] args) throws NotZoneMakerException {
|
||||||
|
super(handler, sender, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean handle() {
|
||||||
|
if (!(this.getSender() instanceof Player)) {
|
||||||
|
this.badMsg("You can't do this if you are not in-game.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Player player = (Player) this.getSender();
|
||||||
|
|
||||||
|
if (this.args.length != 1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Warzone zone = Warzone.getZoneByLocation(player);
|
||||||
|
|
||||||
|
if (zone == null) {
|
||||||
|
return false;
|
||||||
|
} else if (!this.isSenderAuthorOfZone(zone)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.args[0].equals(zone.getName())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (zone.hasBomb(this.args[0])) {
|
||||||
|
// move the existing bomb
|
||||||
|
Bomb bomb = zone.getBomb(this.args[0]);
|
||||||
|
bomb.getVolume().resetBlocks();
|
||||||
|
bomb.setLocation(player.getLocation());
|
||||||
|
this.msg("Bomb " + bomb.getName() + " was moved.");
|
||||||
|
} else {
|
||||||
|
// create a new bomb
|
||||||
|
Bomb bomb = new Bomb(this.args[0], zone, player.getLocation());
|
||||||
|
zone.getBombs().add(bomb);
|
||||||
|
this.msg("Bomb " + bomb.getName() + " created.");
|
||||||
|
}
|
||||||
|
|
||||||
|
WarzoneYmlMapper.save(zone, false);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,64 @@
|
|||||||
|
package bukkit.tommytony.war.command;
|
||||||
|
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import bukkit.tommytony.war.WarCommandHandler;
|
||||||
|
|
||||||
|
import com.tommytony.war.Cake;
|
||||||
|
import com.tommytony.war.Warzone;
|
||||||
|
import com.tommytony.war.mappers.WarzoneYmlMapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Places a cake
|
||||||
|
*
|
||||||
|
* @author tommytony
|
||||||
|
*/
|
||||||
|
public class SetCakeCommand extends AbstractZoneMakerCommand {
|
||||||
|
public SetCakeCommand(WarCommandHandler handler, CommandSender sender, String[] args) throws NotZoneMakerException {
|
||||||
|
super(handler, sender, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean handle() {
|
||||||
|
if (!(this.getSender() instanceof Player)) {
|
||||||
|
this.badMsg("You can't do this if you are not in-game.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Player player = (Player) this.getSender();
|
||||||
|
|
||||||
|
if (this.args.length != 1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Warzone zone = Warzone.getZoneByLocation(player);
|
||||||
|
|
||||||
|
if (zone == null) {
|
||||||
|
return false;
|
||||||
|
} else if (!this.isSenderAuthorOfZone(zone)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.args[0].equals(zone.getName())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (zone.hasCake(this.args[0])) {
|
||||||
|
// move the existing cake
|
||||||
|
Cake cake = zone.getCake(this.args[0]);
|
||||||
|
cake.getVolume().resetBlocks();
|
||||||
|
cake.setLocation(player.getLocation());
|
||||||
|
this.msg("Cake " + cake.getName() + " was moved.");
|
||||||
|
} else {
|
||||||
|
// create a new cake
|
||||||
|
Cake cake = new Cake(this.args[0], zone, player.getLocation());
|
||||||
|
zone.getCakes().add(cake);
|
||||||
|
this.msg("Cake " + cake.getName() + " created.");
|
||||||
|
}
|
||||||
|
|
||||||
|
WarzoneYmlMapper.save(zone, false);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
110
war/src/main/java/com/tommytony/war/Bomb.java
Normal file
110
war/src/main/java/com/tommytony/war/Bomb.java
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
package com.tommytony.war;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.block.BlockFace;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import com.tommytony.war.volumes.Volume;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author tommytony
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class Bomb {
|
||||||
|
private Location location;
|
||||||
|
private Volume volume;
|
||||||
|
|
||||||
|
private final String name;
|
||||||
|
private Warzone warzone;
|
||||||
|
private Player capturer;
|
||||||
|
|
||||||
|
public Bomb(String name, Warzone warzone, Location location) {
|
||||||
|
this.name = name;
|
||||||
|
this.location = location;
|
||||||
|
this.warzone = warzone;
|
||||||
|
this.volume = new Volume("bomb-" + name, warzone.getWorld());
|
||||||
|
this.setLocation(location);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addBombBlocks() {
|
||||||
|
this.volume.setToMaterial(Material.AIR);
|
||||||
|
|
||||||
|
int x = this.location.getBlockX();
|
||||||
|
int y = this.location.getBlockY();
|
||||||
|
int z = this.location.getBlockZ();
|
||||||
|
|
||||||
|
// center
|
||||||
|
this.warzone.getWorld().getBlockAt(x, y - 1, z).getState().setType(Material.OBSIDIAN);
|
||||||
|
|
||||||
|
// inner ring
|
||||||
|
this.warzone.getWorld().getBlockAt(x + 1, y - 1, z + 1).setType(Material.GLOWSTONE);
|
||||||
|
this.warzone.getWorld().getBlockAt(x + 1, y - 1, z).setType(Material.OBSIDIAN);
|
||||||
|
this.warzone.getWorld().getBlockAt(x + 1, y - 1, z - 1).setType(Material.GLOWSTONE);
|
||||||
|
|
||||||
|
this.warzone.getWorld().getBlockAt(x, y - 1, z + 1).setType(Material.OBSIDIAN);
|
||||||
|
this.warzone.getWorld().getBlockAt(x, y - 1, z).setType(Material.GLOWSTONE);
|
||||||
|
this.warzone.getWorld().getBlockAt(x, y - 1, z - 1).setType(Material.OBSIDIAN);
|
||||||
|
|
||||||
|
this.warzone.getWorld().getBlockAt(x - 1, y - 1, z + 1).setType(Material.GLOWSTONE);
|
||||||
|
this.warzone.getWorld().getBlockAt(x - 1, y - 1, z).setType(Material.OBSIDIAN);
|
||||||
|
this.warzone.getWorld().getBlockAt(x - 1, y - 1, z - 1).setType(Material.GLOWSTONE);
|
||||||
|
|
||||||
|
// block holder
|
||||||
|
this.warzone.getWorld().getBlockAt(x, y, z).setType(Material.OBSIDIAN);
|
||||||
|
this.warzone.getWorld().getBlockAt(x, y + 1, z).setType(Material.TNT);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isBombBlock(Location otherLocation) {
|
||||||
|
int x = this.location.getBlockX();
|
||||||
|
int y = this.location.getBlockY() + 1;
|
||||||
|
int z = this.location.getBlockZ();
|
||||||
|
int otherX = otherLocation.getBlockX();
|
||||||
|
int otherY = otherLocation.getBlockY();
|
||||||
|
int otherZ = otherLocation.getBlockZ();
|
||||||
|
|
||||||
|
return x == otherX
|
||||||
|
&& y == otherY
|
||||||
|
&& z == otherZ;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void capture(Player capturer) {
|
||||||
|
this.capturer = capturer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isCaptured() {
|
||||||
|
return this.capturer != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void uncapture() {
|
||||||
|
this.capturer = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Location getLocation() {
|
||||||
|
return this.location;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return this.name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLocation(Location location) {
|
||||||
|
Block locationBlock = this.warzone.getWorld().getBlockAt(location.getBlockX(), location.getBlockY(), location.getBlockZ());
|
||||||
|
this.volume.setCornerOne(locationBlock.getRelative(BlockFace.DOWN).getRelative(BlockFace.EAST, 1).getRelative(BlockFace.SOUTH, 1));
|
||||||
|
this.volume.setCornerTwo(locationBlock.getRelative(BlockFace.UP, 2).getRelative(BlockFace.WEST, 1).getRelative(BlockFace.NORTH, 1));
|
||||||
|
this.volume.saveBlocks();
|
||||||
|
this.location = location;
|
||||||
|
this.addBombBlocks();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Volume getVolume() {
|
||||||
|
return this.volume;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setVolume(Volume newVolume) {
|
||||||
|
this.volume = newVolume;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
110
war/src/main/java/com/tommytony/war/Cake.java
Normal file
110
war/src/main/java/com/tommytony/war/Cake.java
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
package com.tommytony.war;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.block.BlockFace;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import com.tommytony.war.volumes.Volume;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author tommytony
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class Cake {
|
||||||
|
private Location location;
|
||||||
|
private Volume volume;
|
||||||
|
|
||||||
|
private final String name;
|
||||||
|
private Warzone warzone;
|
||||||
|
private Player capturer;
|
||||||
|
|
||||||
|
public Cake(String name, Warzone warzone, Location location) {
|
||||||
|
this.name = name;
|
||||||
|
this.location = location;
|
||||||
|
this.warzone = warzone;
|
||||||
|
this.volume = new Volume("cake-" + name, warzone.getWorld());
|
||||||
|
this.setLocation(location);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addCakeBlocks() {
|
||||||
|
this.volume.setToMaterial(Material.AIR);
|
||||||
|
|
||||||
|
int x = this.location.getBlockX();
|
||||||
|
int y = this.location.getBlockY();
|
||||||
|
int z = this.location.getBlockZ();
|
||||||
|
|
||||||
|
// center
|
||||||
|
this.warzone.getWorld().getBlockAt(x, y - 1, z).getState().setType(Material.OBSIDIAN);
|
||||||
|
|
||||||
|
// inner ring
|
||||||
|
this.warzone.getWorld().getBlockAt(x + 1, y - 1, z + 1).setType(Material.OBSIDIAN);
|
||||||
|
this.warzone.getWorld().getBlockAt(x + 1, y - 1, z).setType(Material.OBSIDIAN);
|
||||||
|
this.warzone.getWorld().getBlockAt(x + 1, y - 1, z - 1).setType(Material.OBSIDIAN);
|
||||||
|
|
||||||
|
this.warzone.getWorld().getBlockAt(x, y - 1, z + 1).setType(Material.OBSIDIAN);
|
||||||
|
this.warzone.getWorld().getBlockAt(x, y - 1, z).setType(Material.GLOWSTONE);
|
||||||
|
this.warzone.getWorld().getBlockAt(x, y - 1, z - 1).setType(Material.OBSIDIAN);
|
||||||
|
|
||||||
|
this.warzone.getWorld().getBlockAt(x - 1, y - 1, z + 1).setType(Material.OBSIDIAN);
|
||||||
|
this.warzone.getWorld().getBlockAt(x - 1, y - 1, z).setType(Material.OBSIDIAN);
|
||||||
|
this.warzone.getWorld().getBlockAt(x - 1, y - 1, z - 1).setType(Material.OBSIDIAN);
|
||||||
|
|
||||||
|
// block holder
|
||||||
|
this.warzone.getWorld().getBlockAt(x, y, z).setType(Material.GLASS);
|
||||||
|
this.warzone.getWorld().getBlockAt(x, y + 1, z).setType(Material.CAKE_BLOCK);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isCakeBlock(Location otherLocation) {
|
||||||
|
int x = this.location.getBlockX();
|
||||||
|
int y = this.location.getBlockY() + 1;
|
||||||
|
int z = this.location.getBlockZ();
|
||||||
|
int otherX = otherLocation.getBlockX();
|
||||||
|
int otherY = otherLocation.getBlockY();
|
||||||
|
int otherZ = otherLocation.getBlockZ();
|
||||||
|
|
||||||
|
return x == otherX
|
||||||
|
&& y == otherY
|
||||||
|
&& z == otherZ;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void capture(Player capturer) {
|
||||||
|
this.capturer = capturer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isCaptured() {
|
||||||
|
return this.capturer != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void uncapture() {
|
||||||
|
this.capturer = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Location getLocation() {
|
||||||
|
return this.location;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return this.name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLocation(Location location) {
|
||||||
|
Block locationBlock = this.warzone.getWorld().getBlockAt(location.getBlockX(), location.getBlockY(), location.getBlockZ());
|
||||||
|
this.volume.setCornerOne(locationBlock.getRelative(BlockFace.DOWN).getRelative(BlockFace.EAST, 1).getRelative(BlockFace.SOUTH, 1));
|
||||||
|
this.volume.setCornerTwo(locationBlock.getRelative(BlockFace.UP, 2).getRelative(BlockFace.WEST, 1).getRelative(BlockFace.NORTH, 1));
|
||||||
|
this.volume.saveBlocks();
|
||||||
|
this.location = location;
|
||||||
|
this.addCakeBlocks();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Volume getVolume() {
|
||||||
|
return this.volume;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setVolume(Volume newVolume) {
|
||||||
|
this.volume = newVolume;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -26,8 +26,6 @@ public class Monument {
|
|||||||
this.warzone = warzone;
|
this.warzone = warzone;
|
||||||
this.volume = new Volume(name, warzone.getWorld());
|
this.volume = new Volume(name, warzone.getWorld());
|
||||||
this.setLocation(location);
|
this.setLocation(location);
|
||||||
|
|
||||||
this.addMonumentBlocks();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addMonumentBlocks() {
|
public void addMonumentBlocks() {
|
||||||
@ -54,7 +52,6 @@ public class Monument {
|
|||||||
this.warzone.getWorld().getBlockAt(x - 1, y - 1, z - 1).setType(Material.OBSIDIAN);
|
this.warzone.getWorld().getBlockAt(x - 1, y - 1, z - 1).setType(Material.OBSIDIAN);
|
||||||
|
|
||||||
// outer ring
|
// outer ring
|
||||||
|
|
||||||
this.warzone.getWorld().getBlockAt(x + 2, y - 1, z + 2).setType(Material.GLOWSTONE);
|
this.warzone.getWorld().getBlockAt(x + 2, y - 1, z + 2).setType(Material.GLOWSTONE);
|
||||||
this.warzone.getWorld().getBlockAt(x + 2, y - 1, z + 1).setType(Material.OBSIDIAN);
|
this.warzone.getWorld().getBlockAt(x + 2, y - 1, z + 1).setType(Material.OBSIDIAN);
|
||||||
this.warzone.getWorld().getBlockAt(x + 2, y - 1, z).setType(Material.OBSIDIAN);
|
this.warzone.getWorld().getBlockAt(x + 2, y - 1, z).setType(Material.OBSIDIAN);
|
||||||
@ -144,6 +141,7 @@ public class Monument {
|
|||||||
this.volume.setCornerTwo(locationBlock.getRelative(BlockFace.UP, 2).getRelative(BlockFace.WEST, 2).getRelative(BlockFace.NORTH, 2));
|
this.volume.setCornerTwo(locationBlock.getRelative(BlockFace.UP, 2).getRelative(BlockFace.WEST, 2).getRelative(BlockFace.NORTH, 2));
|
||||||
this.volume.saveBlocks();
|
this.volume.saveBlocks();
|
||||||
this.location = location;
|
this.location = location;
|
||||||
|
|
||||||
this.addMonumentBlocks();
|
this.addMonumentBlocks();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,6 +5,7 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
|
||||||
|
import org.bukkit.ChatColor;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.block.Block;
|
import org.bukkit.block.Block;
|
||||||
@ -395,8 +396,40 @@ public class Team {
|
|||||||
}
|
}
|
||||||
if (thePlayer != null) {
|
if (thePlayer != null) {
|
||||||
this.players.remove(thePlayer);
|
this.players.remove(thePlayer);
|
||||||
|
|
||||||
|
if (this.warzone.isFlagThief(thePlayer.getName())) {
|
||||||
|
Team victim = this.warzone.getVictimTeamForFlagThief(thePlayer.getName());
|
||||||
|
victim.getFlagVolume().resetBlocks();
|
||||||
|
victim.initializeTeamFlag();
|
||||||
|
this.warzone.removeFlagThief(thePlayer.getName());
|
||||||
|
for (Team t : this.warzone.getTeams()) {
|
||||||
|
t.teamcast("Team " + ChatColor.GREEN + victim.getName() + ChatColor.WHITE + " flag was returned.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.warzone.isBombThief(thePlayer.getName())) {
|
||||||
|
Bomb bomb = this.warzone.getBombForThief(thePlayer.getName());
|
||||||
|
bomb.getVolume().resetBlocks();
|
||||||
|
bomb.addBombBlocks();
|
||||||
|
this.warzone.removeBombThief(thePlayer.getName());
|
||||||
|
for (Team t : this.warzone.getTeams()) {
|
||||||
|
t.teamcast("Bomb " + ChatColor.GREEN + bomb.getName() + ChatColor.WHITE + " was returned.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.warzone.isCakeThief(thePlayer.getName())) {
|
||||||
|
Cake cake = this.warzone.getCakeForThief(thePlayer.getName());
|
||||||
|
cake.getVolume().resetBlocks();
|
||||||
|
cake.addCakeBlocks();
|
||||||
|
this.warzone.removeCakeThief(thePlayer.getName());
|
||||||
|
for (Team t : this.warzone.getTeams()) {
|
||||||
|
t.teamcast("Cake " + ChatColor.GREEN + cake.getName() + ChatColor.WHITE + " was returned.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,6 +51,8 @@ public class Warzone {
|
|||||||
private World world;
|
private World world;
|
||||||
private final List<Team> teams = new ArrayList<Team>();
|
private final List<Team> teams = new ArrayList<Team>();
|
||||||
private final List<Monument> monuments = new ArrayList<Monument>();
|
private final List<Monument> monuments = new ArrayList<Monument>();
|
||||||
|
private final List<Bomb> bombs = new ArrayList<Bomb>();
|
||||||
|
private final List<Cake> cakes = new ArrayList<Cake>();
|
||||||
private Location teleport;
|
private Location teleport;
|
||||||
private ZoneLobby lobby;
|
private ZoneLobby lobby;
|
||||||
private Location rallyPoint;
|
private Location rallyPoint;
|
||||||
@ -61,6 +63,8 @@ public class Warzone {
|
|||||||
private List<ZoneWallGuard> zoneWallGuards = new ArrayList<ZoneWallGuard>();
|
private List<ZoneWallGuard> zoneWallGuards = new ArrayList<ZoneWallGuard>();
|
||||||
private HashMap<String, PlayerState> playerStates = new HashMap<String, PlayerState>();
|
private HashMap<String, PlayerState> playerStates = new HashMap<String, PlayerState>();
|
||||||
private HashMap<String, Team> flagThieves = new HashMap<String, Team>();
|
private HashMap<String, Team> flagThieves = new HashMap<String, Team>();
|
||||||
|
private HashMap<String, Bomb> bombThieves = new HashMap<String, Bomb>();
|
||||||
|
private HashMap<String, Cake> cakeThieves = new HashMap<String, Cake>();
|
||||||
private HashMap<String, LoadoutSelection> loadoutSelections = new HashMap<String, LoadoutSelection>();
|
private HashMap<String, LoadoutSelection> loadoutSelections = new HashMap<String, LoadoutSelection>();
|
||||||
private HashMap<String, PlayerState> deadMenInventories = new HashMap<String, PlayerState>();
|
private HashMap<String, PlayerState> deadMenInventories = new HashMap<String, PlayerState>();
|
||||||
private final List<Player> respawn = new ArrayList<Player>();
|
private final List<Player> respawn = new ArrayList<Player>();
|
||||||
@ -248,6 +252,18 @@ public class Warzone {
|
|||||||
monument.addMonumentBlocks();
|
monument.addMonumentBlocks();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// reset bombs
|
||||||
|
for (Bomb bomb : this.bombs) {
|
||||||
|
bomb.getVolume().resetBlocks();
|
||||||
|
bomb.addBombBlocks();
|
||||||
|
}
|
||||||
|
|
||||||
|
// reset cakes
|
||||||
|
for (Cake cake : this.cakes) {
|
||||||
|
cake.getVolume().resetBlocks();
|
||||||
|
cake.addCakeBlocks();
|
||||||
|
}
|
||||||
|
|
||||||
// reset lobby (here be demons)
|
// reset lobby (here be demons)
|
||||||
if (this.lobby != null) {
|
if (this.lobby != null) {
|
||||||
this.lobby.initialize();
|
this.lobby.initialize();
|
||||||
@ -498,7 +514,7 @@ public class Warzone {
|
|||||||
|
|
||||||
public boolean hasMonument(String monumentName) {
|
public boolean hasMonument(String monumentName) {
|
||||||
for (Monument monument : this.monuments) {
|
for (Monument monument : this.monuments) {
|
||||||
if (monument.getName().equals(monumentName)) {
|
if (monument.getName().startsWith(monumentName)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -514,6 +530,42 @@ public class Warzone {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean hasBomb(String bombName) {
|
||||||
|
for (Bomb bomb : this.bombs) {
|
||||||
|
if (bomb.getName().equals(bombName)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bomb getBomb(String bombName) {
|
||||||
|
for (Bomb bomb : this.bombs) {
|
||||||
|
if (bomb.getName().startsWith(bombName)) {
|
||||||
|
return bomb;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean hasCake(String cakeName) {
|
||||||
|
for (Cake cake : this.cakes) {
|
||||||
|
if (cake.getName().equals(cakeName)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Cake getCake(String cakeName) {
|
||||||
|
for (Cake cake : this.cakes) {
|
||||||
|
if (cake.getName().startsWith(cakeName)) {
|
||||||
|
return cake;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isImportantBlock(Block block) {
|
public boolean isImportantBlock(Block block) {
|
||||||
if (this.ready()) {
|
if (this.ready()) {
|
||||||
for (Monument m : this.monuments) {
|
for (Monument m : this.monuments) {
|
||||||
@ -521,6 +573,16 @@ public class Warzone {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for (Bomb b : this.bombs) {
|
||||||
|
if (b.getVolume().contains(block)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (Cake c : this.cakes) {
|
||||||
|
if (c.getVolume().contains(block)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
for (Team t : this.teams) {
|
for (Team t : this.teams) {
|
||||||
if (t.getSpawnVolume().contains(block)) {
|
if (t.getSpawnVolume().contains(block)) {
|
||||||
return true;
|
return true;
|
||||||
@ -801,10 +863,10 @@ public class Warzone {
|
|||||||
// player died without causing his team's demise
|
// player died without causing his team's demise
|
||||||
if (playerWarzone.isFlagThief(player.getName())) {
|
if (playerWarzone.isFlagThief(player.getName())) {
|
||||||
// died while carrying flag.. dropped it
|
// died while carrying flag.. dropped it
|
||||||
Team victim = playerWarzone.getVictimTeamForThief(player.getName());
|
Team victim = playerWarzone.getVictimTeamForFlagThief(player.getName());
|
||||||
victim.getFlagVolume().resetBlocks();
|
victim.getFlagVolume().resetBlocks();
|
||||||
victim.initializeTeamFlag();
|
victim.initializeTeamFlag();
|
||||||
playerWarzone.removeThief(player.getName());
|
playerWarzone.removeFlagThief(player.getName());
|
||||||
|
|
||||||
if (War.war.isSpoutServer()) {
|
if (War.war.isSpoutServer()) {
|
||||||
for (Player p : victim.getPlayers()) {
|
for (Player p : victim.getPlayers()) {
|
||||||
@ -824,6 +886,59 @@ public class Warzone {
|
|||||||
t.teamcast(player.getName() + " died and dropped team " + victim.getName() + "'s flag.");
|
t.teamcast(player.getName() + " died and dropped team " + victim.getName() + "'s flag.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Bomb thieves
|
||||||
|
if (playerWarzone.isBombThief(player.getName())) {
|
||||||
|
// died while carrying bomb.. dropped it
|
||||||
|
Bomb bomb = playerWarzone.getBombForThief(player.getName());
|
||||||
|
bomb.getVolume().resetBlocks();
|
||||||
|
bomb.addBombBlocks();
|
||||||
|
playerWarzone.removeBombThief(player.getName());
|
||||||
|
|
||||||
|
for (Team t : playerWarzone.getTeams()) {
|
||||||
|
t.teamcast(player.getName() + " died and dropped bomb " + ChatColor.GREEN + bomb.getName() + ChatColor.WHITE + ".");
|
||||||
|
if (War.war.isSpoutServer()) {
|
||||||
|
for (Player p : t.getPlayers()) {
|
||||||
|
SpoutPlayer sp = SpoutManager.getPlayer(p);
|
||||||
|
if (sp.isSpoutCraftEnabled()) {
|
||||||
|
sp.sendNotification(
|
||||||
|
SpoutMessenger.cleanForNotification(playerTeam.getKind().getColor() + player.getName() + ChatColor.YELLOW + " dropped"),
|
||||||
|
SpoutMessenger.cleanForNotification(ChatColor.YELLOW + "bomb " + ChatColor.GREEN + bomb.getName() + ChatColor.YELLOW + "."),
|
||||||
|
Material.TNT,
|
||||||
|
(short)0,
|
||||||
|
5000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (playerWarzone.isCakeThief(player.getName())) {
|
||||||
|
// died while carrying cake.. dropped it
|
||||||
|
Cake cake = playerWarzone.getCakeForThief(player.getName());
|
||||||
|
cake.getVolume().resetBlocks();
|
||||||
|
cake.addCakeBlocks();
|
||||||
|
playerWarzone.removeCakeThief(player.getName());
|
||||||
|
|
||||||
|
for (Team t : playerWarzone.getTeams()) {
|
||||||
|
t.teamcast(player.getName() + " died and dropped cake " + ChatColor.GREEN + cake.getName() + ChatColor.WHITE + ".");
|
||||||
|
if (War.war.isSpoutServer()) {
|
||||||
|
for (Player p : t.getPlayers()) {
|
||||||
|
SpoutPlayer sp = SpoutManager.getPlayer(p);
|
||||||
|
if (sp.isSpoutCraftEnabled()) {
|
||||||
|
sp.sendNotification(
|
||||||
|
SpoutMessenger.cleanForNotification(playerTeam.getKind().getColor() + player.getName() + ChatColor.YELLOW + " dropped"),
|
||||||
|
SpoutMessenger.cleanForNotification(ChatColor.YELLOW + "cake " + ChatColor.GREEN + cake.getName() + ChatColor.YELLOW + "."),
|
||||||
|
Material.CAKE,
|
||||||
|
(short)0,
|
||||||
|
5000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Lifepool empty warning
|
||||||
playerTeam.setRemainingLives(remaining - 1);
|
playerTeam.setRemainingLives(remaining - 1);
|
||||||
if (remaining - 1 == 0) {
|
if (remaining - 1 == 0) {
|
||||||
for (Team t : playerWarzone.getTeams()) {
|
for (Team t : playerWarzone.getTeams()) {
|
||||||
@ -855,15 +970,7 @@ public class Warzone {
|
|||||||
t.teamcast(playerTeam.getKind().getColor() + player.getName() + ChatColor.WHITE + " left the zone.");
|
t.teamcast(playerTeam.getKind().getColor() + player.getName() + ChatColor.WHITE + " left the zone.");
|
||||||
}
|
}
|
||||||
playerTeam.resetSign();
|
playerTeam.resetSign();
|
||||||
if (this.isFlagThief(player.getName())) {
|
|
||||||
Team victim = this.getVictimTeamForThief(player.getName());
|
|
||||||
victim.getFlagVolume().resetBlocks();
|
|
||||||
victim.initializeTeamFlag();
|
|
||||||
this.removeThief(player.getName());
|
|
||||||
for (Team t : this.getTeams()) {
|
|
||||||
t.teamcast("Team " + victim.getName() + " flag was returned.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (this.getLobby() != null) {
|
if (this.getLobby() != null) {
|
||||||
this.getLobby().resetTeamGateSign(playerTeam);
|
this.getLobby().resetTeamGateSign(playerTeam);
|
||||||
}
|
}
|
||||||
@ -934,6 +1041,43 @@ public class Warzone {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isBombBlock(Block block) {
|
||||||
|
for (Bomb bomb : this.bombs) {
|
||||||
|
if (bomb.isBombBlock(block.getLocation())) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bomb getBombForBlock(Block block) {
|
||||||
|
for (Bomb bomb : this.bombs) {
|
||||||
|
if (bomb.isBombBlock(block.getLocation())) {
|
||||||
|
return bomb;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isCakeBlock(Block block) {
|
||||||
|
for (Cake cake : this.cakes) {
|
||||||
|
if (cake.isCakeBlock(block.getLocation())) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Cake getCakeForBlock(Block block) {
|
||||||
|
for (Cake cake : this.cakes) {
|
||||||
|
if (cake.isCakeBlock(block.getLocation())) {
|
||||||
|
return cake;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Flags
|
||||||
public void addFlagThief(Team lostFlagTeam, String flagThief) {
|
public void addFlagThief(Team lostFlagTeam, String flagThief) {
|
||||||
this.flagThieves.put(flagThief, lostFlagTeam);
|
this.flagThieves.put(flagThief, lostFlagTeam);
|
||||||
}
|
}
|
||||||
@ -945,16 +1089,59 @@ public class Warzone {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Team getVictimTeamForThief(String thief) {
|
public Team getVictimTeamForFlagThief(String thief) {
|
||||||
return this.flagThieves.get(thief);
|
return this.flagThieves.get(thief);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removeThief(String thief) {
|
public void removeFlagThief(String thief) {
|
||||||
this.flagThieves.remove(thief);
|
this.flagThieves.remove(thief);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void clearFlagThieves() {
|
// Bomb
|
||||||
|
public void addBombThief(Bomb bomb, String bombThief) {
|
||||||
|
this.bombThieves.put(bombThief, bomb);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isBombThief(String suspect) {
|
||||||
|
if (this.bombThieves.containsKey(suspect)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bomb getBombForThief(String thief) {
|
||||||
|
return this.bombThieves.get(thief);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeBombThief(String thief) {
|
||||||
|
this.bombThieves.remove(thief);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cake
|
||||||
|
|
||||||
|
public void addCakeThief(Cake cake, String cakeThief) {
|
||||||
|
this.cakeThieves.put(cakeThief, cake);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isCakeThief(String suspect) {
|
||||||
|
if (this.cakeThieves.containsKey(suspect)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Cake getCakeForThief(String thief) {
|
||||||
|
return this.cakeThieves.get(thief);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeCakeThief(String thief) {
|
||||||
|
this.cakeThieves.remove(thief);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clearThieves() {
|
||||||
this.flagThieves.clear();
|
this.flagThieves.clear();
|
||||||
|
this.bombThieves.clear();
|
||||||
|
this.cakeThieves.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isTeamFlagStolen(Team team) {
|
public boolean isTeamFlagStolen(Team team) {
|
||||||
@ -1099,4 +1286,12 @@ public class Warzone {
|
|||||||
public InventoryBag getDefaultInventories() {
|
public InventoryBag getDefaultInventories() {
|
||||||
return this.defaultInventories ;
|
return this.defaultInventories ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<Bomb> getBombs() {
|
||||||
|
return bombs;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Cake> getCakes() {
|
||||||
|
return cakes;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,6 +16,8 @@ import org.bukkit.inventory.ItemStack;
|
|||||||
|
|
||||||
import bukkit.tommytony.war.War;
|
import bukkit.tommytony.war.War;
|
||||||
|
|
||||||
|
import com.tommytony.war.Bomb;
|
||||||
|
import com.tommytony.war.Cake;
|
||||||
import com.tommytony.war.Monument;
|
import com.tommytony.war.Monument;
|
||||||
import com.tommytony.war.Team;
|
import com.tommytony.war.Team;
|
||||||
import com.tommytony.war.TeamKind;
|
import com.tommytony.war.TeamKind;
|
||||||
@ -123,6 +125,38 @@ public class WarzoneYmlMapper {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// bombs
|
||||||
|
if (warzoneRootSection.contains(zoneInfoPrefix + "bomb")) {
|
||||||
|
List<String> bombNames = warzoneRootSection.getStringList(zoneInfoPrefix + "bomb.names");
|
||||||
|
for (String bombName : bombNames) {
|
||||||
|
if (bombName != null && !bombName.equals("")) {
|
||||||
|
String bombPrefix = zoneInfoPrefix + "bomb." + bombName + ".";
|
||||||
|
int bombX = warzoneRootSection.getInt(bombPrefix + "x");
|
||||||
|
int bombY = warzoneRootSection.getInt(bombPrefix + "y");
|
||||||
|
int bombZ = warzoneRootSection.getInt(bombPrefix + "z");
|
||||||
|
int bombYaw = warzoneRootSection.getInt(bombPrefix + "yaw");
|
||||||
|
Bomb bomb = new Bomb(bombName, warzone, new Location(world, bombX, bombY, bombZ, bombYaw, 0));
|
||||||
|
warzone.getBombs().add(bomb);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// cakes
|
||||||
|
if (warzoneRootSection.contains(zoneInfoPrefix + "cake")) {
|
||||||
|
List<String> cakeNames = warzoneRootSection.getStringList(zoneInfoPrefix + "cake.names");
|
||||||
|
for (String cakeName : cakeNames) {
|
||||||
|
if (cakeName != null && !cakeName.equals("")) {
|
||||||
|
String cakePrefix = zoneInfoPrefix + "cake." + cakeName + ".";
|
||||||
|
int cakeX = warzoneRootSection.getInt(cakePrefix + "x");
|
||||||
|
int cakeY = warzoneRootSection.getInt(cakePrefix + "y");
|
||||||
|
int cakeZ = warzoneRootSection.getInt(cakePrefix + "z");
|
||||||
|
int cakeYaw = warzoneRootSection.getInt(cakePrefix + "yaw");
|
||||||
|
Cake cake = new Cake(cakeName, warzone, new Location(world, cakeX, cakeY, cakeZ, cakeYaw, 0));
|
||||||
|
warzone.getCakes().add(cake);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// teams (maybe no teams)
|
// teams (maybe no teams)
|
||||||
if (warzoneRootSection.contains("team.names")) {
|
if (warzoneRootSection.contains("team.names")) {
|
||||||
List<String> teamsNames = warzoneRootSection.getStringList("team.names");
|
List<String> teamsNames = warzoneRootSection.getStringList("team.names");
|
||||||
@ -184,6 +218,16 @@ public class WarzoneYmlMapper {
|
|||||||
monument.setVolume(VolumeMapper.loadVolume(monument.getName(), warzone.getName(), world));
|
monument.setVolume(VolumeMapper.loadVolume(monument.getName(), warzone.getName(), world));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// bomb blocks
|
||||||
|
for (Bomb bomb : warzone.getBombs()) {
|
||||||
|
bomb.setVolume(VolumeMapper.loadVolume("bomb-" + bomb.getName(), warzone.getName(), world));
|
||||||
|
}
|
||||||
|
|
||||||
|
// cake blocks
|
||||||
|
for (Cake cake : warzone.getCakes()) {
|
||||||
|
cake.setVolume(VolumeMapper.loadVolume("cake-" + cake.getName(), warzone.getName(), world));
|
||||||
|
}
|
||||||
|
|
||||||
// team spawn blocks
|
// team spawn blocks
|
||||||
for (Team team : warzone.getTeams()) {
|
for (Team team : warzone.getTeams()) {
|
||||||
team.setSpawnVolume(VolumeMapper.loadVolume(team.getName(), warzone.getName(), world));
|
team.setSpawnVolume(VolumeMapper.loadVolume(team.getName(), warzone.getName(), world));
|
||||||
@ -298,6 +342,46 @@ public class WarzoneYmlMapper {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// bombs
|
||||||
|
if (warzone.getMonuments().size() > 0) {
|
||||||
|
ConfigurationSection bombsSection = warzoneInfoSection.createSection("bomb");
|
||||||
|
|
||||||
|
List<String> bombNames = new ArrayList<String>();
|
||||||
|
for (Bomb bomb : warzone.getBombs()) {
|
||||||
|
bombNames.add(bomb.getName());
|
||||||
|
}
|
||||||
|
bombsSection.set("names", bombNames);
|
||||||
|
|
||||||
|
for (Bomb bomb : warzone.getBombs()) {
|
||||||
|
|
||||||
|
ConfigurationSection bombSection = bombsSection.createSection(bomb.getName());
|
||||||
|
bombSection.set("x", bomb.getLocation().getBlockX());
|
||||||
|
bombSection.set("y", bomb.getLocation().getBlockY());
|
||||||
|
bombSection.set("z", bomb.getLocation().getBlockZ());
|
||||||
|
bombSection.set("yaw", toIntYaw(bomb.getLocation().getYaw()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// cakes
|
||||||
|
if (warzone.getMonuments().size() > 0) {
|
||||||
|
ConfigurationSection cakesSection = warzoneInfoSection.createSection("cake");
|
||||||
|
|
||||||
|
List<String> cakeNames = new ArrayList<String>();
|
||||||
|
for (Cake cake : warzone.getCakes()) {
|
||||||
|
cakeNames.add(cake.getName());
|
||||||
|
}
|
||||||
|
cakesSection.set("names", cakeNames);
|
||||||
|
|
||||||
|
for (Cake cake : warzone.getCakes()) {
|
||||||
|
|
||||||
|
ConfigurationSection cakeSection = cakesSection.createSection(cake.getName());
|
||||||
|
cakeSection.set("x", cake.getLocation().getBlockX());
|
||||||
|
cakeSection.set("y", cake.getLocation().getBlockY());
|
||||||
|
cakeSection.set("z", cake.getLocation().getBlockZ());
|
||||||
|
cakeSection.set("yaw", toIntYaw(cake.getLocation().getYaw()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ConfigurationSection teamsSection = warzoneRootSection.createSection("team");
|
ConfigurationSection teamsSection = warzoneRootSection.createSection("team");
|
||||||
|
|
||||||
// teams
|
// teams
|
||||||
@ -372,6 +456,16 @@ public class WarzoneYmlMapper {
|
|||||||
VolumeMapper.save(monument.getVolume(), warzone.getName());
|
VolumeMapper.save(monument.getVolume(), warzone.getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// bomb blocks
|
||||||
|
for (Bomb bomb : warzone.getBombs()) {
|
||||||
|
VolumeMapper.save(bomb.getVolume(), warzone.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
// cake blocks
|
||||||
|
for (Cake cake : warzone.getCakes()) {
|
||||||
|
VolumeMapper.save(cake.getVolume(), warzone.getName());
|
||||||
|
}
|
||||||
|
|
||||||
// team spawn & flag blocks
|
// team spawn & flag blocks
|
||||||
for (Team team : teams) {
|
for (Team team : teams) {
|
||||||
VolumeMapper.save(team.getSpawnVolume(), warzone.getName());
|
VolumeMapper.save(team.getSpawnVolume(), warzone.getName());
|
||||||
|
@ -131,8 +131,8 @@ commands:
|
|||||||
Ex -
|
Ex -
|
||||||
/setteam <diamond/iron/gold/white/orange/magenta/blue/green/pink/gray/purple/navy/brown/darkgreen/red/black>
|
/setteam <diamond/iron/gold/white/orange/magenta/blue/green/pink/gray/purple/navy/brown/darkgreen/red/black>
|
||||||
setmonument:
|
setmonument:
|
||||||
description: War> Creates or moves a monument.
|
description: War> Creates or moves a monument. Monuments can be capture with wool from your team and give your health.
|
||||||
usage: Creates or moves a monument. Must be standing in warzone.
|
usage: Creates or moves a monument. Monuments can be capture with wool from your team and give your health. Must be standing in warzone.
|
||||||
Ex -
|
Ex -
|
||||||
/setmonument <monument-name>
|
/setmonument <monument-name>
|
||||||
setteamflag:
|
setteamflag:
|
||||||
@ -140,6 +140,16 @@ commands:
|
|||||||
usage: Creates/moves a team flag post for CTF. Must be standing in warzone.
|
usage: Creates/moves a team flag post for CTF. Must be standing in warzone.
|
||||||
Ex -
|
Ex -
|
||||||
/setteamflag <team-color>
|
/setteamflag <team-color>
|
||||||
|
setbomb:
|
||||||
|
description: War> Creates or moves a bomb. Get the bomb to the other team's spawn. People from other teams can blow you up.
|
||||||
|
usage: Creates or moves a bomb. Get the bomb to the other team's spawn. People from other teams can blow you up. Must be standing in warzone.
|
||||||
|
Ex -
|
||||||
|
/setbomb <bomb-name>
|
||||||
|
setcake:
|
||||||
|
description: War> Creates or moves a cake. Get the cake to your spawn to score a replenish your lifepool.
|
||||||
|
usage: Creates or moves a bomb. Get the cake to your spawn to score a replenish your lifepool. Must be standing in warzone.
|
||||||
|
Ex -
|
||||||
|
/setcake <cake-name>
|
||||||
resetzone:
|
resetzone:
|
||||||
description: War> Reloads zone blocks from disk. Everyone is teleported back to the lobby.
|
description: War> Reloads zone blocks from disk. Everyone is teleported back to the lobby.
|
||||||
usage: Reloads zone blocks from disk. Everyone is teleported back to the lobby. Provide a zone name if not standing in warzone or lobby.
|
usage: Reloads zone blocks from disk. Everyone is teleported back to the lobby. Provide a zone name if not standing in warzone or lobby.
|
||||||
@ -170,6 +180,16 @@ commands:
|
|||||||
usage: Deletes the monument. Provide a zone name if not standing in warzone or lobby.
|
usage: Deletes the monument. Provide a zone name if not standing in warzone or lobby.
|
||||||
Ex -
|
Ex -
|
||||||
/deletemonument [zone-name] <monument-name>
|
/deletemonument [zone-name] <monument-name>
|
||||||
|
deletebomb:
|
||||||
|
description: War> Deletes the bomb.
|
||||||
|
usage: Deletes the bomb. Provide a zone name if not standing in warzone or lobby.
|
||||||
|
Ex -
|
||||||
|
/deletebomb [zone-name] <bomb-name>
|
||||||
|
deletecake:
|
||||||
|
description: War> Deletes the cake.
|
||||||
|
usage: Deletes the cake. Provide a zone name if not standing in warzone or lobby.
|
||||||
|
Ex -
|
||||||
|
/deletecake [zone-name] <cake-name>
|
||||||
setzoneconfig:
|
setzoneconfig:
|
||||||
description: War> Use named parameters to change the configuration of the warzone. Resets blocks like /nextbattle. Does not save zone blocks like /savezone.
|
description: War> Use named parameters to change the configuration of the warzone. Resets blocks like /nextbattle. Does not save zone blocks like /savezone.
|
||||||
usage: Use named parameters to change the configuration of the warzone. Resets blocks like /nextbattle. Does not save zone blocks like /savezone. Provide a zone name if not standing in warzone or lobby.
|
usage: Use named parameters to change the configuration of the warzone. Resets blocks like /nextbattle. Does not save zone blocks like /savezone. Provide a zone name if not standing in warzone or lobby.
|
||||||
|
@ -131,8 +131,8 @@ commands:
|
|||||||
Ex -
|
Ex -
|
||||||
/setteam <diamond/iron/gold/white/orange/magenta/blue/green/pink/gray/purple/navy/brown/darkgreen/red/black>
|
/setteam <diamond/iron/gold/white/orange/magenta/blue/green/pink/gray/purple/navy/brown/darkgreen/red/black>
|
||||||
setmonument:
|
setmonument:
|
||||||
description: War> Creates or moves a monument.
|
description: War> Creates or moves a monument. Monuments can be capture with wool from your team and give your health.
|
||||||
usage: Creates or moves a monument. Must be standing in warzone.
|
usage: Creates or moves a monument. Monuments can be capture with wool from your team and give your health. Must be standing in warzone.
|
||||||
Ex -
|
Ex -
|
||||||
/setmonument <monument-name>
|
/setmonument <monument-name>
|
||||||
setteamflag:
|
setteamflag:
|
||||||
@ -140,6 +140,16 @@ commands:
|
|||||||
usage: Creates/moves a team flag post for CTF. Must be standing in warzone.
|
usage: Creates/moves a team flag post for CTF. Must be standing in warzone.
|
||||||
Ex -
|
Ex -
|
||||||
/setteamflag <team-color>
|
/setteamflag <team-color>
|
||||||
|
setbomb:
|
||||||
|
description: War> Creates or moves a bomb. Get the bomb to the other team's spawn. People from other teams can blow you up.
|
||||||
|
usage: Creates or moves a bomb. Get the bomb to the other team's spawn. People from other teams can blow you up. Must be standing in warzone.
|
||||||
|
Ex -
|
||||||
|
/setbomb <bomb-name>
|
||||||
|
setcake:
|
||||||
|
description: War> Creates or moves a cake. Get the cake to your spawn to score a replenish your lifepool.
|
||||||
|
usage: Creates or moves a bomb. Get the cake to your spawn to score a replenish your lifepool. Must be standing in warzone.
|
||||||
|
Ex -
|
||||||
|
/setcake <cake-name>
|
||||||
resetzone:
|
resetzone:
|
||||||
description: War> Reloads zone blocks from disk. Everyone is teleported back to the lobby.
|
description: War> Reloads zone blocks from disk. Everyone is teleported back to the lobby.
|
||||||
usage: Reloads zone blocks from disk. Everyone is teleported back to the lobby. Provide a zone name if not standing in warzone or lobby.
|
usage: Reloads zone blocks from disk. Everyone is teleported back to the lobby. Provide a zone name if not standing in warzone or lobby.
|
||||||
@ -170,6 +180,16 @@ commands:
|
|||||||
usage: Deletes the monument. Provide a zone name if not standing in warzone or lobby.
|
usage: Deletes the monument. Provide a zone name if not standing in warzone or lobby.
|
||||||
Ex -
|
Ex -
|
||||||
/deletemonument [zone-name] <monument-name>
|
/deletemonument [zone-name] <monument-name>
|
||||||
|
deletebomb:
|
||||||
|
description: War> Deletes the bomb.
|
||||||
|
usage: Deletes the bomb. Provide a zone name if not standing in warzone or lobby.
|
||||||
|
Ex -
|
||||||
|
/deletebomb [zone-name] <bomb-name>
|
||||||
|
deletecake:
|
||||||
|
description: War> Deletes the cake.
|
||||||
|
usage: Deletes the cake. Provide a zone name if not standing in warzone or lobby.
|
||||||
|
Ex -
|
||||||
|
/deletecake [zone-name] <cake-name>
|
||||||
setzoneconfig:
|
setzoneconfig:
|
||||||
description: War> Use named parameters to change the configuration of the warzone. Resets blocks like /nextbattle. Does not save zone blocks like /savezone.
|
description: War> Use named parameters to change the configuration of the warzone. Resets blocks like /nextbattle. Does not save zone blocks like /savezone.
|
||||||
usage: Use named parameters to change the configuration of the warzone. Resets blocks like /nextbattle. Does not save zone blocks like /savezone. Provide a zone name if not standing in warzone or lobby.
|
usage: Use named parameters to change the configuration of the warzone. Resets blocks like /nextbattle. Does not save zone blocks like /savezone. Provide a zone name if not standing in warzone or lobby.
|
||||||
|
Loading…
Reference in New Issue
Block a user