diff --git a/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java b/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java index 90b5af461..4204a9a86 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java @@ -310,6 +310,12 @@ public enum Achievement new String[]{"Launch 5 enemies using Seismic Slam"}, new int[]{1}, AchievementCategory.CHAMPIONS), + + CHAMPIONS_CAPTURES("Sticky Fingers", 2500, + new String[]{"Champions Capture the Flag.Captures"}, + new String[]{"Capture the Enemy Flag 20 times"}, + new int[]{20}, + AchievementCategory.CHAMPIONS), //Paintball SUPER_PAINTBALL_WINS("Paintball King", 600, diff --git a/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java b/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java index 1da09e80f..c31b9b788 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java @@ -61,7 +61,7 @@ public enum AchievementCategory Material.BOOK_AND_QUILL, 0, GameCategory.CLASSICS, "Extra Tools Kit"), CHAMPIONS("Champions", new String[] {"Champions Domination", "Champions TDM", "Champions Capture the Flag"}, - new StatDisplay[] { StatDisplay.WINS, StatDisplay.GAMES_PLAYED, StatDisplay.KILLS, StatDisplay.DEATHS, StatDisplay.GEMS_EARNED }, + new StatDisplay[] { StatDisplay.WINS, StatDisplay.GAMES_PLAYED, StatDisplay.KILLS, StatDisplay.DEATHS, StatDisplay.GEMS_EARNED, new StatDisplay("Flags Captured", "Captures") }, Material.BEACON, 0, GameCategory.CHAMPIONS, "Extra Class Skills"), MASTER_BUILDERS("Master Builders", null, diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/champions/ChampionsCTF.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/champions/ChampionsCTF.java index 4459cb4fa..d13ea51ac 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/champions/ChampionsCTF.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/champions/ChampionsCTF.java @@ -22,6 +22,7 @@ import nautilus.game.arcade.game.games.champions.kits.KitMage; import nautilus.game.arcade.game.games.champions.kits.KitRanger; import nautilus.game.arcade.game.games.common.CaptureTheFlag; import nautilus.game.arcade.kit.Kit; +import nautilus.game.arcade.stats.CapturesStatTracker; import nautilus.game.arcade.stats.ElectrocutionStatTracker; import nautilus.game.arcade.stats.KillReasonStatTracker; import nautilus.game.arcade.stats.SeismicSlamStatTracker; @@ -72,7 +73,8 @@ public class ChampionsCTF extends CaptureTheFlag new KillReasonStatTracker(this, "Backstab", "Assassination", false), new ElectrocutionStatTracker(this), new TheLongestShotStatTracker(this), - new SeismicSlamStatTracker(this) + new SeismicSlamStatTracker(this), + new CapturesStatTracker(this, "Captures") ); } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/common/CaptureTheFlag.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/common/CaptureTheFlag.java index ecf766464..272986c30 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/common/CaptureTheFlag.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/common/CaptureTheFlag.java @@ -250,7 +250,7 @@ public class CaptureTheFlag extends TeamGame @EventHandler public void handleFlagItem(GameStateChangeEvent event) { - if (event.GetState() == GameState.Live) + if (event.GetState() == GameState.Recruit) { getArcadeManager().getPacketHandler().addPacketHandler( _flagItemListener); @@ -357,11 +357,16 @@ public class CaptureTheFlag extends TeamGame _helmets.remove(player); } else if (event.getType() == UpdateType.TICK) + { for (Flag flag : _flags) if (flag.getCarrier() == null) for (Player player : GetPlayers(true)) if (UtilMath.offset(player.getLocation(), flag.getPlacedLocation()) < 1) flag.Pickup(player); + } + else if (event.getType() == UpdateType.SEC) + for (Flag flag : _flags) + flag.UpdateEntity(); else ProgressTime(); } @@ -523,7 +528,7 @@ public class CaptureTheFlag extends TeamGame if (_suddenDeath) { - Scoreboard.Write(C.cDPurple + "Sudden Death"); + Scoreboard.Write(C.cDPurple + C.Bold + "Sudden Death"); } else { @@ -738,7 +743,7 @@ public class CaptureTheFlag extends TeamGame public void DropFlag(PlayerDropItemEvent event) { for (Flag flag : _flags) - if (flag.getRepresentation().getType() == event.getItemDrop().getItemStack().getType()) + if ((flag.getRepresentation().getType() == event.getItemDrop().getItemStack().getType()) || (event.getItemDrop().getItemStack().getType() == Material.COMPASS)) if (flag.getCarrier() != null) if (flag.getCarrier().getName().equals(event.getPlayer().getName())) { @@ -767,8 +772,9 @@ public class CaptureTheFlag extends TeamGame else data.add(new RadarData(f.getCarrier().getLocation(), f.getTeam().GetColor() + "⚑")); } - //data.add(new RadarData(getRedFlag(), C.cRed + "F")); - //data.add(new RadarData(getBlueFlag(), C.cAqua + "F")); + + data.add(new RadarData(_redFlag, C.cRed + "☗")); + data.add(new RadarData(_blueFlag, C.cBlue + "☗")); for (Player player : UtilServer.getPlayers()) UtilRadar.displayRadar(player, data); @@ -789,13 +795,4 @@ public class CaptureTheFlag extends TeamGame } } } - - @EventHandler - public void flagDamage(CustomDamageEvent event) - { - if (event.GetDamageeEntity() != null) - for (Flag f : _flags) - if (f.isFlagEntity(event.GetDamageeEntity())) - event.SetCancelled("Flag Entity"); - } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/common/ctf_data/Flag.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/common/ctf_data/Flag.java index 97d0e7d67..fb510dd03 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/common/ctf_data/Flag.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/common/ctf_data/Flag.java @@ -1,7 +1,6 @@ package nautilus.game.arcade.game.games.common.ctf_data; import mineplex.core.common.util.C; -import mineplex.core.common.util.UtilEnt; import mineplex.core.common.util.UtilFirework; import mineplex.core.common.util.UtilParticle; import mineplex.core.common.util.UtilParticle.ParticleType; @@ -11,21 +10,17 @@ import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilTextBottom; import mineplex.core.common.util.UtilTextMiddle; import mineplex.core.common.util.UtilTime; -import mineplex.core.disguise.disguises.DisguiseArmorStand; -import mineplex.core.disguise.disguises.DisguiseBase; import mineplex.core.hologram.Hologram; import mineplex.core.recharge.Recharge; import nautilus.game.arcade.game.GameTeam; import nautilus.game.arcade.game.games.common.CaptureTheFlag; +import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.FireworkEffect; import org.bukkit.FireworkEffect.Type; import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.entity.Entity; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; @@ -36,7 +31,7 @@ public class Flag { private CaptureTheFlag Host; - private Location _spawn, _current; + private Location _spawn; private GameTeam _team; @@ -52,8 +47,7 @@ public class Flag private String _displayName; - private LivingEntity _flagEntity; - private DisguiseBase _disguise; + private FlagEntity _flagEntity; public Flag (CaptureTheFlag host, Location spawn, GameTeam team) { @@ -77,6 +71,7 @@ public class Flag _name = new Hologram(Host.getArcadeManager().getHologramManager(), spawn, team.GetColor() + team.GetName() + "'s Flag".replace("s's", "s'")); _time = new Hologram(Host.getArcadeManager().getHologramManager(), spawn, ""); + _flagEntity = new FlagEntity(_representation, _spawn, Host.getArcadeManager().GetDisguise()); SpawnFlag(spawn, team.GetColor() == ChatColor.RED, true); } @@ -97,7 +92,7 @@ public class Flag public Location getPlacedLocation() { - return _current; + return _flagEntity.getLocation(); } @@ -111,12 +106,6 @@ public class Flag return _displayName; } - public boolean isFlagEntity(Entity e) - { - if (_flagEntity == null) return false; - return _flagEntity.getEntityId() == e.getEntityId(); - } - private void AnnounceSteal(Player cap, boolean steal) { if (steal) @@ -140,11 +129,13 @@ public class Flag UtilTextMiddle.display("", _team.GetColor() + _team.GetName() + " Flag " + C.cWhite + " has returned to base", 0, 60, 10); } + public void UpdateEntity() + { + _flagEntity.update(); + } + public void Update() { - if (_holding == null && _disguise != null && _flagEntity != null) - Host.getArcadeManager().GetDisguise().updateDisguise(_disguise); - if (_moved) { if (_dropped) @@ -223,14 +214,7 @@ public class Flag public void SpawnFlag(Location loc, boolean red, boolean initial) { if (!initial) Host.CreatureAllowOverride = true; - _current = loc; - _flagEntity = (LivingEntity) Host.getArcadeManager().GetCreature().SpawnEntity(loc, EntityType.CHICKEN); - UtilEnt.Vegetate(_flagEntity); - DisguiseArmorStand disguise = new DisguiseArmorStand(_flagEntity); - disguise.setInvisible(true); - disguise.setHelmet(_representation); - Host.getArcadeManager().GetDisguise().disguise(disguise, UtilServer.getPlayers()); - _disguise = disguise; + _flagEntity.teleport(loc); if (!initial) Host.CreatureAllowOverride = false; if (!_moved) @@ -252,11 +236,9 @@ public class Flag private void DeleteFlag() { - Host.getArcadeManager().GetDisguise().undisguise(_flagEntity); - _disguise = null; - _flagEntity.remove(); - _current = null; - _flagEntity = null; + _flagEntity.despawn(); + _name.stop(); + _time.stop(); } public boolean Pickup(Player player) @@ -273,8 +255,6 @@ public class Flag if (Host.GetTeam(player) != _team) { DeleteFlag(); - _name.stop(); - _time.stop(); Host.SaveInventory(player); @@ -359,6 +339,8 @@ public class Flag Host.ResetInventory(player); AnnounceCapture(player); Host.AddGems(player, 10, "Enemy Flag Captured", true, true); + PlayerCaptureFlagEvent event = new PlayerCaptureFlagEvent(player); + Bukkit.getPluginManager().callEvent(event); Host.AddCapture(Host.GetTeam(player)); _moved = false; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/common/ctf_data/FlagEntity.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/common/ctf_data/FlagEntity.java new file mode 100644 index 000000000..cb01df557 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/common/ctf_data/FlagEntity.java @@ -0,0 +1,113 @@ +package nautilus.game.arcade.game.games.common.ctf_data; + +import mineplex.core.common.util.UtilEnt; +import mineplex.core.common.util.UtilServer; +import mineplex.core.disguise.DisguiseManager; +import mineplex.core.disguise.disguises.DisguiseArmorStand; +import mineplex.minecraft.game.core.damage.CustomDamageEvent; +import nautilus.game.arcade.GameType; +import nautilus.game.arcade.events.GameStateChangeEvent; +import nautilus.game.arcade.game.Game.GameState; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.LivingEntity; +import org.bukkit.event.EventHandler; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.inventory.ItemStack; + +public class FlagEntity implements Listener +{ + private ItemStack _holding; + private Location _loc; + private LivingEntity _entity; + private DisguiseManager _manager; + + public FlagEntity(ItemStack hand, Location loc, DisguiseManager manager) + { + _manager = manager; + _holding = hand; + _loc = loc; + toggle(true); + } + + public Location getLocation() + { + return _loc; + } + + public void spawn() + { + _entity = (LivingEntity) _loc.getWorld().spawnEntity(_loc, EntityType.CHICKEN); + //_entity.teleport(_loc.clone().subtract(0, 1.5, 0)); + UtilEnt.Vegetate(_entity, true); + UtilEnt.ghost(_entity, true, true); + DisguiseArmorStand disguise = new DisguiseArmorStand(_entity); + disguise.setHelmet(_holding); + disguise.setInvisible(true); + _manager.disguise(disguise, UtilServer.getPlayers()); + } + + public void despawn() + { + //_manager.undisguise(_entity); + _entity.remove(); + _entity = null; + } + + public void teleport(Location loc) + { + if (_entity != null) despawn(); + _loc = loc; + spawn(); + } + + public void update() + { + if (_entity != null) + _entity.teleport(_loc); + } + + private void toggle(boolean on) + { + if (on) + Bukkit.getPluginManager().registerEvents(this, _manager.getPlugin()); + else + HandlerList.unregisterAll(this); + } + + @EventHandler + public void onHit(EntityDamageEvent event) + { + if (_entity == null) return; + + if (event.getEntity().getEntityId() == _entity.getEntityId()) + event.setCancelled(true); + } + + @EventHandler + public void onHit(CustomDamageEvent event) + { + if (_entity == null) return; + if (event.GetDamageeEntity() == null) return; + + if (event.GetDamageeEntity().getEntityId() == _entity.getEntityId()) + event.SetCancelled("Flag Entity"); + } + + @EventHandler + public void onEnd(GameStateChangeEvent event) + { + if (event.GetGame().GetType() == GameType.ChampionsCTF) + { + if (event.GetState() == GameState.Dead) + { + toggle(false); + } + } + } + +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/common/ctf_data/PlayerCaptureFlagEvent.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/common/ctf_data/PlayerCaptureFlagEvent.java new file mode 100644 index 000000000..4b44a5cde --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/common/ctf_data/PlayerCaptureFlagEvent.java @@ -0,0 +1,31 @@ +package nautilus.game.arcade.game.games.common.ctf_data; + +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class PlayerCaptureFlagEvent extends Event +{ + private static final HandlerList handlers = new HandlerList(); + private Player _player; + + public PlayerCaptureFlagEvent(Player player) + { + _player = player; + } + + public HandlerList getHandlers() + { + return handlers; + } + + public static HandlerList getHandlerList() + { + return handlers; + } + + public Player GetPlayer() + { + return _player; + } +} diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/stats/CapturesStatTracker.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/stats/CapturesStatTracker.java new file mode 100644 index 000000000..febf08d35 --- /dev/null +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/stats/CapturesStatTracker.java @@ -0,0 +1,29 @@ +package nautilus.game.arcade.stats; + +import nautilus.game.arcade.game.games.common.CaptureTheFlag; +import nautilus.game.arcade.game.games.common.ctf_data.PlayerCaptureFlagEvent; + +import org.bukkit.event.EventHandler; + +public class CapturesStatTracker extends StatTracker +{ + private final String _stat; + + public CapturesStatTracker(CaptureTheFlag game, String stat) + { + super(game); + _stat = stat; + } + + @EventHandler + public void onCapture(PlayerCaptureFlagEvent event) + { + addStat(event.GetPlayer(), getStat(), 1, false, false); + } + + public String getStat() + { + return _stat; + } + +}