diff --git a/war/src/main/java/com/tommytony/war/War.java b/war/src/main/java/com/tommytony/war/War.java index 48ec14c..a545287 100644 --- a/war/src/main/java/com/tommytony/war/War.java +++ b/war/src/main/java/com/tommytony/war/War.java @@ -219,6 +219,7 @@ public class War extends JavaPlugin { warzoneDefaultConfig.put(WarzoneConfig.SOUPHEALING, false); warzoneDefaultConfig.put(WarzoneConfig.ALLOWENDER, true); warzoneDefaultConfig.put(WarzoneConfig.RESETBLOCKS, true); + warzoneDefaultConfig.put(WarzoneConfig.CAPTUREPOINTTIME, 15); teamDefaultConfig.put(TeamConfig.FLAGMUSTBEHOME, true); teamDefaultConfig.put(TeamConfig.FLAGPOINTSONLY, false); diff --git a/war/src/main/java/com/tommytony/war/config/WarzoneConfig.java b/war/src/main/java/com/tommytony/war/config/WarzoneConfig.java index 28da365..f1a3687 100644 --- a/war/src/main/java/com/tommytony/war/config/WarzoneConfig.java +++ b/war/src/main/java/com/tommytony/war/config/WarzoneConfig.java @@ -25,7 +25,8 @@ public enum WarzoneConfig { SCOREBOARD (ScoreboardType.class, "Scoreboard type", "Type of scoreboard for this zone (none, points, lifepool, top kills)"), SOUPHEALING (Boolean.class, "Soup healing", "If true, allow players to heal by consuming soup"), ALLOWENDER (Boolean.class, "Allow ender chests", "Ender chests are usually blocked to prevent item duplication"), - RESETBLOCKS (Boolean.class, "Reset blocks", "If true, reset warzone blocks each battle"); + RESETBLOCKS (Boolean.class, "Reset blocks", "If true, reset warzone blocks each battle"), + CAPTUREPOINTTIME (Integer.class, "Cap control time", "Time, in seconds, required to gain control of a capture point"); private final Class configType; diff --git a/war/src/main/java/com/tommytony/war/job/CapturePointTimer.java b/war/src/main/java/com/tommytony/war/job/CapturePointTimer.java index ab0b71b..d416175 100644 --- a/war/src/main/java/com/tommytony/war/job/CapturePointTimer.java +++ b/war/src/main/java/com/tommytony/war/job/CapturePointTimer.java @@ -3,17 +3,16 @@ package com.tommytony.war.job; import com.tommytony.war.Team; import com.tommytony.war.War; import com.tommytony.war.Warzone; +import com.tommytony.war.config.TeamConfig; import com.tommytony.war.structure.CapturePoint; import org.bukkit.ChatColor; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; public class CapturePointTimer extends BukkitRunnable { - private static int iteration = 0; @Override public void run() { - iteration += 1; if (!War.war.isLoaded()) { return; } @@ -42,13 +41,34 @@ public class CapturePointTimer extends BukkitRunnable { } } } + + for (Warzone zone : War.war.getWarzones()) { + for (CapturePoint cp : zone.getCapturePoints()) { + if (cp.getController() != null && cp.getController() != cp.getDefaultController() + && cp.getStrength() == cp.getMaxStrength()) { + int controlTime = cp.getControlTime() + 1; + cp.setControlTime(controlTime); + if (controlTime % cp.getMaxStrength() == 0) { + // give points for every control time which is a multiple of the time taken to capture + Team team = zone.getTeamByKind(cp.getController()); + team.addPoint(); + zone.broadcast("zone.capturepoint.addpoint", + cp.getController().getFormattedName(), cp.getName()); + // Detect win conditions + if (team.getPoints() >= team.getTeamConfig().resolveInt(TeamConfig.MAXSCORE)) { + zone.handleScoreCapReached(team.getName()); + } else { + // just added a point + team.resetSign(); + zone.getLobby().resetTeamGateSign(team); + } + } + } + } + } } private static void decrementStrength(CapturePoint cp, Player player, Warzone zone, Team team) { - if (iteration % 5 != 0) { - return; - } - int strength = cp.getStrength(); if (strength < 1) { // strength is already at minimum, ensure attributes are wiped @@ -58,38 +78,40 @@ public class CapturePointTimer extends BukkitRunnable { } strength -= 1; if (strength == 0) { - zone.broadcast("Team {0} has lost control of capture point {1}.", cp.getController().getFormattedName(), - cp.getName()); + if (cp.antiChatSpam()) { + zone.broadcast("zone.capturepoint.lose", cp.getController().getFormattedName(), cp.getName()); + } + cp.setControlTime(0); cp.setController(null); - } else if (strength == 3) { - zone.broadcast("Capture point {0} is being contested by {1}!", cp.getName(), - team.getKind().getColor() + player.getName() + ChatColor.WHITE); + } else if (strength == cp.getMaxStrength() - 1) { + if (cp.antiChatSpam()) { + zone.broadcast("zone.capturepoint.contest", cp.getName(), + team.getKind().getColor() + player.getName() + ChatColor.WHITE); + } } cp.setStrength(strength); } private static void incrementStrength(CapturePoint cp, Player player, Warzone zone, Team team) { - if (iteration % 5 != 0) { - return; - } - int strength = cp.getStrength(); - if (strength > 4) { - // cap strength at 4 - cp.setStrength(4); + if (strength > cp.getMaxStrength()) { + // cap strength at CapturePoint.MAX_STRENGTH + cp.setStrength(cp.getMaxStrength()); return; - } else if (strength == 4) { + } else if (strength == cp.getMaxStrength()) { // do nothing return; } strength += 1; - if (strength == 4) { - zone.broadcast("Team {0} has captured point {1}, gaining 1 extra point.", - cp.getController().getFormattedName(), cp.getName()); + if (strength == cp.getMaxStrength()) { + if (cp.antiChatSpam()) { + zone.broadcast("zone.capturepoint.capture", cp.getController().getFormattedName(), cp.getName()); + } team.addPoint(); } else if (strength == 1) { - zone.broadcast("Team {0} is gaining control of point {1}!", - team.getKind().getFormattedName(), cp.getName()); + if (cp.antiChatSpam()) { + zone.broadcast("zone.capturepoint.fortify", team.getKind().getFormattedName(), cp.getName()); + } cp.setController(team.getKind()); } cp.setStrength(strength); diff --git a/war/src/main/java/com/tommytony/war/mapper/WarzoneYmlMapper.java b/war/src/main/java/com/tommytony/war/mapper/WarzoneYmlMapper.java index 3ad9e2e..7158447 100644 --- a/war/src/main/java/com/tommytony/war/mapper/WarzoneYmlMapper.java +++ b/war/src/main/java/com/tommytony/war/mapper/WarzoneYmlMapper.java @@ -10,6 +10,7 @@ import java.util.List; import java.util.Map; import java.util.logging.Level; +import com.tommytony.war.config.WarzoneConfig; import com.tommytony.war.structure.*; import org.bukkit.Location; import org.bukkit.World; @@ -161,7 +162,7 @@ public class WarzoneYmlMapper { int strength = 0; if (warzoneRootSection.contains(cpPrefix + "controller")) { controller = TeamKind.teamKindFromString(warzoneRootSection.getString(cpPrefix + "controller")); - strength = 4; + strength = warzone.getWarzoneConfig().getInt(WarzoneConfig.CAPTUREPOINTTIME); } CapturePoint cp = new CapturePoint(cpName, new Location(world, cpX, cpY, cpZ, cpYaw, 0), controller, strength, warzone); warzone.getCapturePoints().add(cp); diff --git a/war/src/main/java/com/tommytony/war/structure/CapturePoint.java b/war/src/main/java/com/tommytony/war/structure/CapturePoint.java index cafbf35..d2f845a 100644 --- a/war/src/main/java/com/tommytony/war/structure/CapturePoint.java +++ b/war/src/main/java/com/tommytony/war/structure/CapturePoint.java @@ -2,6 +2,7 @@ package com.tommytony.war.structure; import com.tommytony.war.Warzone; import com.tommytony.war.config.TeamKind; +import com.tommytony.war.config.WarzoneConfig; import com.tommytony.war.volume.Volume; import org.apache.commons.lang.Validate; import org.bukkit.Location; @@ -47,7 +48,7 @@ public class CapturePoint { private Volume volume; private Location location; private TeamKind controller, defaultController; - private int strength; + private int strength, controlTime; private Warzone warzone; public CapturePoint(String name, Location location, TeamKind defaultController, int strength, Warzone warzone) { @@ -55,6 +56,7 @@ public class CapturePoint { this.defaultController = defaultController; this.controller = defaultController; this.strength = strength; + this.controlTime = 0; this.warzone = warzone; this.volume = new Volume("cp-" + name, warzone.getWorld()); this.setLocation(location); @@ -64,7 +66,7 @@ public class CapturePoint { return location.clone().subtract(1, 1, 1).getBlock().getLocation(); } - public void updateBlocks() { + private void updateBlocks() { Validate.notNull(location); // Set origin to back left corner Location origin = this.getOrigin(); @@ -99,7 +101,8 @@ public class CapturePoint { // Add flag block if (strength > 0 && controller != null) { // Make flag point direction of player when setting the capture point - Vector dir = new Vector(1 + -Math.round(Math.sin(Math.toRadians(location.getYaw()))), strength, + int flagHeight = (int) (strength / (getMaxStrength() / 4.0)); + Vector dir = new Vector(1 + -Math.round(Math.sin(Math.toRadians(location.getYaw()))), flagHeight, 1 + Math.round(Math.cos(Math.toRadians(location.getYaw())))); BlockState state = origin.clone().add(dir).getBlock().getState(); state.setType(controller.getMaterial()); @@ -145,10 +148,19 @@ public class CapturePoint { } public void setStrength(int strength) { + Validate.isTrue(strength <= getMaxStrength()); this.strength = strength; this.updateBlocks(); } + public int getControlTime() { + return controlTime; + } + + public void setControlTime(int controlTime) { + this.controlTime = controlTime; + } + public Volume getVolume() { return volume; } @@ -166,4 +178,18 @@ public class CapturePoint { } this.updateBlocks(); } + + private long lastMessage = 0; + public boolean antiChatSpam() { + long now = System.currentTimeMillis(); + if (now - lastMessage > 3000) { + lastMessage = now; + return true; + } + return false; + } + + public int getMaxStrength() { + return warzone.getWarzoneConfig().getInt(WarzoneConfig.CAPTUREPOINTTIME); + } } diff --git a/war/src/main/resources/messages.properties b/war/src/main/resources/messages.properties index fd8aaa8..42b39c7 100644 --- a/war/src/main/resources/messages.properties +++ b/war/src/main/resources/messages.properties @@ -91,6 +91,11 @@ zone.battle.resetprogress = Reset progress: {0}%, {1} seconds... zone.battle.resetcomplete = Warzone reset in {0} seconds. A new battle begins. zone.bomb.broadcast = {0} blew up team {1}''s spawn. Team {2} scores one point. zone.cake.broadcast = {0} captured cake {1}. Team {2} scores one point and gets a full lifepool. +zone.capturepoint.addpoint = Team {0} gained one point for maintaining control of capture point {1}. +zone.capturepoint.lose = Team {0} has lost control of capture point {1}. +zone.capturepoint.contest = Capture point {0} is being contested by {1}! +zone.capturepoint.capture = Team {0} has captured point {1}, gaining 1 extra point. +zone.capturepoint.fortify = Team {0} is gaining control of point {1}! zone.flagcapture.broadcast = {0} captured team {1}''s flag. Team {2} scores one point. zone.flagreturn.deadlock = You can't capture the enemy flag until your team's flag is returned. zone.flagreturn.flag = You have to capture the enemy flag at your team's flag. @@ -108,6 +113,7 @@ zone.score.board404 = This warzone has not enabled a scoreboard. zone.score.empty = You can't score until at least one player joins another team. zone.spawn.minplayers = You can''t leave spawn until there''s a minimum of {0} player(s) on at least {1} team(s). zone.spawn.timer = You can''t leave spawn for {0} second(s) after respawning! +zone.spawn.timer.title = Respawn in {0} second(s)... zone.steal.bomb.broadcast = {0} has bomb {1}. zone.steal.bomb.notice = You have bomb {0}. Reach another team''s spawn to score. Don''t get touched by anyone or you''ll blow up! zone.steal.bomb.prevent = Prevent {0} from reaching your spawn with the bomb!