From e77bee5cd849c966f6d84c4522ef1745a78b8a82 Mon Sep 17 00:00:00 2001 From: Thanos Paravantis Date: Mon, 30 May 2016 12:51:58 +0300 Subject: [PATCH] Implement building champion, remove quick climber and enhance chicken attack Building Champion achievement was implemented as a replacement for quick climber achievement, since quick climber is almost impossible to complete in public games. Build Champion is based on Build Race challenge, and it requires players to place all blocks in their inventory, within 15 seconds. Moreover, chicken minions can now attack players, even if they are stuck in the water. --- .../core/achievement/Achievement.java | 16 +++++--- .../game/games/mineware/BawkBawkBattles.java | 31 +++++--------- .../challenge/type/ChallengeBuildRace.java | 36 +++++++++++++++- .../type/ChallengeKingOfTheLadder.java | 28 +------------ .../tracker/BuildingChampionTracker.java | 41 +++++++++++++++++++ .../mineware/tracker/QuickClimberTracker.java | 41 ------------------- 6 files changed, 97 insertions(+), 96 deletions(-) create mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/tracker/BuildingChampionTracker.java delete mode 100644 Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/tracker/QuickClimberTracker.java diff --git a/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java b/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java index 7b7bed621..39837984f 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java @@ -763,11 +763,17 @@ public enum Achievement new int[] {5}, AchievementCategory.BAWK_BAWK_BATTLES), - BAWK_BAWK_BATTLES_QUICK_CLIMBER("Quick Climber", 500, - new String[]{"Bawk Bawk Battles.QuickClimber"}, - new String[]{C.cGray + "King of the Ladder Challenge", "Climb the ladder without", "getting knocked off by others"}, - new int[] {3}, - AchievementCategory.BAWK_BAWK_BATTLES), +// BAWK_BAWK_BATTLES_QUICK_CLIMBER("Quick Climber", 500, +// new String[]{"Bawk Bawk Battles.QuickClimber"}, +// new String[]{C.cGray + "King of the Ladder Challenge", "Climb the ladder without", "getting knocked off by others"}, +// new int[] {3}, +// AchievementCategory.BAWK_BAWK_BATTLES), + + BAWK_BAWK_BATTLES_BUILDING_CHAMPION("Building Champion", 500, + new String[]{"Bawk Bawk Battles.BuildingChampion"}, + new String[]{C.cGray + "Build Race Challenge", "Place all blocks in your", "inventory within 15 seconds"}, + new int[] {3}, + AchievementCategory.BAWK_BAWK_BATTLES), BAWK_BAWK_BATTLES_BOUNCING_SHADOW("Bouncing Shadow", 500, new String[]{"Bawk Bawk Battles.BouncingShadow"}, diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/BawkBawkBattles.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/BawkBawkBattles.java index 55793d1c7..119191363 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/BawkBawkBattles.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/BawkBawkBattles.java @@ -119,12 +119,12 @@ import nautilus.game.arcade.game.games.mineware.effect.DeathEffectData; import nautilus.game.arcade.game.games.mineware.events.ChallengeEndEvent; import nautilus.game.arcade.game.games.mineware.kit.KitBawksFood; import nautilus.game.arcade.game.games.mineware.tracker.BouncingShadowTracker; +import nautilus.game.arcade.game.games.mineware.tracker.BuildingChampionTracker; import nautilus.game.arcade.game.games.mineware.tracker.DragonKingTracker; import nautilus.game.arcade.game.games.mineware.tracker.EliteArcherTracker; import nautilus.game.arcade.game.games.mineware.tracker.MilkManTracker; import nautilus.game.arcade.game.games.mineware.tracker.PinataMasterTracker; import nautilus.game.arcade.game.games.mineware.tracker.PixelNinjaTracker; -import nautilus.game.arcade.game.games.mineware.tracker.QuickClimberTracker; import nautilus.game.arcade.game.games.mineware.tracker.SurfUpTracker; import nautilus.game.arcade.game.games.mineware.tracker.TagMasterTracker; import nautilus.game.arcade.game.games.mineware.tracker.VeteranTracker; @@ -189,7 +189,6 @@ public class BawkBawkBattles extends TeamGame implements IThrown /* * Changes * - Refactoring - * - Improve Zombie Infection * - Improve Scoreboard * * Bugs @@ -198,13 +197,10 @@ public class BawkBawkBattles extends TeamGame implements IThrown * - Some players spawn into the void on Lava Run * - // Zombie Infection can disguise spectators as Zombies * - // Egg smash dragon eggs stay on the map - * - Chicken Attack chickens are getting stuck in water * - // "Next challenge will begin shortly" message also displays on players in chicken island - * - 918 null pointer exception * - Array index out of bounds during challenge rotation * - Achievement for not getting hit in king of the ladder is impossible in public games * - Players sometimes gain a life when dying (not confirmed) - * - Block lobbers needs a slightly bigger platform * - // Spectators being teleported over and over to the same location in certain games (no knockback aura around the game area) * - No suitable challenge was found ends the game, does not give exp * - Chicken platform needs water reducing (add lilipads?) @@ -265,12 +261,12 @@ public class BawkBawkBattles extends TeamGame implements IThrown registerStatTrackers( new BouncingShadowTracker(this), + new BuildingChampionTracker(this), new DragonKingTracker(this), new EliteArcherTracker(this), new MilkManTracker(this), new PinataMasterTracker(this), new PixelNinjaTracker(this), - new QuickClimberTracker(this), new SurfUpTracker(this), new TagMasterTracker(this), new VeteranTracker(this)); @@ -1098,24 +1094,16 @@ public class BawkBawkBattles extends TeamGame implements IThrown for (Player player : _chickenTeam.GetPlayers(true)) { Chicken chicken = UtilMath.randomElement(_chickenAttack.getChickens()); + Material feetType = chicken.getLocation().getBlock().getType(); - if (!chicken.isOnGround()) + if (!chicken.isOnGround() && feetType != Material.STATIONARY_WATER && feetType != Material.WATER) + { return; + } UtilEnt.CreatureLook(chicken, player); - UtilAction.velocity(chicken, UtilAlg.getTrajectory(chicken, player).multiply(1.5D).setY(0.3D)); - - Manager.GetProjectile().AddThrow( - chicken, - null, - this, - -1, - true, - false, - false, - true, - 0.8F); + Manager.GetProjectile().AddThrow(chicken, null, this, -1, true, false, false, true, 0.8F); } } @@ -1130,9 +1118,10 @@ public class BawkBawkBattles extends TeamGame implements IThrown for (Chicken chicken : _chickenAttack.getChickens()) { - Block below = chicken.getLocation().getBlock().getRelative(BlockFace.DOWN); // Detect when falling into the void. + Material feetType = chicken.getLocation().getBlock().getType(); + Block below = chicken.getLocation().getBlock().getRelative(BlockFace.DOWN); - if (!chicken.isOnGround() && !below.isEmpty()) + if (!chicken.isOnGround() && feetType != Material.STATIONARY_WATER && feetType != Material.WATER && !below.isEmpty()) { UtilParticle.PlayParticle(ParticleType.FLAME, chicken.getLocation(), 0.1F, 0.1F, 0.1F, 0.02F, 1, ViewDist.NORMAL); } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/challenge/type/ChallengeBuildRace.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/challenge/type/ChallengeBuildRace.java index 926070b07..a80c90630 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/challenge/type/ChallengeBuildRace.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/challenge/type/ChallengeBuildRace.java @@ -3,6 +3,7 @@ package nautilus.game.arcade.game.games.mineware.challenge.type; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.List; import org.bukkit.Effect; import org.bukkit.Location; @@ -12,6 +13,7 @@ import org.bukkit.block.BlockFace; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.ItemStack; import mineplex.core.common.util.C; @@ -24,12 +26,15 @@ import mineplex.core.common.util.UtilTextMiddle; import nautilus.game.arcade.game.games.mineware.BawkBawkBattles; import nautilus.game.arcade.game.games.mineware.challenge.Challenge; import nautilus.game.arcade.game.games.mineware.challenge.ChallengeType; +import nautilus.game.arcade.game.games.mineware.challenge.LogicTracker; /** * A challenge based on fast block placement. */ -public class ChallengeBuildRace extends Challenge +public class ChallengeBuildRace extends Challenge implements LogicTracker { + private List _speedTracker = new ArrayList<>(); + // The amount of blocks for every hotbar slot. private int _inventoryBlockAmount = 5; @@ -92,7 +97,7 @@ public class ChallengeBuildRace extends Challenge Host.BlockPlaceAllow.add(allowed.getId()); } - for (Player player : Host.GetPlayers(true)) + for (Player player : getPlayersAlive()) { setupInventoryContents(player); } @@ -177,11 +182,32 @@ public class ChallengeBuildRace extends Challenge { if (items.get(0).getAmount() == 1) { + trackSpeed(player); setCompleted(player); } } } + @EventHandler + public void onPlayerQuit(PlayerQuitEvent event) + { + if (!isChallengeValid()) + return; + + _speedTracker.remove(event.getPlayer()); + } + + private void trackSpeed(Player player) + { + long startTime = Settings.getStartTime(); + long finishTime = System.currentTimeMillis(); + + if (finishTime <= startTime + 15000) + { + _speedTracker.add(player); + } + } + private void setupInventoryContents(Player player) { ArrayList shuffledMaterials = new ArrayList(Arrays.asList(_materials)); @@ -201,4 +227,10 @@ public class ChallengeBuildRace extends Challenge block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, block.getTypeId()); block.setType(Material.AIR); } + + @Override + public boolean hasData(Player player) + { + return _speedTracker.contains(player); + } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/challenge/type/ChallengeKingOfTheLadder.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/challenge/type/ChallengeKingOfTheLadder.java index fe15a3cb6..acffd8026 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/challenge/type/ChallengeKingOfTheLadder.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/challenge/type/ChallengeKingOfTheLadder.java @@ -1,7 +1,6 @@ package nautilus.game.arcade.game.games.mineware.challenge.type; import java.util.ArrayList; -import java.util.List; import org.bukkit.Effect; import org.bukkit.Location; @@ -12,7 +11,6 @@ import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; -import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; @@ -25,14 +23,12 @@ import mineplex.minecraft.game.core.damage.CustomDamageEvent; import nautilus.game.arcade.game.games.mineware.BawkBawkBattles; import nautilus.game.arcade.game.games.mineware.challenge.Challenge; import nautilus.game.arcade.game.games.mineware.challenge.ChallengeType; -import nautilus.game.arcade.game.games.mineware.challenge.LogicTracker; /** * A challenge based on climbling ladders. */ -public class ChallengeKingOfTheLadder extends Challenge implements LogicTracker +public class ChallengeKingOfTheLadder extends Challenge { - private List _hitTracker = new ArrayList<>(); private Location _winCornerA; private Location _winCornerB; @@ -211,13 +207,6 @@ public class ChallengeKingOfTheLadder extends Challenge implements LogicTracker { event.SetCancelled("Fall damage"); } - - Player damagee = event.GetDamageePlayer(); - - if (!_hitTracker.contains(damagee)) - { - _hitTracker.add(damagee); - } } @EventHandler @@ -231,19 +220,4 @@ public class ChallengeKingOfTheLadder extends Challenge implements LogicTracker } } } - - @EventHandler - public void onPlayerQuit(PlayerQuitEvent event) - { - if (!isChallengeValid()) - return; - - _hitTracker.remove(event.getPlayer()); - } - - @Override - public boolean hasData(Player player) - { - return !_hitTracker.contains(player); - } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/tracker/BuildingChampionTracker.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/tracker/BuildingChampionTracker.java new file mode 100644 index 000000000..f35ecd68d --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/tracker/BuildingChampionTracker.java @@ -0,0 +1,41 @@ +package nautilus.game.arcade.game.games.mineware.tracker; + +import org.bukkit.entity.Player; + +import nautilus.game.arcade.game.Game; +import nautilus.game.arcade.game.games.mineware.challenge.Challenge; +import nautilus.game.arcade.game.games.mineware.challenge.type.ChallengeBuildRace; + +/** + * A tracker for the Building Champion achievement. + *
+ *
+ * Challenge: Build Race + *
+ * Goal: Place all blocks in your inventory within 15 seconds + */ +public class BuildingChampionTracker extends ChallengeStatTracker +{ + public BuildingChampionTracker(Game game) + { + super(game); + } + + @Override + protected void track(Challenge challenge) + { + if (challenge instanceof ChallengeBuildRace) + { + ChallengeBuildRace buildRace = (ChallengeBuildRace) challenge; + + for (Player player : getGame().GetPlayers(true)) + { + if (buildRace.hasData(player) && buildRace.getData().isDone(player)) + { + System.out.println("Building Champion: " + player.getName()); + addStat(player, "BuildingChampion", 1, false, false); + } + } + } + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/tracker/QuickClimberTracker.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/tracker/QuickClimberTracker.java deleted file mode 100644 index 711fe24e3..000000000 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/mineware/tracker/QuickClimberTracker.java +++ /dev/null @@ -1,41 +0,0 @@ -package nautilus.game.arcade.game.games.mineware.tracker; - -import org.bukkit.entity.Player; - -import nautilus.game.arcade.game.Game; -import nautilus.game.arcade.game.games.mineware.challenge.Challenge; -import nautilus.game.arcade.game.games.mineware.challenge.type.ChallengeKingOfTheLadder; - -/** - * A tracker for the Quick Climber achievement. - *
- *
- * Challenge: King of the Ladder - *
- * Goal: Climb the ladder without getting knocked off by others - */ -public class QuickClimberTracker extends ChallengeStatTracker -{ - public QuickClimberTracker(Game game) - { - super(game); - } - - @Override - protected void track(Challenge challenge) - { - if (challenge instanceof ChallengeKingOfTheLadder) - { - ChallengeKingOfTheLadder kotl = (ChallengeKingOfTheLadder) challenge; - - for (Player player : getGame().GetPlayers(true)) - { - if (kotl.hasData(player) && kotl.getData().isDone(player)) - { - System.out.println("Quick Climber: " + player.getName()); - addStat(player, "QuickClimber", 1, false, false); - } - } - } - } -}