diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/hideseek/HideSeek.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/hideseek/HideSeek.java index acba842a1..0eea12d3a 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/hideseek/HideSeek.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/hideseek/HideSeek.java @@ -112,100 +112,100 @@ import java.util.Map.Entry; @SuppressWarnings("deprecation") public class HideSeek extends TeamGame { - public static class MeowEvent extends PlayerEvent - { - private static final HandlerList handlers = new HandlerList(); + public static class MeowEvent extends PlayerEvent + { + private static final HandlerList handlers = new HandlerList(); - public static HandlerList getHandlerList() - { - return handlers; - } + public static HandlerList getHandlerList() + { + return handlers; + } - @Override - public HandlerList getHandlers() - { - return getHandlerList(); - } + @Override + public HandlerList getHandlers() + { + return getHandlerList(); + } - public MeowEvent(Player who) - { - super(who); - } - } + public MeowEvent(Player who) + { + super(who); + } + } - public static class PlayerChangeFormEvent extends PlayerEvent - { - private static final HandlerList handlers = new HandlerList(); + public static class PlayerChangeFormEvent extends PlayerEvent + { + private static final HandlerList handlers = new HandlerList(); - public static HandlerList getHandlerList() - { - return handlers; - } + public static HandlerList getHandlerList() + { + return handlers; + } - @Override - public HandlerList getHandlers() - { - return getHandlerList(); - } + @Override + public HandlerList getHandlers() + { + return getHandlerList(); + } - private final Form _form; + private final Form _form; - public PlayerChangeFormEvent(Player who, Form form) - { - super(who); + public PlayerChangeFormEvent(Player who, Form form) + { + super(who); - _form = form; - } + _form = form; + } - public Form getForm() - { - return _form; - } - } + public Form getForm() + { + return _form; + } + } - public static class PlayerSolidifyEvent extends PlayerEvent - { - private static final HandlerList handlers = new HandlerList(); + public static class PlayerSolidifyEvent extends PlayerEvent + { + private static final HandlerList handlers = new HandlerList(); - public static HandlerList getHandlerList() - { - return handlers; - } + public static HandlerList getHandlerList() + { + return handlers; + } - @Override - public HandlerList getHandlers() - { - return getHandlerList(); - } + @Override + public HandlerList getHandlers() + { + return getHandlerList(); + } - public PlayerSolidifyEvent(Player who) - { - super(who); - } - } + public PlayerSolidifyEvent(Player who) + { + super(who); + } + } - private GameTeam _hiders; - private GameTeam _seekers; + private GameTeam _hiders; + private GameTeam _seekers; - private long _hideTime = 20000; - private long _gameTime = 360000; - - private boolean _bowGiven = false; - private long _bowGiveTime = 0; - - private boolean _started = false; + private long _hideTime = 20000; + private long _gameTime = 360000; - private HashMap _arrowHits = new HashMap(); + private boolean _bowGiven = false; + private long _bowGiveTime = 0; - private HashMap _forms = new HashMap(); - private HashMap _infested = new HashMap(); - private HashSet _infestDeny = new HashSet(); + private boolean _started = false; - private HashMap _mobs = new HashMap(); + private HashMap _arrowHits = new HashMap(); + + private HashMap _forms = new HashMap(); + private HashMap _infested = new HashMap(); + private HashSet _infestDeny = new HashSet(); + + private HashMap _mobs = new HashMap(); + + private ArrayList _allowedBlocks; + private ArrayList _allowedEnts; - private ArrayList _allowedBlocks; - private ArrayList _allowedEnts; - private IPacketHandler _useEntity = new IPacketHandler() { @Override @@ -265,8 +265,7 @@ public class HideSeek extends TeamGame break; } - } - else if (packetInfo.getPacket() instanceof PacketPlayOutEntityDestroy) + } else if (packetInfo.getPacket() instanceof PacketPlayOutEntityDestroy) { for (int i : ((PacketPlayOutEntityDestroy) packetInfo.getPacket()).a) { @@ -281,9 +280,9 @@ public class HideSeek extends TeamGame continue; UtilPlayer.sendPacket(packetInfo.getPlayer(), new PacketPlayOutEntityDestroy(new int[] - { - blockForm.getBlockId() - })); + { + blockForm.getBlockId() + })); } } } @@ -291,856 +290,846 @@ public class HideSeek extends TeamGame }; public HideSeek(ArcadeManager manager) - { - this(manager, - new Kit[] - { - new KitHiderQuick(manager), new KitHiderSwapper(manager), new KitHiderInfestor(manager), - new KitHiderShocker(manager), new NullKit(manager), new KitSeekerLeaper(manager), - new KitSeekerTNT(manager), new KitSeekerRadar(manager), - }); - } - - public HideSeek(ArcadeManager manager, Kit[] kits) - { - super(manager, GameType.HideSeek, kits, + { + this(manager, + new Kit[] + { + new KitHiderQuick(manager), new KitHiderSwapper(manager), new KitHiderInfestor(manager), + new KitHiderShocker(manager), new NullKit(manager), new KitSeekerLeaper(manager), + new KitSeekerTNT(manager), new KitSeekerRadar(manager), + }); + } - new String[] - { - C.cAqua + "Hiders" + C.cWhite + " Run and Hide from Seekers", - C.cAqua + "Hiders" + C.cWhite + " Disguise as Blocks or Animals", - C.cAqua + "Hiders" + C.cWhite + " Shoot Seekers for Axe Upgrades", - C.cAqua + "Hiders" + C.cWhite + " Right-Click with Axe for Speed Boost", - C.cRed + "Seekers" + C.cWhite + " Find and kill the Hiders!", - }); + public HideSeek(ArcadeManager manager, Kit[] kits) + { + super(manager, GameType.HideSeek, kits, - this.DamageSelf = false; - this.DeathOut = false; - this.HungerSet = 20; - this.PrepareFreeze = false; + new String[] + { + C.cAqua + "Hiders" + C.cWhite + " Run and Hide from Seekers", + C.cAqua + "Hiders" + C.cWhite + " Disguise as Blocks or Animals", + C.cAqua + "Hiders" + C.cWhite + " Shoot Seekers for Axe Upgrades", + C.cAqua + "Hiders" + C.cWhite + " Right-Click with Axe for Speed Boost", + C.cRed + "Seekers" + C.cWhite + " Find and kill the Hiders!", + }); - _allowedBlocks = new ArrayList(); - _allowedBlocks.add(Material.TNT); - _allowedBlocks.add(Material.BOOKSHELF); - _allowedBlocks.add(Material.WORKBENCH); - _allowedBlocks.add(Material.FURNACE); - _allowedBlocks.add(Material.MELON_BLOCK); - _allowedBlocks.add(Material.CAULDRON); - _allowedBlocks.add(Material.FLOWER_POT); - _allowedBlocks.add(Material.ANVIL); - _allowedBlocks.add(Material.HAY_BLOCK); - _allowedBlocks.add(Material.CAKE_BLOCK); + this.DamageSelf = false; + this.DeathOut = false; + this.HungerSet = 20; + this.PrepareFreeze = false; - _allowedEnts = new ArrayList(); - _allowedEnts.add(EntityType.PIG); - _allowedEnts.add(EntityType.COW); - _allowedEnts.add(EntityType.CHICKEN); - _allowedEnts.add(EntityType.SHEEP); + _allowedBlocks = new ArrayList(); + _allowedBlocks.add(Material.TNT); + _allowedBlocks.add(Material.BOOKSHELF); + _allowedBlocks.add(Material.WORKBENCH); + _allowedBlocks.add(Material.FURNACE); + _allowedBlocks.add(Material.MELON_BLOCK); + _allowedBlocks.add(Material.CAULDRON); + _allowedBlocks.add(Material.FLOWER_POT); + _allowedBlocks.add(Material.ANVIL); + _allowedBlocks.add(Material.HAY_BLOCK); + _allowedBlocks.add(Material.CAKE_BLOCK); - Manager.GetExplosion().SetRegenerate(true); - Manager.GetExplosion().SetTNTSpread(false); - Manager.getCosmeticManager().setHideParticles(true); + _allowedEnts = new ArrayList(); + _allowedEnts.add(EntityType.PIG); + _allowedEnts.add(EntityType.COW); + _allowedEnts.add(EntityType.CHICKEN); + _allowedEnts.add(EntityType.SHEEP); - registerStatTrackers( + Manager.GetExplosion().SetRegenerate(true); + Manager.GetExplosion().SetTNTSpread(false); + Manager.getCosmeticManager().setHideParticles(true); + + registerStatTrackers( new HunterKillerStatTracker(this), new MeowStatTracker(this), new HunterKillerStatTracker(this), - new HunterOfTheYearStatTracker(this), + new HunterOfTheYearStatTracker(this), new BadHiderStatTracker(this) ); //Need ideas for this one registerChatStats(); - } + } - @EventHandler - public void onGameEndStart(GameStateChangeEvent event) - { - if (event.GetState() == GameState.Prepare) - { - System.out.println("prep"); - this.getArcadeManager().getPacketHandler().addPacketHandler(_blockDisguise, PacketPlayOutSpawnEntityLiving.class, PacketPlayOutEntityDestroy.class); - this.getArcadeManager().getPacketHandler().addPacketHandler(_useEntity, true, PacketPlayInUseEntity.class); - } - else if (event.GetState() == GameState.Dead) - { - this.getArcadeManager().getPacketHandler().removePacketHandler(_blockDisguise); - this.getArcadeManager().getPacketHandler().removePacketHandler(_useEntity); - } - } + @EventHandler + public void onGameEndStart(GameStateChangeEvent event) + { + if (event.GetState() == GameState.Prepare) + { + System.out.println("prep"); + this.getArcadeManager().getPacketHandler().addPacketHandler(_blockDisguise, PacketPlayOutSpawnEntityLiving.class, PacketPlayOutEntityDestroy.class); + this.getArcadeManager().getPacketHandler().addPacketHandler(_useEntity, true, PacketPlayInUseEntity.class); + } else if (event.GetState() == GameState.Dead) + { + this.getArcadeManager().getPacketHandler().removePacketHandler(_blockDisguise); + this.getArcadeManager().getPacketHandler().removePacketHandler(_useEntity); + } + } - public Material GetItemEquivilent(Material mat) - { - if (mat == Material.CAULDRON) - return Material.CAULDRON_ITEM; - if (mat == Material.FLOWER_POT) - return Material.FLOWER_POT_ITEM; - if (mat == Material.CAKE_BLOCK) - return Material.CAKE; + public Material GetItemEquivilent(Material mat) + { + if (mat == Material.CAULDRON) + return Material.CAULDRON_ITEM; + if (mat == Material.FLOWER_POT) + return Material.FLOWER_POT_ITEM; + if (mat == Material.CAKE_BLOCK) + return Material.CAKE; - return mat; - } + return mat; + } - @Override - public void ParseData() - { - int i = 0; + @Override + public void ParseData() + { + int i = 0; - for (ArrayList locs : WorldData.GetAllCustomLocs().values()) - { - for (Location loc : locs) - { - if (Math.random() > 0.25) - continue; + for (ArrayList locs : WorldData.GetAllCustomLocs().values()) + { + for (Location loc : locs) + { + if (Math.random() > 0.25) + continue; - if (loc.getBlock().getRelative(BlockFace.UP).getType() != Material.AIR) - continue; + if (loc.getBlock().getRelative(BlockFace.UP).getType() != Material.AIR) + continue; - loc.getBlock().setType(Material.AIR); - i++; - } - } + loc.getBlock().setType(Material.AIR); + i++; + } + } - System.out.println("Removed " + i + " Random Blocks."); + System.out.println("Removed " + i + " Random Blocks."); - for (Location loc : WorldData.GetDataLocs("BLACK")) - loc.getBlock().setType(Material.FENCE); + for (Location loc : WorldData.GetDataLocs("BLACK")) + loc.getBlock().setType(Material.FENCE); - } + } - @EventHandler - public void CustomTeamGeneration(GameStateChangeEvent event) - { - if (event.GetState() != GameState.Recruit) - return; + @EventHandler + public void CustomTeamGeneration(GameStateChangeEvent event) + { + if (event.GetState() != GameState.Recruit) + return; - _hiders = GetTeamList().stream().filter(team -> team.GetName().toUpperCase().contains("BLUE")).toArray(size -> new GameTeam[size])[0]; - _hiders.SetColor(ChatColor.AQUA); - _hiders.SetName("Hiders"); + _hiders = GetTeamList().stream().filter(team -> team.GetName().toUpperCase().contains("BLUE")).toArray(size -> new GameTeam[size])[0]; + _hiders.SetColor(ChatColor.AQUA); + _hiders.SetName("Hiders"); - _seekers = GetTeamList().stream().filter(team -> team.GetName().toUpperCase().contains("RED")).toArray(size -> new GameTeam[size])[0]; - _seekers.SetColor(ChatColor.RED); - _seekers.SetName("Hunters"); + _seekers = GetTeamList().stream().filter(team -> team.GetName().toUpperCase().contains("RED")).toArray(size -> new GameTeam[size])[0]; + _seekers.SetColor(ChatColor.RED); + _seekers.SetName("Hunters"); - RestrictKits(); - } + RestrictKits(); + } - @Override - public void RestrictKits() - { - for (Kit kit : GetKits()) - { - for (GameTeam team : GetTeamList()) - { - if (team.GetColor() == ChatColor.RED) - { - if (kit.GetName().contains("Hider")) - team.GetRestrictedKits().add(kit); - } - else - { - if (kit.GetName().contains("Hunter")) - team.GetRestrictedKits().add(kit); - } - } - } - } + @Override + public void RestrictKits() + { + for (Kit kit : GetKits()) + { + for (GameTeam team : GetTeamList()) + { + if (team.GetColor() == ChatColor.RED) + { + if (kit.GetName().contains("Hider")) + team.GetRestrictedKits().add(kit); + } else + { + if (kit.GetName().contains("Hunter")) + team.GetRestrictedKits().add(kit); + } + } + } + } - @EventHandler - public void MoveKits(GameStateChangeEvent event) - { - if (event.GetState() != GameState.Prepare) - return; + @EventHandler + public void MoveKits(GameStateChangeEvent event) + { + if (event.GetState() != GameState.Prepare) + return; - for (int i = 0; i < WorldData.GetDataLocs("RED").size() && i < 3; i++) - { - if (GetKits().length <= 5 + i) - continue; + for (int i = 0; i < WorldData.GetDataLocs("RED").size() && i < 3; i++) + { + if (GetKits().length <= 5 + i) + continue; - this.CreatureAllowOverride = true; - Entity ent = GetKits()[5 + i].SpawnEntity(WorldData.GetDataLocs("RED").get(i)); - this.CreatureAllowOverride = false; + this.CreatureAllowOverride = true; + Entity ent = GetKits()[5 + i].SpawnEntity(WorldData.GetDataLocs("RED").get(i)); + this.CreatureAllowOverride = false; - Manager.GetLobby().addKitLocation(ent, GetKits()[5 + i], WorldData.GetDataLocs("RED").get(i)); - } - } + Manager.GetLobby().addKitLocation(ent, GetKits()[5 + i], WorldData.GetDataLocs("RED").get(i)); + } + } - public void GiveItems(boolean bowOnly) - { - for (Player player : _hiders.GetPlayers(true)) - { - if (bowOnly) - { - // Bow - ItemStack bow = ItemStackFactory.Instance.CreateStack(Material.BOW, (byte) 0, 1, C.cYellow + C.Bold + "Shoot Hunters" - + C.cWhite + C.Bold + " - " + C.cGreen + C.Bold + "Upgrades Axe"); - bow.addEnchantment(Enchantment.ARROW_INFINITE, 1); - player.getInventory().setItem(1, bow); - player.getInventory().setItem(28, ItemStackFactory.Instance.CreateStack(Material.ARROW)); - } - else - { - // Axe - player.getInventory().setItem(0, - ItemStackFactory.Instance.CreateStack(Material.WOOD_AXE, (byte) 0, 1, C.cGreen + "Speed Axe")); + public void GiveItems(boolean bowOnly) + { + for (Player player : _hiders.GetPlayers(true)) + { + if (bowOnly) + { + // Bow + ItemStack bow = ItemStackFactory.Instance.CreateStack(Material.BOW, (byte) 0, 1, C.cYellow + C.Bold + "Shoot Hunters" + + C.cWhite + C.Bold + " - " + C.cGreen + C.Bold + "Upgrades Axe"); + bow.addEnchantment(Enchantment.ARROW_INFINITE, 1); + player.getInventory().setItem(1, bow); + player.getInventory().setItem(28, ItemStackFactory.Instance.CreateStack(Material.ARROW)); + } else + { + // Axe + player.getInventory().setItem(0, + ItemStackFactory.Instance.CreateStack(Material.WOOD_AXE, (byte) 0, 1, C.cGreen + "Speed Axe")); - // Meower - player.getInventory().setItem( - 4, - ItemStackFactory.Instance.CreateStack(Material.SUGAR, (byte) 0, 1, C.cYellow + C.Bold + "Meow" + C.cWhite - + C.Bold + " - " + C.cGreen + C.Bold + "+0.25 Gems")); + // Meower + player.getInventory().setItem( + 4, + ItemStackFactory.Instance.CreateStack(Material.SUGAR, (byte) 0, 1, C.cYellow + C.Bold + "Meow" + C.cWhite + + C.Bold + " - " + C.cGreen + C.Bold + "+0.25 Gems")); - // Firework - ItemStack firework = ItemStackFactory.Instance.CreateStack(Material.FIREWORK, (byte) 0, 5, C.cYellow + C.Bold - + "Firework" + C.cWhite + C.Bold + " - " + C.cGreen + C.Bold + "+2 Gems"); - FireworkMeta metaData = (FireworkMeta) firework.getItemMeta(); - metaData.setPower(1); - metaData.addEffect(FireworkEffect.builder().flicker(true).withColor(Color.AQUA).with(Type.BALL_LARGE).trail(true) - .build()); - firework.setItemMeta(metaData); - player.getInventory().setItem(5, firework); + // Firework + ItemStack firework = ItemStackFactory.Instance.CreateStack(Material.FIREWORK, (byte) 0, 5, C.cYellow + C.Bold + + "Firework" + C.cWhite + C.Bold + " - " + C.cGreen + C.Bold + "+2 Gems"); + FireworkMeta metaData = (FireworkMeta) firework.getItemMeta(); + metaData.setPower(1); + metaData.addEffect(FireworkEffect.builder().flicker(true).withColor(Color.AQUA).with(Type.BALL_LARGE).trail(true) + .build()); + firework.setItemMeta(metaData); + player.getInventory().setItem(5, firework); - // Recharges - Recharge.Instance.useForce(player, "Meow", 15000); - Recharge.Instance.useForce(player, "Firework", 15000); - } - - player.playSound(player.getLocation(), Sound.HORSE_ARMOR, 1f, 1f); - } - } + // Recharges + Recharge.Instance.useForce(player, "Meow", 15000); + Recharge.Instance.useForce(player, "Firework", 15000); + } - @EventHandler - public void InitialDisguise(PlayerPrepareTeleportEvent event) - { - if (_hiders.HasPlayer(event.GetPlayer().getName(), true)) - { + player.playSound(player.getLocation(), Sound.HORSE_ARMOR, 1f, 1f); + } + } + + @EventHandler + public void InitialDisguise(PlayerPrepareTeleportEvent event) + { + if (_hiders.HasPlayer(event.GetPlayer().getName(), true)) + { Kit kit = GetKit(event.GetPlayer()); - if (kit instanceof KitHider && !(kit instanceof KitHiderInfestor)) - { - Form form = new BlockForm(this, event.GetPlayer(), _allowedBlocks.get(UtilMath.r(_allowedBlocks.size()))); + if (kit instanceof KitHider && !(kit instanceof KitHiderInfestor)) + { + Form form = new BlockForm(this, event.GetPlayer(), _allowedBlocks.get(UtilMath.r(_allowedBlocks.size()))); - _forms.put(event.GetPlayer(), form); + _forms.put(event.GetPlayer(), form); - form.Apply(); + form.Apply(); - Bukkit.getPluginManager().callEvent(new PlayerChangeFormEvent(event.GetPlayer(), form)); - } - } - } + Bukkit.getPluginManager().callEvent(new PlayerChangeFormEvent(event.GetPlayer(), form)); + } + } + } - @EventHandler - public void ChangeDisguise(PlayerInteractEvent event) - { - if (event.getClickedBlock() == null) - return; + @EventHandler + public void ChangeDisguise(PlayerInteractEvent event) + { + if (event.getClickedBlock() == null) + return; - Player player = event.getPlayer(); + Player player = event.getPlayer(); - if (!UtilGear.isMat(player.getItemInHand(), Material.SLIME_BALL)) - return; + if (!UtilGear.isMat(player.getItemInHand(), Material.SLIME_BALL)) + return; - if (!_allowedBlocks.contains(event.getClickedBlock().getType())) - { - UtilPlayer.message( - player, - F.main("Game", - "You cannot morph into " - + F.elem(ItemStackFactory.Instance - .GetName(event.getClickedBlock().getType(), (byte) 0, false) + " Block") + ".")); - return; - } + if (!_allowedBlocks.contains(event.getClickedBlock().getType())) + { + UtilPlayer.message( + player, + F.main("Game", + "You cannot morph into " + + F.elem(ItemStackFactory.Instance + .GetName(event.getClickedBlock().getType(), (byte) 0, false) + " Block") + ".")); + return; + } - if (!Recharge.Instance.use(player, "Change Form", 6000, true, false)) - return; + if (!Recharge.Instance.use(player, "Change Form", 6000, true, false)) + return; - if (!(GetKit(player) instanceof KitHiderSwapper)) - UtilInv.remove(player, Material.SLIME_BALL, (byte) 0, 1); + if (!(GetKit(player) instanceof KitHiderSwapper)) + UtilInv.remove(player, Material.SLIME_BALL, (byte) 0, 1); - // Remove Old - _forms.get(player).Remove(); + // Remove Old + _forms.get(player).Remove(); - Form form = new BlockForm(this, player, event.getClickedBlock().getType()); + Form form = new BlockForm(this, player, event.getClickedBlock().getType()); - // Set New - _forms.put(player, form); + // Set New + _forms.put(player, form); - form.Apply(); + form.Apply(); - Bukkit.getPluginManager().callEvent(new PlayerChangeFormEvent(player, form)); - } + Bukkit.getPluginManager().callEvent(new PlayerChangeFormEvent(player, form)); + } - @EventHandler - public void ChangeDisguise(PlayerInteractEntityEvent event) - { - if (event.getRightClicked() == null) - return; + @EventHandler + public void ChangeDisguise(PlayerInteractEntityEvent event) + { + if (event.getRightClicked() == null) + return; - Player player = event.getPlayer(); + Player player = event.getPlayer(); - if (!UtilGear.isMat(player.getItemInHand(), Material.SLIME_BALL)) - return; + if (!UtilGear.isMat(player.getItemInHand(), Material.SLIME_BALL)) + return; - if (!_allowedEnts.contains(event.getRightClicked().getType())) - { - UtilPlayer.message(player, - F.main("Game", "You cannot morph into " + F.elem(UtilEnt.getName(event.getRightClicked())) + ".")); - return; - } - - if (!Recharge.Instance.use(player, "Change Form", 6000, true, false)) - return; + if (!_allowedEnts.contains(event.getRightClicked().getType())) + { + UtilPlayer.message(player, + F.main("Game", "You cannot morph into " + F.elem(UtilEnt.getName(event.getRightClicked())) + ".")); + return; + } - if (!(GetKit(player) instanceof KitHiderSwapper)) - UtilInv.remove(player, Material.SLIME_BALL, (byte) 0, 1); + if (!Recharge.Instance.use(player, "Change Form", 6000, true, false)) + return; - // Remove Old - _forms.get(player).Remove(); - - Form form = new CreatureForm(this, player, event.getRightClicked().getType()); - - // Set New - _forms.put(player, form); - - Bukkit.getPluginManager().callEvent(new PlayerChangeFormEvent(player, form)); - } - - @EventHandler - public void ChangeDisguise(CustomDamageEvent event) - { - Player player = event.GetDamagerPlayer(false); - if (player == null) - return; - - if (!UtilGear.isMat(player.getItemInHand(), Material.SLIME_BALL)) - return; + if (!(GetKit(player) instanceof KitHiderSwapper)) + UtilInv.remove(player, Material.SLIME_BALL, (byte) 0, 1); - if (!_allowedEnts.contains(event.GetDamageeEntity().getType())) - { - UtilPlayer.message(player, - F.main("Game", "You cannot morph into " + F.elem(UtilEnt.getName(event.GetDamageeEntity())) + ".")); - return; - } - - if (!Recharge.Instance.use(player, "Change Form", 6000, true, false)) - return; - - if (!(GetKit(player) instanceof KitHiderSwapper)) - UtilInv.remove(player, Material.SLIME_BALL, (byte) 0, 1); - - // Remove Old - _forms.get(player).Remove(); - - Form form = new CreatureForm(this, player, event.GetDamageeEntity().getType()); - - // Set New - _forms.put(player, form); + // Remove Old + _forms.get(player).Remove(); - Bukkit.getPluginManager().callEvent(new PlayerChangeFormEvent(player, form)); - } + Form form = new CreatureForm(this, player, event.getRightClicked().getType()); - @EventHandler - public void FallingBlockBreak(ItemSpawnEvent event) - { - if (event.getEntity().getItemStack().getType() == Material.getMaterial(175) || (Manager.IsHolidayEnabled && (event.getEntity().getItemStack().getType() == Material.PRISMARINE_SHARD || event.getEntity().getItemStack().getType() == Material.EMERALD))) - return; - - event.setCancelled(true); + // Set New + _forms.put(player, form); - for (Form form : _forms.values()) - if (form instanceof BlockForm) - ((BlockForm) form).FallingBlockCheck(); - } + Bukkit.getPluginManager().callEvent(new PlayerChangeFormEvent(player, form)); + } - @EventHandler - public void FallingBlockLand(EntityChangeBlockEvent event) - { - if (event.getEntity() instanceof FallingBlock) - { - event.setCancelled(true); - event.getEntity().remove(); + @EventHandler + public void ChangeDisguise(CustomDamageEvent event) + { + Player player = event.GetDamagerPlayer(false); + if (player == null) + return; - for (Form form : _forms.values()) - if (form instanceof BlockForm) - ((BlockForm) form).FallingBlockCheck(); - } - } - - @EventHandler - public void FallingBlockUpdate(UpdateEvent event) - { - if (event.getType() != UpdateType.TICK) - return; - - if (!InProgress()) - return; + if (!UtilGear.isMat(player.getItemInHand(), Material.SLIME_BALL)) + return; - for (Form form : _forms.values()) - if (form instanceof BlockForm) - ((BlockForm) form).FallingBlockCheck(); - } - - @EventHandler - public void SolidifyUpdate(UpdateEvent event) - { - if (!IsLive()) - return; - - if (event.getType() != UpdateType.TICK) - return; - - for (Form form : _forms.values()) - if (form instanceof BlockForm) - ((BlockForm) form).SolidifyUpdate(); - } - - @EventHandler - public void SolidBlockDamage(BlockDamageEvent event) - { - if (!_seekers.HasPlayer(event.getPlayer())) - return; - - for (Form form : _forms.values()) - { - if (!(form instanceof BlockForm)) - continue; - - if (((BlockForm) form).GetBlock() == null) - continue; - - if (!((BlockForm) form).GetBlock().equals(event.getBlock())) - continue; - - // Damage Event - Manager.GetDamage().NewDamageEvent(form.Player, event.getPlayer(), null, DamageCause.CUSTOM, 4, true, true, false, - event.getPlayer().getName(), null); - - ((BlockForm) form).SolidifyRemove(); - } - } - - @EventHandler - public void FallingBlockDamage(EntityDamageEvent event) - { - if (!(event instanceof EntityDamageByEntityEvent)) - return; - - if (!(event.getEntity() instanceof FallingSand)) - return; - - if (event.getEntity().getVehicle() == null) - return; - - if (!(event.getEntity().getVehicle() instanceof LivingEntity)) - return; - - LivingEntity damagee = (LivingEntity) event.getEntity().getVehicle(); - - EntityDamageByEntityEvent eventEE = (EntityDamageByEntityEvent) event; - - LivingEntity damager = null; - Projectile proj = null; - - if (eventEE.getDamager() instanceof Projectile) - { - proj = (Projectile) eventEE.getDamager(); - damager = (LivingEntity) proj.getShooter(); - } - else if (eventEE.getDamager() instanceof LivingEntity) - { - damager = (LivingEntity) eventEE.getDamager(); - } - - // Damage Event - Manager.GetDamage().NewDamageEvent(damagee, damager, proj, event.getCause(), event.getDamage(), true, false, false, null, - null); - - event.setCancelled(true); - } - - @EventHandler - public void AnimalSpawn(GameStateChangeEvent event) - { - if (event.GetState() != GameState.Prepare) - return; - - this.CreatureAllowOverride = true; + if (!_allowedEnts.contains(event.GetDamageeEntity().getType())) + { + UtilPlayer.message(player, + F.main("Game", "You cannot morph into " + F.elem(UtilEnt.getName(event.GetDamageeEntity())) + ".")); + return; + } - for (Location loc : WorldData.GetDataLocs("WHITE")) - _mobs.put(loc.getWorld().spawn(loc, Sheep.class), loc); + if (!Recharge.Instance.use(player, "Change Form", 6000, true, false)) + return; + + if (!(GetKit(player) instanceof KitHiderSwapper)) + UtilInv.remove(player, Material.SLIME_BALL, (byte) 0, 1); - for (Location loc : WorldData.GetDataLocs("PINK")) - _mobs.put(loc.getWorld().spawn(loc, Pig.class), loc); + // Remove Old + _forms.get(player).Remove(); - for (Location loc : WorldData.GetDataLocs("YELLOW")) - _mobs.put(loc.getWorld().spawn(loc, Chicken.class), loc); + Form form = new CreatureForm(this, player, event.GetDamageeEntity().getType()); - for (Location loc : WorldData.GetDataLocs("BROWN")) - _mobs.put(loc.getWorld().spawn(loc, Cow.class), loc); + // Set New + _forms.put(player, form); - this.CreatureAllowOverride = false; - } - - @EventHandler(priority = EventPriority.LOW) - public void AnimalDamage(CustomDamageEvent event) - { - if (event.GetDamageePlayer() == null && !(event.GetDamageeEntity() instanceof Slime)) - event.SetCancelled("Animal Damage"); + Bukkit.getPluginManager().callEvent(new PlayerChangeFormEvent(player, form)); + } - if (event.GetDamagerEntity(false) != null && event.GetDamagerEntity(false) instanceof Slime) - event.SetCancelled("Slime Attack"); - } + @EventHandler + public void FallingBlockBreak(ItemSpawnEvent event) + { + if (event.getEntity().getItemStack().getType() == Material.getMaterial(175) || (Manager.IsHolidayEnabled && (event.getEntity().getItemStack().getType() == Material.PRISMARINE_SHARD || event.getEntity().getItemStack().getType() == Material.EMERALD))) + return; - @EventHandler - public void AnimalReturn(UpdateEvent event) - { - if (event.getType() != UpdateType.SEC) - return; + event.setCancelled(true); - for (Creature ent : _mobs.keySet()) - { - if (UtilMath.offset(ent.getLocation(), _mobs.get(ent)) < 5) - continue; + for (Form form : _forms.values()) + if (form instanceof BlockForm) + ((BlockForm) form).FallingBlockCheck(); + } - Location loc = _mobs.get(ent).add( - UtilAlg.getTrajectory(_mobs.get(ent), ent.getLocation()).multiply(Math.random() * 3)); + @EventHandler + public void FallingBlockLand(EntityChangeBlockEvent event) + { + if (event.getEntity() instanceof FallingBlock) + { + event.setCancelled(true); + event.getEntity().remove(); - EntityCreature ec = ((CraftCreature) ent).getHandle(); - NavigationAbstract nav = ec.getNavigation(); - nav.a(loc.getX(), loc.getY(), loc.getZ(), 1f); - } - } - - @EventHandler - public void AttackSeeker(CustomDamageEvent event) - { - if (event.GetDamagerPlayer(true) == null) - return; - - if (!_hiders.HasPlayer(event.GetDamagerPlayer(true))) - return; - - if (event.GetDamageInitial() > 1) - return; - - event.AddMod("H&S", "Negate", -event.GetDamageInitial(), false); - event.AddMod("H&S", "Attack", event.GetDamageInitial(), true); - } - - @EventHandler - public void ArrowShoot(EntityShootBowEvent event) - { - if (!(event.getEntity() instanceof Player)) - return; - - Player shooter = (Player) event.getEntity(); - - if (!_hiders.HasPlayer(shooter)) - return; - - Arrow arrow = shooter.getWorld().spawnArrow( - shooter.getEyeLocation().add(shooter.getLocation().getDirection().multiply(1.5)), - shooter.getLocation().getDirection(), (float) event.getProjectile().getVelocity().length(), 0f); - arrow.setShooter(shooter); - - event.setCancelled(true); - } - - @EventHandler - public void ArrowHit(CustomDamageEvent event) - { - if (event.IsCancelled()) - return; - - if (event.GetProjectile() == null) - return; - - Player damagee = event.GetDamageePlayer(); - if (damagee == null) - return; - - if (!_seekers.HasPlayer(damagee)) - return; - - Player damager = event.GetDamagerPlayer(true); - if (damager == null) - return; - - if (!_hiders.HasPlayer(damager)) - return; - - event.AddMod("Hide & Seek", "Negate", -event.GetDamageInitial(), false); - event.AddMod("Hide & Seek", "Damage Set", 2, false); - event.AddKnockback("Hide & Seek", 2); - - Powerup(damager); - } - - public void Powerup(Player player) - { - int count = 1; - if (_arrowHits.containsKey(player)) - count += _arrowHits.get(player); - - _arrowHits.put(player, count); - - if (count == 4) - { - player.getInventory().remove(Material.WOOD_AXE); - player.getInventory().addItem( - ItemStackFactory.Instance.CreateStack(Material.STONE_AXE, (byte) 0, 1, C.cGreen + "Super Axe")); - - // Sound - player.playSound(player.getLocation(), Sound.LEVEL_UP, 1f, 1f); - - // Inform - UtilPlayer.message(player, F.main("Game", "You upgraded to " + F.elem("Super Axe") + "!")); - } - else if (count == 8) - { - player.getInventory().remove(Material.STONE_AXE); - player.getInventory().addItem( - ItemStackFactory.Instance.CreateStack(Material.IRON_AXE, (byte) 0, 1, C.cGreen + "Ultra Axe")); - - // Sound - player.playSound(player.getLocation(), Sound.LEVEL_UP, 1f, 1f); - - // Inform - UtilPlayer.message(player, F.main("Game", "You upgraded to " + F.elem("Ultra Axe") + "!")); - } - else if (count == 12) - { - player.getInventory().remove(Material.IRON_AXE); - player.getInventory().addItem( - ItemStackFactory.Instance.CreateStack(Material.DIAMOND_AXE, (byte) 0, 1, C.cGreen + "Hyper Axe")); - - // Sound - player.playSound(player.getLocation(), Sound.LEVEL_UP, 1f, 1f); - - // Inform - UtilPlayer.message(player, F.main("Game", "You upgraded to " + F.elem("Hyper Axe") + "!")); - } - else if (count < 12) - { - // Sound - player.playSound(player.getLocation(), Sound.ORB_PICKUP, 1f, 1f); - } - } - - @EventHandler - public void UseBoost(PlayerInteractEvent event) - { - if (!IsLive()) - return; - - Player player = event.getPlayer(); - - if (!UtilEvent.isAction(event, ActionType.R)) - return; - - if (player.getItemInHand() == null) - return; - - if (!player.getItemInHand().getType().toString().contains("_AXE")) - return; - - if (!_hiders.HasPlayer(player)) - return; - - if (!Recharge.Instance.use(player, "Axe Boost", 16000, inform(), true)) - return; - - if (UtilGear.isMat(player.getItemInHand(), Material.WOOD_AXE)) - { - Manager.GetCondition().Factory().Speed("Boost", player, player, 4, 0, false, false, false); - - // Inform - UtilPlayer.message(player, F.main("Game", "You used " + F.elem("Basic Boost") + "!")); - - // Sound - player.getWorld().playSound(player.getLocation(), Sound.BLAZE_BREATH, 1f, 1f); - } - else if (UtilGear.isMat(player.getItemInHand(), Material.STONE_AXE)) - { - Manager.GetCondition().Factory().Speed("Boost", player, player, 4, 1, false, false, false); - - // Inform - UtilPlayer.message(player, F.main("Game", "You used " + F.elem("Ultra Boost") + "!")); - - // Sound - player.getWorld().playSound(player.getLocation(), Sound.BLAZE_BREATH, 1f, 1f); - } - else if (UtilGear.isMat(player.getItemInHand(), Material.IRON_AXE)) - { - Manager.GetCondition().Factory().Speed("Boost", player, player, 4, 1, false, false, false); - Manager.GetCondition().Factory().Regen("Boost", player, player, 4, 0, false, false, false); - - // Inform - UtilPlayer.message(player, F.main("Game", "You used " + F.elem("Mega Boost") + "!")); - - // Sound - player.getWorld().playSound(player.getLocation(), Sound.BLAZE_BREATH, 1f, 1f); - } - else if (UtilGear.isMat(player.getItemInHand(), Material.DIAMOND_AXE)) - { - Manager.GetCondition().Factory().Speed("Boost", player, player, 4, 2, false, false, false); - Manager.GetCondition().Factory().Regen("Boost", player, player, 4, 1, false, false, false); - - // Inform - UtilPlayer.message(player, F.main("Game", "You used " + F.elem("Hyper Boost") + "!")); - - // Sound - player.getWorld().playSound(player.getLocation(), Sound.BLAZE_BREATH, 1f, 1f); - } - } - - @EventHandler - public void UseMeow(PlayerInteractEvent event) - { - if (!IsLive()) - return; - - Player player = event.getPlayer(); - - if (!UtilEvent.isAction(event, ActionType.R)) - return; - - if (!UtilGear.isMat(player.getItemInHand(), Material.SUGAR)) - return; - - event.setCancelled(true); - - if (!Recharge.Instance.use(player, "Meow", 5000, inform(), true)) - return; - - player.getWorld().playSound(player.getLocation(), Sound.CAT_MEOW, 1f, 1f); - - this.AddGems(player, 0.25, "Meows", true, true); - - UtilParticle.PlayParticle(ParticleType.NOTE, player.getLocation().add(0, 0.75, 0), 0.4f, 0.4f, 0.4f, 0, 6, + for (Form form : _forms.values()) + if (form instanceof BlockForm) + ((BlockForm) form).FallingBlockCheck(); + } + } + + @EventHandler + public void FallingBlockUpdate(UpdateEvent event) + { + if (event.getType() != UpdateType.TICK) + return; + + if (!InProgress()) + return; + + for (Form form : _forms.values()) + if (form instanceof BlockForm) + ((BlockForm) form).FallingBlockCheck(); + } + + @EventHandler + public void SolidifyUpdate(UpdateEvent event) + { + if (!IsLive()) + return; + + if (event.getType() != UpdateType.TICK) + return; + + for (Form form : _forms.values()) + if (form instanceof BlockForm) + ((BlockForm) form).SolidifyUpdate(); + } + + @EventHandler + public void SolidBlockDamage(BlockDamageEvent event) + { + if (!_seekers.HasPlayer(event.getPlayer())) + return; + + for (Form form : _forms.values()) + { + if (!(form instanceof BlockForm)) + continue; + + if (((BlockForm) form).GetBlock() == null) + continue; + + if (!((BlockForm) form).GetBlock().equals(event.getBlock())) + continue; + + // Damage Event + Manager.GetDamage().NewDamageEvent(form.Player, event.getPlayer(), null, DamageCause.CUSTOM, 4, true, true, false, + event.getPlayer().getName(), null); + + ((BlockForm) form).SolidifyRemove(); + } + } + + @EventHandler + public void FallingBlockDamage(EntityDamageEvent event) + { + if (!(event instanceof EntityDamageByEntityEvent)) + return; + + if (!(event.getEntity() instanceof FallingSand)) + return; + + if (event.getEntity().getVehicle() == null) + return; + + if (!(event.getEntity().getVehicle() instanceof LivingEntity)) + return; + + LivingEntity damagee = (LivingEntity) event.getEntity().getVehicle(); + + EntityDamageByEntityEvent eventEE = (EntityDamageByEntityEvent) event; + + LivingEntity damager = null; + Projectile proj = null; + + if (eventEE.getDamager() instanceof Projectile) + { + proj = (Projectile) eventEE.getDamager(); + damager = (LivingEntity) proj.getShooter(); + } else if (eventEE.getDamager() instanceof LivingEntity) + { + damager = (LivingEntity) eventEE.getDamager(); + } + + // Damage Event + Manager.GetDamage().NewDamageEvent(damagee, damager, proj, event.getCause(), event.getDamage(), true, false, false, null, + null); + + event.setCancelled(true); + } + + @EventHandler + public void AnimalSpawn(GameStateChangeEvent event) + { + if (event.GetState() != GameState.Prepare) + return; + + this.CreatureAllowOverride = true; + + for (Location loc : WorldData.GetDataLocs("WHITE")) + _mobs.put(loc.getWorld().spawn(loc, Sheep.class), loc); + + for (Location loc : WorldData.GetDataLocs("PINK")) + _mobs.put(loc.getWorld().spawn(loc, Pig.class), loc); + + for (Location loc : WorldData.GetDataLocs("YELLOW")) + _mobs.put(loc.getWorld().spawn(loc, Chicken.class), loc); + + for (Location loc : WorldData.GetDataLocs("BROWN")) + _mobs.put(loc.getWorld().spawn(loc, Cow.class), loc); + + this.CreatureAllowOverride = false; + } + + @EventHandler(priority = EventPriority.LOW) + public void AnimalDamage(CustomDamageEvent event) + { + if (event.GetDamageePlayer() == null && !(event.GetDamageeEntity() instanceof Slime)) + event.SetCancelled("Animal Damage"); + + if (event.GetDamagerEntity(false) != null && event.GetDamagerEntity(false) instanceof Slime) + event.SetCancelled("Slime Attack"); + } + + @EventHandler + public void AnimalReturn(UpdateEvent event) + { + if (event.getType() != UpdateType.SEC) + return; + + for (Creature ent : _mobs.keySet()) + { + if (UtilMath.offset(ent.getLocation(), _mobs.get(ent)) < 5) + continue; + + Location loc = _mobs.get(ent).add( + UtilAlg.getTrajectory(_mobs.get(ent), ent.getLocation()).multiply(Math.random() * 3)); + + EntityCreature ec = ((CraftCreature) ent).getHandle(); + NavigationAbstract nav = ec.getNavigation(); + nav.a(loc.getX(), loc.getY(), loc.getZ(), 1f); + } + } + + @EventHandler + public void AttackSeeker(CustomDamageEvent event) + { + if (event.GetDamagerPlayer(true) == null) + return; + + if (!_hiders.HasPlayer(event.GetDamagerPlayer(true))) + return; + + if (event.GetDamageInitial() > 1) + return; + + event.AddMod("H&S", "Negate", -event.GetDamageInitial(), false); + event.AddMod("H&S", "Attack", event.GetDamageInitial(), true); + } + + @EventHandler + public void ArrowShoot(EntityShootBowEvent event) + { + if (!(event.getEntity() instanceof Player)) + return; + + Player shooter = (Player) event.getEntity(); + + if (!_hiders.HasPlayer(shooter)) + return; + + Arrow arrow = shooter.getWorld().spawnArrow( + shooter.getEyeLocation().add(shooter.getLocation().getDirection().multiply(1.5)), + shooter.getLocation().getDirection(), (float) event.getProjectile().getVelocity().length(), 0f); + arrow.setShooter(shooter); + + event.setCancelled(true); + } + + @EventHandler + public void ArrowHit(CustomDamageEvent event) + { + if (event.IsCancelled()) + return; + + if (event.GetProjectile() == null) + return; + + Player damagee = event.GetDamageePlayer(); + if (damagee == null) + return; + + if (!_seekers.HasPlayer(damagee)) + return; + + Player damager = event.GetDamagerPlayer(true); + if (damager == null) + return; + + if (!_hiders.HasPlayer(damager)) + return; + + event.AddMod("Hide & Seek", "Negate", -event.GetDamageInitial(), false); + event.AddMod("Hide & Seek", "Damage Set", 2, false); + event.AddKnockback("Hide & Seek", 2); + + Powerup(damager); + } + + public void Powerup(Player player) + { + int count = 1; + if (_arrowHits.containsKey(player)) + count += _arrowHits.get(player); + + _arrowHits.put(player, count); + + if (count == 4) + { + player.getInventory().remove(Material.WOOD_AXE); + player.getInventory().addItem( + ItemStackFactory.Instance.CreateStack(Material.STONE_AXE, (byte) 0, 1, C.cGreen + "Super Axe")); + + // Sound + player.playSound(player.getLocation(), Sound.LEVEL_UP, 1f, 1f); + + // Inform + UtilPlayer.message(player, F.main("Game", "You upgraded to " + F.elem("Super Axe") + "!")); + } else if (count == 8) + { + player.getInventory().remove(Material.STONE_AXE); + player.getInventory().addItem( + ItemStackFactory.Instance.CreateStack(Material.IRON_AXE, (byte) 0, 1, C.cGreen + "Ultra Axe")); + + // Sound + player.playSound(player.getLocation(), Sound.LEVEL_UP, 1f, 1f); + + // Inform + UtilPlayer.message(player, F.main("Game", "You upgraded to " + F.elem("Ultra Axe") + "!")); + } else if (count == 12) + { + player.getInventory().remove(Material.IRON_AXE); + player.getInventory().addItem( + ItemStackFactory.Instance.CreateStack(Material.DIAMOND_AXE, (byte) 0, 1, C.cGreen + "Hyper Axe")); + + // Sound + player.playSound(player.getLocation(), Sound.LEVEL_UP, 1f, 1f); + + // Inform + UtilPlayer.message(player, F.main("Game", "You upgraded to " + F.elem("Hyper Axe") + "!")); + } else if (count < 12) + { + // Sound + player.playSound(player.getLocation(), Sound.ORB_PICKUP, 1f, 1f); + } + } + + @EventHandler + public void UseBoost(PlayerInteractEvent event) + { + if (!IsLive()) + return; + + Player player = event.getPlayer(); + + if (!UtilEvent.isAction(event, ActionType.R)) + return; + + if (player.getItemInHand() == null) + return; + + if (!player.getItemInHand().getType().toString().contains("_AXE")) + return; + + if (!_hiders.HasPlayer(player)) + return; + + if (!Recharge.Instance.use(player, "Axe Boost", 16000, inform(), true)) + return; + + if (UtilGear.isMat(player.getItemInHand(), Material.WOOD_AXE)) + { + Manager.GetCondition().Factory().Speed("Boost", player, player, 4, 0, false, false, false); + + // Inform + UtilPlayer.message(player, F.main("Game", "You used " + F.elem("Basic Boost") + "!")); + + // Sound + player.getWorld().playSound(player.getLocation(), Sound.BLAZE_BREATH, 1f, 1f); + } else if (UtilGear.isMat(player.getItemInHand(), Material.STONE_AXE)) + { + Manager.GetCondition().Factory().Speed("Boost", player, player, 4, 1, false, false, false); + + // Inform + UtilPlayer.message(player, F.main("Game", "You used " + F.elem("Ultra Boost") + "!")); + + // Sound + player.getWorld().playSound(player.getLocation(), Sound.BLAZE_BREATH, 1f, 1f); + } else if (UtilGear.isMat(player.getItemInHand(), Material.IRON_AXE)) + { + Manager.GetCondition().Factory().Speed("Boost", player, player, 4, 1, false, false, false); + Manager.GetCondition().Factory().Regen("Boost", player, player, 4, 0, false, false, false); + + // Inform + UtilPlayer.message(player, F.main("Game", "You used " + F.elem("Mega Boost") + "!")); + + // Sound + player.getWorld().playSound(player.getLocation(), Sound.BLAZE_BREATH, 1f, 1f); + } else if (UtilGear.isMat(player.getItemInHand(), Material.DIAMOND_AXE)) + { + Manager.GetCondition().Factory().Speed("Boost", player, player, 4, 2, false, false, false); + Manager.GetCondition().Factory().Regen("Boost", player, player, 4, 1, false, false, false); + + // Inform + UtilPlayer.message(player, F.main("Game", "You used " + F.elem("Hyper Boost") + "!")); + + // Sound + player.getWorld().playSound(player.getLocation(), Sound.BLAZE_BREATH, 1f, 1f); + } + } + + @EventHandler + public void UseMeow(PlayerInteractEvent event) + { + if (!IsLive()) + return; + + Player player = event.getPlayer(); + + if (!UtilEvent.isAction(event, ActionType.R)) + return; + + if (!UtilGear.isMat(player.getItemInHand(), Material.SUGAR)) + return; + + event.setCancelled(true); + + if (!Recharge.Instance.use(player, "Meow", 5000, inform(), true)) + return; + + player.getWorld().playSound(player.getLocation(), Sound.CAT_MEOW, 1f, 1f); + + this.AddGems(player, 0.25, "Meows", true, true); + + UtilParticle.PlayParticle(ParticleType.NOTE, player.getLocation().add(0, 0.75, 0), 0.4f, 0.4f, 0.4f, 0, 6, ViewDist.MAX, UtilServer.getPlayers()); - Bukkit.getPluginManager().callEvent(new MeowEvent(event.getPlayer())); - } + Bukkit.getPluginManager().callEvent(new MeowEvent(event.getPlayer())); + } - @EventHandler - public void UseFirework(PlayerInteractEvent event) - { - if (!IsLive()) - return; - - Player player = event.getPlayer(); + @EventHandler + public void UseFirework(PlayerInteractEvent event) + { + if (!IsLive()) + return; - if (!UtilEvent.isAction(event, ActionType.R)) - return; + Player player = event.getPlayer(); - if (!UtilGear.isMat(player.getItemInHand(), Material.FIREWORK)) - return; + if (!UtilEvent.isAction(event, ActionType.R)) + return; - event.setCancelled(true); - - if (!Recharge.Instance.use(player, "Firework", 15000, inform(), true)) - return; - - this.AddGems(player, 2, "Fireworks", true, true); - - UtilInv.remove(player, Material.FIREWORK, (byte)0, 1); - UtilInv.Update(player); - - UtilFirework.launchFirework(player.getEyeLocation(), - FireworkEffect.builder().flicker(Math.random() > 0.5).withColor(Color.YELLOW).with(Type.BALL_LARGE).trail(true).flicker(true).build(), - new Vector(0,0,0), 2); - } + if (!UtilGear.isMat(player.getItemInHand(), Material.FIREWORK)) + return; - @EventHandler - public void HiderTimeGems(UpdateEvent event) - { - if (GetState() != GameState.Live) - return; + event.setCancelled(true); - if (event.getType() != UpdateType.SEC) - return; + if (!Recharge.Instance.use(player, "Firework", 15000, inform(), true)) + return; - for (Player player : _hiders.GetPlayers(true)) - { - this.AddGems(player, 0.05, "Seconds Alive", true, true); - } - } + this.AddGems(player, 2, "Fireworks", true, true); - @EventHandler - public void UpdateSeekers(UpdateEvent event) - { - if (!IsLive()) - return; + UtilInv.remove(player, Material.FIREWORK, (byte) 0, 1); + UtilInv.Update(player); - if (event.getType() != UpdateType.FAST) - return; + UtilFirework.launchFirework(player.getEyeLocation(), + FireworkEffect.builder().flicker(Math.random() > 0.5).withColor(Color.YELLOW).with(Type.BALL_LARGE).trail(true).flicker(true).build(), + new Vector(0, 0, 0), 2); + } - int req = Math.max(1, GetPlayers(true).size() / 5); + @EventHandler + public void HiderTimeGems(UpdateEvent event) + { + if (GetState() != GameState.Live) + return; - while (_seekers.GetPlayers(true).size() < req && _hiders.GetPlayers(true).size() > 0) - { - Player player = _hiders.GetPlayers(true).get(UtilMath.r(_hiders.GetPlayers(true).size())); - SetSeeker(player, true); - } - } + if (event.getType() != UpdateType.SEC) + return; - @EventHandler - public void WaterDamage(UpdateEvent event) - { - if (!IsLive()) - return; + for (Player player : _hiders.GetPlayers(true)) + { + this.AddGems(player, 0.05, "Seconds Alive", true, true); + } + } - if (event.getType() != UpdateType.FAST) - return; - } + @EventHandler + public void UpdateSeekers(UpdateEvent event) + { + if (!IsLive()) + return; - @EventHandler - public void WorldWaterDamage(UpdateEvent event) - { - if (!IsLive()) - return; + if (event.getType() != UpdateType.FAST) + return; - if (event.getType() != UpdateType.SEC) - return; + int req = Math.max(1, GetPlayers(true).size() / 5); - for (Player player : _hiders.GetPlayers(true)) - if (player.getLocation().getBlock().getTypeId() == 8 || player.getLocation().getBlock().getTypeId() == 9) - { - // Damage Event - Manager.GetDamage().NewDamageEvent(player, null, null, DamageCause.DROWNING, 2, false, false, false, "Water", - "Water Damage"); + while (_seekers.GetPlayers(true).size() < req && _hiders.GetPlayers(true).size() > 0) + { + Player player = _hiders.GetPlayers(true).get(UtilMath.r(_hiders.GetPlayers(true).size())); + SetSeeker(player, true); + } + } - player.getWorld().playSound(player.getLocation(), Sound.SPLASH, 0.8f, 1f + (float) Math.random() / 2); - } - } + @EventHandler + public void WaterDamage(UpdateEvent event) + { + if (!IsLive()) + return; - @EventHandler - public void PlayerDeath(PlayerQuitEvent event) - { - Form form = _forms.remove(event.getPlayer()); - if (form != null) - form.Remove(); - } + if (event.getType() != UpdateType.FAST) + return; + } - @EventHandler - public void PlayerDeath(PlayerDeathEvent event) - { - if (_hiders.HasPlayer(event.getEntity())) - SetSeeker(event.getEntity(), false); - } + @EventHandler + public void WorldWaterDamage(UpdateEvent event) + { + if (!IsLive()) + return; - public void SetSeeker(Player player, boolean forced) - { - GameTeam pastTeam = GetTeam(player); - if (pastTeam != null && pastTeam.equals(_hiders)) - pastTeam.SetPlacement(player, PlayerState.OUT); + if (event.getType() != UpdateType.SEC) + return; - SetPlayerTeam(player, _seekers, true); + for (Player player : _hiders.GetPlayers(true)) + if (player.getLocation().getBlock().getTypeId() == 8 || player.getLocation().getBlock().getTypeId() == 9) + { + // Damage Event + Manager.GetDamage().NewDamageEvent(player, null, null, DamageCause.DROWNING, 2, false, false, false, "Water", + "Water Damage"); - // Remove Form - Form form = _forms.remove(player); - if (form != null) - form.Remove(); + player.getWorld().playSound(player.getLocation(), Sound.SPLASH, 0.8f, 1f + (float) Math.random() / 2); + } + } + + @EventHandler + public void PlayerDeath(PlayerQuitEvent event) + { + Form form = _forms.remove(event.getPlayer()); + if (form != null) + form.Remove(); + } + + @EventHandler + public void PlayerDeath(PlayerDeathEvent event) + { + if (_hiders.HasPlayer(event.getEntity())) + SetSeeker(event.getEntity(), false); + } + + public void SetSeeker(Player player, boolean forced) + { + GameTeam pastTeam = GetTeam(player); + if (pastTeam != null && pastTeam.equals(_hiders)) + pastTeam.SetPlacement(player, PlayerState.OUT); + + SetPlayerTeam(player, _seekers, true); + + // Remove Form + Form form = _forms.remove(player); + if (form != null) + form.Remove(); // Remove Disguise DisguiseBase disguise = Manager.GetDisguise().getActiveDisguise(player); @@ -1148,544 +1137,542 @@ public class HideSeek extends TeamGame { Manager.GetDisguise().undisguise(disguise); } - // Kit - SetKit(player, GetKits()[5], false); - GetKits()[5].ApplyKit(player); - - // Refresh - VisibilityManager.Instance.refreshPlayerToAll(player); - - if (forced) - { - AddGems(player, 10, "Forced Seeker", false, false); - - Announce(F.main("Game", - F.elem(_hiders.GetColor() + player.getName()) + " was moved to " + F.elem(C.cRed + C.Bold + "Hunters") + ".")); - - player.getWorld().strikeLightningEffect(player.getLocation()); - - player.damage(1000); - } - - UtilPlayer.message(player, C.cRed + C.Bold + "You are now a Hunter!"); - - player.eject(); - player.leaveVehicle(); - player.teleport(_seekers.GetSpawn()); - } - - @Override - public void EndCheck() - { - if (!IsLive()) - return; - - if (GetPlayers(true).isEmpty()) - { - SetState(GameState.End); - return; - } - - if (_hiders.GetPlayers(true).isEmpty()) - { - ArrayList places = _hiders.GetPlacements(true); - - AnnounceEnd(_hiders.GetPlacements(true)); - - // Gems - if (places.size() >= 1) - AddGems(places.get(0), 20, "1st Place", false, false); - - if (places.size() >= 2) - AddGems(places.get(1), 15, "2nd Place", false, false); - - if (places.size() >= 3) - AddGems(places.get(2), 10, "3rd Place", false, false); - - for (Player player : GetPlayers(false)) - if (player.isOnline()) - AddGems(player, 10, "Participation", false, false); - - SetState(GameState.End); - } - } - - @Override - public double GetKillsGems(Player killer, Player killed, boolean assist) - { - if (_hiders.HasPlayer(killed)) - { - if (!assist) - return 4; - else - return 1; - } - - if (!assist) - return 1; - - return 0; - } - - @EventHandler - public void AnnounceHideTime(GameStateChangeEvent event) - { - if (event.GetState() != GameState.Live) - return; - - Announce(C.cAqua + C.Bold + "Hiders have 20 Seconds to hide!"); - } - - @EventHandler - public void Timer(UpdateEvent event) - { - if (GetState() != GameState.Live) - return; - - if (event.getType() != UpdateType.TICK) - return; - - - - // Hide Time - if (!_started) - { - long timeLeft = _hideTime - (System.currentTimeMillis() - GetStateTime()); - - if (timeLeft <= 0) - { - _started = true; - - // Hider Items - GiveItems(false); - _bowGiveTime = System.currentTimeMillis(); - - // Remove Barrier - for (Location loc : WorldData.GetDataLocs("BLACK")) - loc.getBlock().setType(Material.AIR); - - Announce(C.cRed + C.Bold + "The Hunters have been released!"); - } - } - // Seek Time - else - { - //Give Bow - if (!_bowGiven && UtilTime.elapsed(_bowGiveTime, 10000)) - { - GiveItems(true); - _bowGiven = true; - } - - long timeLeft = _gameTime - (System.currentTimeMillis() - GetStateTime() - _hideTime); - - if (timeLeft <= 0) - { - WriteScoreboard(); - - AnnounceEnd(_hiders); - - for (Player player : _hiders.GetPlayers(true)) - AddGems(player, 10, "Winning Team", false, false); - - for (Player player : GetPlayers(false)) - if (player.isOnline()) - AddGems(player, 10, "Participation", false, false); - - SetState(GameState.End); - } - } - } - - @Override - @EventHandler - public void ScoreboardUpdate(UpdateEvent event) - { - if (event.getType() != UpdateType.FAST) - return; - - WriteScoreboard(); - } - - private void WriteScoreboard() - { - // Wipe Last - Scoreboard.reset(); - - for (GameTeam team : this.GetTeamList()) - { - Scoreboard.writeNewLine(); - Scoreboard.write(team.GetPlayers(true).size() + " " + team.GetColor() + team.GetName()); - } - - if (!_started) - { - long timeLeft = _hideTime - (System.currentTimeMillis() - GetStateTime()); - - Scoreboard.writeNewLine(); - Scoreboard.write(C.cYellow + C.Bold + "Hide Time"); - Scoreboard.write(UtilTime.MakeStr(Math.max(0, timeLeft), 0)); - } - else - { - long timeLeft = _gameTime - (System.currentTimeMillis() - GetStateTime() - _hideTime); - - Scoreboard.writeNewLine(); - Scoreboard.write(C.cYellow + C.Bold + "Seek Time"); - Scoreboard.write(UtilTime.MakeStr(Math.max(0, timeLeft), 0)); - } - - Scoreboard.draw(); - } - - @Override - public GameTeam ChooseTeam(Player player) - { - if (CanJoinTeam(_seekers)) - return _seekers; - - return _hiders; - } - - @Override - public boolean CanJoinTeam(GameTeam team) - { - if (team.GetColor() == ChatColor.RED) - { - return team.GetSize() < Math.max(1, GetPlayers(true).size() / 5); - } - - return true; - } - - @Override - public boolean CanThrowTNT(Location location) - { - for (Location loc : _seekers.GetSpawns()) - if (UtilMath.offset(loc, location) < 24) - return false; - - return true; - } - - @Override - public DeathMessageType GetDeathMessageType() - { - return DeathMessageType.Detailed; - } - - @EventHandler - public void UsableCancel(PlayerInteractEvent event) - { - if (event.getClickedBlock() == null) - return; - - if (UtilBlock.usable(event.getClickedBlock())) - event.setCancelled(true); - - if (event.getClickedBlock().getType() == Material.WOODEN_DOOR) - { - event.setCancelled(false); - } - } - - public GameTeam getHiders() - { - return _hiders; - } - - public GameTeam getSeekers() - { - return _seekers; - } - - @EventHandler - public void InfestDisguise(PlayerInteractEvent event) - { - if (event.getClickedBlock() == null) - return; - - final Player player = event.getPlayer(); - - final Block block = event.getClickedBlock(); - - if (!UtilGear.isMat(player.getItemInHand(), Material.MAGMA_CREAM)) - return; - - if (!_allowedBlocks.contains(block.getType())) - { - UtilPlayer.message( - player, - F.main("Game", - "You cannot infest " - + F.elem(ItemStackFactory.Instance.GetName(block.getType(), (byte) 0, false) + " Block") - + ".")); - return; - } - - if (block.getRelative(BlockFace.UP).getType() != Material.AIR - || _infested.values().contains(block.getRelative(BlockFace.UP))) - { - UtilPlayer.message(player, F.main("Game", "You can only infest blocks with air above them.")); - return; - } - - if (IsInfesting(player) || _infestDeny.contains(player)) - { - UtilPlayer.message(player, F.main("Game", "You are already infesting something.")); - return; - } - - if (!Recharge.Instance.use(player, "Infest", 8000, true, true)) - return; - - // Cloak - InfestStart(player); - - // Data - final InfestedData data = new InfestedData(block); - - // Teleport - player.teleport(block.getLocation().add(0.5, 0, 0.5)); - - // Fake Block - UtilServer.getServer().getScheduler().runTaskLater(Manager.getPlugin(), new Runnable() - { - @Override - public void run() - { - if (block.getType() == Material.AIR) - { - player.sendBlockChange(block.getLocation(), 36, (byte) 0); - for (Player other : UtilServer.getPlayers()) - if (!other.equals(player)) - other.sendBlockChange(block.getLocation(), data.Material, data.Data); - } - } - - }, 5); - - _infested.put(player, data); - } - - @EventHandler - public void InfestDisguise(PlayerInteractEntityEvent event) - { - if (event.getRightClicked() == null) - return; - - Player player = event.getPlayer(); - - if (!UtilGear.isMat(player.getItemInHand(), Material.MAGMA_CREAM)) - return; - - if (!_allowedEnts.contains(event.getRightClicked().getType())) - { - UtilPlayer.message(player, - F.main("Game", "You cannot infest " + F.elem(UtilEnt.getName(event.getRightClicked())) + ".")); - return; - } - - if (IsInfesting(player) || _infestDeny.contains(player)) - { - UtilPlayer.message(player, F.main("Game", "You are already infesting something.")); - return; - } - - if (!Recharge.Instance.use(player, "Infest", 8000, inform(), true)) - return; - - // Cloak - InfestStart(player); - - // Infest - event.getRightClicked().setPassenger(player); - } - - @EventHandler - public void InfestDisguise(CustomDamageEvent event) - { - Player player = event.GetDamagerPlayer(false); - if (player == null) - return; - - if (!UtilGear.isMat(player.getItemInHand(), Material.MAGMA_CREAM)) - return; - - if (!_allowedEnts.contains(event.GetDamageeEntity().getType())) - { - UtilPlayer.message(player, - F.main("Game", "You cannot morph into " + F.elem(UtilEnt.getName(event.GetDamageeEntity())) + ".")); - return; - } - - if (IsInfesting(player) || _infestDeny.contains(player)) - { - UtilPlayer.message(player, F.main("Game", "You are already infesting something.")); - return; - } - - if (!Recharge.Instance.use(player, "Infest", 8000, inform(), true)) - return; - - // Cloak - InfestStart(player); - - // Infest - event.GetDamageeEntity().setPassenger(player); - } - - @EventHandler(priority = EventPriority.LOW) - public void InfectDamageShuffleUp(CustomDamageEvent event) - { - if (event.GetDamageePlayer() == null) - { - if (event.GetDamageeEntity().getPassenger() != null - && event.GetDamageeEntity().getPassenger() instanceof LivingEntity) - { - LivingEntity passenger = (LivingEntity) event.GetDamageeEntity().getPassenger(); - - // Leave - event.GetDamageeEntity().eject(); - passenger.leaveVehicle(); - - // End - InfestEnd(passenger); - - // Damage Event - Manager.GetDamage().NewDamageEvent(passenger, event.GetDamagerEntity(true), null, DamageCause.CUSTOM, 4, true, - true, false, UtilEnt.getName(event.GetDamagerEntity(true)), null); - } - } - } - - @EventHandler - public void InfestBlockDamage(BlockDamageEvent event) - { - if (!_seekers.HasPlayer(event.getPlayer())) - return; - - for (Player player : _infested.keySet()) - { - if (!_infested.get(player).Block.equals(event.getBlock())) - continue; - - // Damage Event - Manager.GetDamage().NewDamageEvent(player, event.getPlayer(), null, DamageCause.CUSTOM, 4, true, true, false, - event.getPlayer().getName(), null); - - // Remove - _infested.remove(player).restore(); - - // End - InfestEnd(player); - } - } - - @EventHandler - public void InfestLeave(VehicleExitEvent event) - { - if (!IsLive()) - return; - - InfestEnd(event.getExited()); - } - - @EventHandler - public void InfestLeave(UpdateEvent event) - { - if (event.getType() != UpdateType.TICK) - return; - - // Block Leave - Iterator infestIterator = _infested.keySet().iterator(); - while (infestIterator.hasNext()) - { - Player player = infestIterator.next(); - - InfestedData data = _infested.get(player); - - // Update - if (data.Block.getType() == Material.AIR) - { - player.sendBlockChange(data.Block.getLocation(), 36, (byte) 0); - for (Player other : UtilServer.getPlayers()) - if (!other.equals(player)) - other.sendBlockChange(data.Block.getLocation(), data.Material, data.Data); - } - - if (!player.getLocation().getBlock().equals(data.Block)) - { - // End - InfestEnd(player); - - // Restore Block - data.restore(); - - infestIterator.remove(); - } - } - - // Invisible - for (Player player : GetPlayers(true)) - { - if (!(GetKit(player) instanceof KitHiderInfestor)) - continue; - - if (_infested.containsKey(player) || player.getVehicle() != null) - Manager.GetCondition().Factory().Cloak("Infest", player, player, 1.9, false, false); - } - } - - public void InfestStart(LivingEntity ent) - { - UtilParticle.PlayParticle(ParticleType.SLIME, ent.getLocation().add(0, 0.6, 0), 0.3f, 0.3f, 0.3f, 0, 24, + // Kit + SetKit(player, GetKits()[5], false); + GetKits()[5].ApplyKit(player); + + // Refresh + VisibilityManager.Instance.refreshPlayerToAll(player); + + if (forced) + { + AddGems(player, 10, "Forced Seeker", false, false); + + Announce(F.main("Game", + F.elem(_hiders.GetColor() + player.getName()) + " was moved to " + F.elem(C.cRed + C.Bold + "Hunters") + ".")); + + player.getWorld().strikeLightningEffect(player.getLocation()); + + player.damage(1000); + } + + UtilPlayer.message(player, C.cRed + C.Bold + "You are now a Hunter!"); + + player.eject(); + player.leaveVehicle(); + player.teleport(_seekers.GetSpawn()); + } + + @Override + public void EndCheck() + { + if (!IsLive()) + return; + + if (GetPlayers(true).isEmpty()) + { + SetState(GameState.End); + return; + } + + if (_hiders.GetPlayers(true).isEmpty()) + { + ArrayList places = _hiders.GetPlacements(true); + + AnnounceEnd(_hiders.GetPlacements(true)); + + // Gems + if (places.size() >= 1) + AddGems(places.get(0), 20, "1st Place", false, false); + + if (places.size() >= 2) + AddGems(places.get(1), 15, "2nd Place", false, false); + + if (places.size() >= 3) + AddGems(places.get(2), 10, "3rd Place", false, false); + + for (Player player : GetPlayers(false)) + if (player.isOnline()) + AddGems(player, 10, "Participation", false, false); + + SetState(GameState.End); + } + } + + @Override + public double GetKillsGems(Player killer, Player killed, boolean assist) + { + if (_hiders.HasPlayer(killed)) + { + if (!assist) + return 4; + else + return 1; + } + + if (!assist) + return 1; + + return 0; + } + + @EventHandler + public void AnnounceHideTime(GameStateChangeEvent event) + { + if (event.GetState() != GameState.Live) + return; + + Announce(C.cAqua + C.Bold + "Hiders have 20 Seconds to hide!"); + } + + @EventHandler + public void Timer(UpdateEvent event) + { + if (GetState() != GameState.Live) + return; + + if (event.getType() != UpdateType.TICK) + return; + + + // Hide Time + if (!_started) + { + long timeLeft = _hideTime - (System.currentTimeMillis() - GetStateTime()); + + if (timeLeft <= 0) + { + _started = true; + + // Hider Items + GiveItems(false); + _bowGiveTime = System.currentTimeMillis(); + + // Remove Barrier + for (Location loc : WorldData.GetDataLocs("BLACK")) + loc.getBlock().setType(Material.AIR); + + Announce(C.cRed + C.Bold + "The Hunters have been released!"); + } + } + // Seek Time + else + { + //Give Bow + if (!_bowGiven && UtilTime.elapsed(_bowGiveTime, 10000)) + { + GiveItems(true); + _bowGiven = true; + } + + long timeLeft = _gameTime - (System.currentTimeMillis() - GetStateTime() - _hideTime); + + if (timeLeft <= 0) + { + WriteScoreboard(); + + AnnounceEnd(_hiders); + + for (Player player : _hiders.GetPlayers(true)) + AddGems(player, 10, "Winning Team", false, false); + + for (Player player : GetPlayers(false)) + if (player.isOnline()) + AddGems(player, 10, "Participation", false, false); + + SetState(GameState.End); + } + } + } + + @Override + @EventHandler + public void ScoreboardUpdate(UpdateEvent event) + { + if (event.getType() != UpdateType.FAST) + return; + + WriteScoreboard(); + } + + private void WriteScoreboard() + { + // Wipe Last + Scoreboard.reset(); + + for (GameTeam team : this.GetTeamList()) + { + Scoreboard.writeNewLine(); + Scoreboard.write(team.GetPlayers(true).size() + " " + team.GetColor() + team.GetName()); + } + + if (!_started) + { + long timeLeft = _hideTime - (System.currentTimeMillis() - GetStateTime()); + + Scoreboard.writeNewLine(); + Scoreboard.write(C.cYellow + C.Bold + "Hide Time"); + Scoreboard.write(UtilTime.MakeStr(Math.max(0, timeLeft), 0)); + } else + { + long timeLeft = _gameTime - (System.currentTimeMillis() - GetStateTime() - _hideTime); + + Scoreboard.writeNewLine(); + Scoreboard.write(C.cYellow + C.Bold + "Seek Time"); + Scoreboard.write(UtilTime.MakeStr(Math.max(0, timeLeft), 0)); + } + + Scoreboard.draw(); + } + + @Override + public GameTeam ChooseTeam(Player player) + { + if (CanJoinTeam(_seekers)) + return _seekers; + + return _hiders; + } + + @Override + public boolean CanJoinTeam(GameTeam team) + { + if (team.GetColor() == ChatColor.RED) + { + return team.GetSize() < Math.max(1, GetPlayers(true).size() / 5); + } + + return true; + } + + @Override + public boolean CanThrowTNT(Location location) + { + for (Location loc : _seekers.GetSpawns()) + if (UtilMath.offset(loc, location) < 24) + return false; + + return true; + } + + @Override + public DeathMessageType GetDeathMessageType() + { + return DeathMessageType.Detailed; + } + + @EventHandler + public void UsableCancel(PlayerInteractEvent event) + { + if (event.getClickedBlock() == null) + return; + + if (UtilBlock.usable(event.getClickedBlock())) + event.setCancelled(true); + + if (event.getClickedBlock().getType() == Material.WOODEN_DOOR) + { + event.setCancelled(false); + } + } + + public GameTeam getHiders() + { + return _hiders; + } + + public GameTeam getSeekers() + { + return _seekers; + } + + @EventHandler + public void InfestDisguise(PlayerInteractEvent event) + { + if (event.getClickedBlock() == null) + return; + + final Player player = event.getPlayer(); + + final Block block = event.getClickedBlock(); + + if (!UtilGear.isMat(player.getItemInHand(), Material.MAGMA_CREAM)) + return; + + if (!_allowedBlocks.contains(block.getType())) + { + UtilPlayer.message( + player, + F.main("Game", + "You cannot infest " + + F.elem(ItemStackFactory.Instance.GetName(block.getType(), (byte) 0, false) + " Block") + + ".")); + return; + } + + if (block.getRelative(BlockFace.UP).getType() != Material.AIR + || _infested.values().contains(block.getRelative(BlockFace.UP))) + { + UtilPlayer.message(player, F.main("Game", "You can only infest blocks with air above them.")); + return; + } + + if (IsInfesting(player) || _infestDeny.contains(player)) + { + UtilPlayer.message(player, F.main("Game", "You are already infesting something.")); + return; + } + + if (!Recharge.Instance.use(player, "Infest", 8000, true, true)) + return; + + // Cloak + InfestStart(player); + + // Data + final InfestedData data = new InfestedData(block); + + // Teleport + player.teleport(block.getLocation().add(0.5, 0, 0.5)); + + // Fake Block + UtilServer.getServer().getScheduler().runTaskLater(Manager.getPlugin(), new Runnable() + { + @Override + public void run() + { + if (block.getType() == Material.AIR) + { + player.sendBlockChange(block.getLocation(), 36, (byte) 0); + for (Player other : UtilServer.getPlayers()) + if (!other.equals(player)) + other.sendBlockChange(block.getLocation(), data.Material, data.Data); + } + } + + }, 5); + + _infested.put(player, data); + } + + @EventHandler + public void InfestDisguise(PlayerInteractEntityEvent event) + { + if (event.getRightClicked() == null) + return; + + Player player = event.getPlayer(); + + if (!UtilGear.isMat(player.getItemInHand(), Material.MAGMA_CREAM)) + return; + + if (!_allowedEnts.contains(event.getRightClicked().getType())) + { + UtilPlayer.message(player, + F.main("Game", "You cannot infest " + F.elem(UtilEnt.getName(event.getRightClicked())) + ".")); + return; + } + + if (IsInfesting(player) || _infestDeny.contains(player)) + { + UtilPlayer.message(player, F.main("Game", "You are already infesting something.")); + return; + } + + if (!Recharge.Instance.use(player, "Infest", 8000, inform(), true)) + return; + + // Cloak + InfestStart(player); + + // Infest + event.getRightClicked().setPassenger(player); + } + + @EventHandler + public void InfestDisguise(CustomDamageEvent event) + { + Player player = event.GetDamagerPlayer(false); + if (player == null) + return; + + if (!UtilGear.isMat(player.getItemInHand(), Material.MAGMA_CREAM)) + return; + + if (!_allowedEnts.contains(event.GetDamageeEntity().getType())) + { + UtilPlayer.message(player, + F.main("Game", "You cannot morph into " + F.elem(UtilEnt.getName(event.GetDamageeEntity())) + ".")); + return; + } + + if (IsInfesting(player) || _infestDeny.contains(player)) + { + UtilPlayer.message(player, F.main("Game", "You are already infesting something.")); + return; + } + + if (!Recharge.Instance.use(player, "Infest", 8000, inform(), true)) + return; + + // Cloak + InfestStart(player); + + // Infest + event.GetDamageeEntity().setPassenger(player); + } + + @EventHandler(priority = EventPriority.LOW) + public void InfectDamageShuffleUp(CustomDamageEvent event) + { + if (event.GetDamageePlayer() == null) + { + if (event.GetDamageeEntity().getPassenger() != null + && event.GetDamageeEntity().getPassenger() instanceof LivingEntity) + { + LivingEntity passenger = (LivingEntity) event.GetDamageeEntity().getPassenger(); + + // Leave + event.GetDamageeEntity().eject(); + passenger.leaveVehicle(); + + // End + InfestEnd(passenger); + + // Damage Event + Manager.GetDamage().NewDamageEvent(passenger, event.GetDamagerEntity(true), null, DamageCause.CUSTOM, 4, true, + true, false, UtilEnt.getName(event.GetDamagerEntity(true)), null); + } + } + } + + @EventHandler + public void InfestBlockDamage(BlockDamageEvent event) + { + if (!_seekers.HasPlayer(event.getPlayer())) + return; + + for (Player player : _infested.keySet()) + { + if (!_infested.get(player).Block.equals(event.getBlock())) + continue; + + // Damage Event + Manager.GetDamage().NewDamageEvent(player, event.getPlayer(), null, DamageCause.CUSTOM, 4, true, true, false, + event.getPlayer().getName(), null); + + // Remove + _infested.remove(player).restore(); + + // End + InfestEnd(player); + } + } + + @EventHandler + public void InfestLeave(VehicleExitEvent event) + { + if (!IsLive()) + return; + + InfestEnd(event.getExited()); + } + + @EventHandler + public void InfestLeave(UpdateEvent event) + { + if (event.getType() != UpdateType.TICK) + return; + + // Block Leave + Iterator infestIterator = _infested.keySet().iterator(); + while (infestIterator.hasNext()) + { + Player player = infestIterator.next(); + + InfestedData data = _infested.get(player); + + // Update + if (data.Block.getType() == Material.AIR) + { + player.sendBlockChange(data.Block.getLocation(), 36, (byte) 0); + for (Player other : UtilServer.getPlayers()) + if (!other.equals(player)) + other.sendBlockChange(data.Block.getLocation(), data.Material, data.Data); + } + + if (!player.getLocation().getBlock().equals(data.Block)) + { + // End + InfestEnd(player); + + // Restore Block + data.restore(); + + infestIterator.remove(); + } + } + + // Invisible + for (Player player : GetPlayers(true)) + { + if (!(GetKit(player) instanceof KitHiderInfestor)) + continue; + + if (_infested.containsKey(player) || player.getVehicle() != null) + Manager.GetCondition().Factory().Cloak("Infest", player, player, 1.9, false, false); + } + } + + public void InfestStart(LivingEntity ent) + { + UtilParticle.PlayParticle(ParticleType.SLIME, ent.getLocation().add(0, 0.6, 0), 0.3f, 0.3f, 0.3f, 0, 24, ViewDist.MAX, UtilServer.getPlayers()); - ent.getWorld().playSound(ent.getLocation(), Sound.SLIME_ATTACK, 2f, 1f); - ent.getWorld().playSound(ent.getLocation(), Sound.SLIME_ATTACK, 2f, 1f); + ent.getWorld().playSound(ent.getLocation(), Sound.SLIME_ATTACK, 2f, 1f); + ent.getWorld().playSound(ent.getLocation(), Sound.SLIME_ATTACK, 2f, 1f); - Manager.GetCondition().Factory().Cloak("Infest", ent, ent, 1.9, false, false); + Manager.GetCondition().Factory().Cloak("Infest", ent, ent, 1.9, false, false); - // Gets rid of timer, not needed until end - Recharge.Instance.recharge((Player) ent, "Infest"); + // Gets rid of timer, not needed until end + Recharge.Instance.recharge((Player) ent, "Infest"); - _infestDeny.add(ent); - } + _infestDeny.add(ent); + } - public void InfestEnd(LivingEntity ent) - { - Manager.GetCondition().EndCondition(ent, null, "Infest"); + public void InfestEnd(LivingEntity ent) + { + Manager.GetCondition().EndCondition(ent, null, "Infest"); - ent.getWorld().playSound(ent.getLocation(), Sound.SLIME_ATTACK, 2f, 0.6f); + ent.getWorld().playSound(ent.getLocation(), Sound.SLIME_ATTACK, 2f, 0.6f); - if (ent instanceof Player) - { - Recharge.Instance.recharge((Player) ent, "Infest"); - Recharge.Instance.use((Player) ent, "Infest", 8000, true, true); - _infestDeny.remove(ent); - } - } + if (ent instanceof Player) + { + Recharge.Instance.recharge((Player) ent, "Infest"); + Recharge.Instance.use((Player) ent, "Infest", 8000, true, true); + _infestDeny.remove(ent); + } + } - public boolean IsInfesting(LivingEntity ent) - { - if (_infested.containsKey(ent)) - return true; + public boolean IsInfesting(LivingEntity ent) + { + if (_infested.containsKey(ent)) + return true; - return ent.getVehicle() != null; - } - - public HashMap getForms() - { - return _forms; - } - - public ArrayList getAllowedBlocks() - { - return _allowedBlocks; - } - - public boolean inform() - { - return true; - } + return ent.getVehicle() != null; + } + + public HashMap getForms() + { + return _forms; + } + + public ArrayList getAllowedBlocks() + { + return _allowedBlocks; + } + + public boolean inform() + { + return true; + } }