diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/event/EventGame.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/event/EventGame.java index 05d1c8508..31e1a164a 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/event/EventGame.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/event/EventGame.java @@ -1,53 +1,83 @@ package nautilus.game.arcade.game.games.event; +import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.List; +import mineplex.core.common.util.Callback; +import mineplex.core.common.util.F; import mineplex.core.common.util.NautHashMap; import mineplex.core.common.util.UtilAction; import mineplex.core.common.util.UtilAlg; import mineplex.core.common.util.UtilBlock; import mineplex.core.common.util.UtilEnt; +import mineplex.core.common.util.UtilEvent; import mineplex.core.common.util.UtilInv; import mineplex.core.common.util.UtilMath; +import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilTime; import mineplex.core.disguise.disguises.DisguiseBase; import mineplex.core.disguise.disguises.DisguiseBat; import mineplex.core.disguise.disguises.DisguiseChicken; import mineplex.core.disguise.disguises.DisguiseEnderman; import mineplex.core.disguise.disguises.DisguiseWither; import mineplex.core.gadget.event.GadgetActivateEvent; +import mineplex.core.gadget.types.Gadget; +import mineplex.core.gadget.types.GadgetType; +import mineplex.core.give.Give; +import mineplex.core.mount.Mount; import mineplex.core.mount.event.MountActivateEvent; import mineplex.core.recharge.Recharge; import mineplex.core.shop.item.SalesPackageBase; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; import mineplex.core.visibility.VisibilityManager; +import mineplex.minecraft.game.core.damage.CustomDamageEvent; import nautilus.game.arcade.ArcadeManager; import nautilus.game.arcade.GameType; +import nautilus.game.arcade.events.GameStateChangeEvent; import nautilus.game.arcade.game.Game; -import nautilus.game.arcade.game.SoloGame; -import nautilus.game.arcade.game.Game.GameState; import nautilus.game.arcade.game.games.event.kits.KitPlayer; +import nautilus.game.arcade.game.games.sheep.kits.KitBrute; import nautilus.game.arcade.kit.Kit; import nautilus.game.arcade.managers.GameHostManager; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; import org.bukkit.Effect; import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.block.BlockFace; +import org.bukkit.block.Sign; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockRedstoneEvent; +import org.bukkit.event.block.SignChangeEvent; import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; +import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.event.entity.EntityExplodeEvent; +import org.bukkit.event.player.PlayerDropItemEvent; +import org.bukkit.event.player.PlayerInteractEntityEvent; +import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerToggleFlightEvent; import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import com.sun.xml.internal.ws.resources.UtilMessages; public class EventGame extends Game { @@ -65,6 +95,11 @@ public class EventGame extends Game private boolean _allowAllGadgets = false; private HashSet _gadgetWhitelist = new HashSet(); + + private HashMap _functionSigns; + private ArrayList _powerdedSigns; + + private HashMap _customAreas; public EventGame(ArcadeManager manager) { @@ -105,13 +140,82 @@ public class EventGame extends Game this.InventoryClick = true; this.InventoryOpenBlock = true; this.InventoryOpenChest = true; + //Dont timeout this.GameTimeout = -1; _mps = manager.GetGameHostManager(); + _functionSigns = new HashMap<>(); + _powerdedSigns = new ArrayList<>(); this.CreatureAllow = true; + + _customAreas = new HashMap<>(); + } + + @EventHandler + public void registerSigns(GameStateChangeEvent event) + { + if(event.GetState() != GameState.Live) + return; + + for(Location loc : WorldData.GetDataLocs("RED")) + { + for(int i = -5; i < 5; i++) + { + Location temp = loc.clone().add(0, i, 0); + if(temp.getBlock().getType() == Material.SIGN_POST || temp.getBlock().getType() == Material.WALL_SIGN) + { + if(!_functionSigns.containsKey((Sign) temp.getBlock().getState())) + { + _functionSigns.put((Sign) temp.getBlock().getState(), System.currentTimeMillis()); + } + } + } + } + } + + @EventHandler + public void registerAreas(GameStateChangeEvent event) + { + if(event.GetState() != GameState.Live) + return; + + for(String name : WorldData.GetAllCustomLocs().keySet()) + { + try + { + EventArea area = new EventArea(Integer.parseInt(name.split(" ")[0])); + Location tempA = WorldData.GetAllCustomLocs().get(name).get(0); + Location tempB = WorldData.GetAllCustomLocs().get(name).get(1); + area.CornerA = new Location(tempA.getWorld(), Math.min(tempA.getX(), tempB.getX()), Math.min(tempA.getY(), tempB.getY()), Math.min(tempA.getZ(), tempB.getZ())); + area.CornerB = new Location(tempA.getWorld(), Math.max(tempA.getX(), tempB.getX()), Math.max(tempA.getY(), tempB.getY()), Math.max(tempA.getZ(), tempB.getZ())); + area.DamageAll = name.contains("ALL"); + area.DamagePvP = name.contains("PVP"); + area.DamagePvE = name.contains("PVE"); + area.DamageEvP = name.contains("EVP"); + area.Usable = true; + _customAreas.put(Integer.parseInt(name.split(" ")[0]), area); + } + catch (Exception e) + { + System.out.println("Error while parsing area locs"); + } + } + } + + @EventHandler + public void signPlace(SignChangeEvent event) + { + if(!IsLive()) + return; + + if(!Manager.GetGameHostManager().isAdmin(event.getPlayer(), true)) + return; + + if(event.getLine(0).startsWith("[") && event.getLine(0).endsWith("]")) + _functionSigns.put((Sign) event.getBlock().getState(), System.currentTimeMillis()); } //Before GamePlayerManager puts onto Spec! @@ -464,4 +568,733 @@ public class EventGame extends Game return losers; } + /*@EventHandler + public void signCheck(BlockRedstoneEvent event) + { + if(event.getBlock().getType() != Material.SIGN_POST && event.getBlock().getType() != Material.WALL_SIGN) + return; + + useSign(((Sign) event.getBlock().getState()).getLines()); + }*/ + + @EventHandler + public void signClock(UpdateEvent event) + { + if(event.getType() != UpdateType.TICK) + return; + + for(Sign sign : _functionSigns.keySet()) + { + + Sign cooldown = null; + + for(BlockFace face : BlockFace.values()) + { + if(face == BlockFace.UP) + continue; + + if(sign.getBlock().getRelative(BlockFace.DOWN).getRelative(face).getType() == Material.WALL_SIGN) + { + cooldown = (Sign) sign.getBlock().getRelative(BlockFace.DOWN).getRelative(face).getState(); + break; + } + } + + if(cooldown == null) + { + if(!sign.getBlock().isBlockPowered()) + { + _powerdedSigns.remove(sign); + continue; + } + + if(_powerdedSigns.contains(sign)) + continue; + + useSign(sign, ((Sign) sign.getBlock().getState()).getLines()); + + if(sign.getBlock().isBlockPowered()) + { + if(!_powerdedSigns.contains(sign)) + { + _powerdedSigns.add(sign); + } + } + continue; + } + + if(!sign.getBlock().isBlockPowered() && !UtilTime.elapsed(_functionSigns.get(sign), Long.parseLong(cooldown.getLine(0)) * 1000)) + continue; + + if(!sign.getBlock().isBlockPowered()) + { + _powerdedSigns.remove(sign); + } + + if(_powerdedSigns.contains(sign)) + continue; + + _functionSigns.put(sign, System.currentTimeMillis()); + useSign(sign, ((Sign) sign.getBlock().getState()).getLines()); + + if(sign.getBlock().isBlockPowered()) + { + if(!_powerdedSigns.contains(sign)) + { + _powerdedSigns.add(sign); + } + } + } + } + + public void useSign(final Sign sign, String[] args) + { + String command = args[0]; + String playerName = args[1]; + + HashMap> varMap = new HashMap<>(); + + int i = 0; + for(String varArgs : args) + { + ArrayList players = new ArrayList<>(); + if(Bukkit.getPlayer(varArgs) != null) + players.add(Bukkit.getPlayer(varArgs)); + + if(varArgs.contentEquals("@p")) + { + for(Player player : GetPlayers(true)) + { + boolean found; + found = true; + for(Player otherPlayer : GetPlayers(true)) + { + if(player == otherPlayer) + continue; + + if(UtilMath.offset(sign.getLocation(), player.getLocation()) >= UtilMath.offset(sign.getLocation(), otherPlayer.getLocation())) + { + found = false; + break; + } + } + if(found) + { + players.add(player); + break; + } + } + } + if(playerName.contains("@a")) + { + int radius = 0; + if(playerName.contains("r=")) + { + try + { + radius = Integer.parseInt(playerName.split("=")[1]); + } + catch (Exception e) {} + } + for(Player player : GetPlayers(true)) + { + if(UtilMath.offset(sign.getLocation(), player.getLocation()) <= radius || radius <= 0) + players.add(player); + } + } + + varMap.put(i, players); + i++; + } + + if(command.contentEquals("[BC]")) + { + String message = args[1]; + for(int e = 2; e <= 3; e++) + message += " " + args[e]; + + String colored = ChatColor.translateAlternateColorCodes('&', message); + this.Announce(F.main("Event", colored), true); + } + + if(command.contentEquals("[TELEPORT]")) + { + for(Player player : varMap.get(1)) + { + if(Bukkit.getPlayer(args[2]) != null) + { + player.teleport(Bukkit.getPlayer(args[2])); + } + else + { + String[] coords = args[2].split(" "); + int x = Integer.parseInt(coords[0]); + int y = Integer.parseInt(coords[1]); + int z = Integer.parseInt(coords[2]); + player.teleport(new Location(sign.getWorld(), x, y, z)); + } + } + } + + if(command.contentEquals("[MESSAGE]")) + { + String message = args[2]; + message += " " + args[3]; + + String colored = ChatColor.translateAlternateColorCodes('&', message); + + for(Player player : varMap.get(1)) + { + UtilPlayer.message(player, F.main("Event", colored)); + } + } + + if(command.contentEquals("[SETBLOCK]")) + { + Material mat = Material.getMaterial(Integer.parseInt(args[1])); + String[] coords = args[2].split(" "); + int x = Integer.parseInt(coords[0]); + int y = Integer.parseInt(coords[1]); + int z = Integer.parseInt(coords[2]); + sign.getWorld().getBlockAt(new Location(sign.getWorld(), x, y, z)).setType(mat); + } + + if(command.contentEquals("[TESTFOR]")) + { + boolean redstone = false; + Material mat = Material.getMaterial(Integer.parseInt(args[1])); + if(args[2].contains("r=")) + { + int radius = 0; + try + { + radius = Integer.parseInt(args[2].split("=")[1]); + if(radius >= 30) + radius = 30; + + for(int x = -radius + sign.getLocation().getBlockX(); x < radius + sign.getLocation().getBlockX(); x++) + { + for(int y = -radius + sign.getLocation().getBlockY(); y < radius + sign.getLocation().getBlockY(); y++) + { + for(int z = -radius + sign.getLocation().getBlockZ(); z < radius + sign.getLocation().getBlockZ(); z++) + { + if(sign.getWorld().getBlockAt(new Location(sign.getWorld(), x, y, z)).getType() == mat) + { + redstone = true; + } + } + } + } + } + catch (Exception e) {} + } + else + { + String[] coords = args[2].split(" "); + int x = Integer.parseInt(coords[0]); + int y = Integer.parseInt(coords[1]); + int z = Integer.parseInt(coords[2]); + if(sign.getWorld().getBlockAt(new Location(sign.getWorld(), x, y, z)).getType() == mat) + { + redstone = true; + } + } + if(redstone) + { + for(final BlockFace face : BlockFace.values()) + { + if(face != BlockFace.UP + && face != BlockFace.NORTH_WEST + && face != BlockFace.NORTH_EAST + && face != BlockFace.SOUTH_EAST + && face != BlockFace.SOUTH_WEST) + { + continue; + } + + if(sign.getBlock().getRelative(face).getType() != Material.AIR) + continue; + + if(sign.getBlock().getRelative(face).isBlockPowered()) + continue; + + sign.getBlock().getRelative(face).setType(Material.REDSTONE_BLOCK); + + Manager.runSyncLater(new Runnable() + { + + @Override + public void run() + { + sign.getBlock().getRelative(face).setType(Material.AIR); + } + + }, 3L); + } + } + } + + if(varMap.get(1).isEmpty()) + return; + + String[] vars = new String[args.length - 1]; + vars[0] = args[0]; + vars[1] = args[2]; + vars[2] = args[3]; + + String tempArgs = ""; + for(String str : vars) + { + for(String string : str.split(" ")) + { + tempArgs += string + " "; + } + } + String[] commandArgs = tempArgs.split(" "); + + if(command.contentEquals("[MOB]")) + { + for(Player player : varMap.get(1)) + Manager.GetEventModule().commandMob(player, commandArgs); + } + if(command.contentEquals("[SCORE]")) + { + for(Player player : varMap.get(1)) + Manager.GetEventModule().commandScoreboard(player, vars); + } + if(command.contentEquals("[GIVE]")) + { + try + { + for(Player player : varMap.get(1)) + { + player.getInventory().addItem(new ItemStack(Material.getMaterial(Integer.parseInt(args[2])), Integer.parseInt(args[3]))); + } + + } catch (Exception e) + { + + } + } + if(command.contentEquals("[DOUBLEJUMP]")) + { + for(Player player : varMap.get(1)) + Manager.GetEventModule().commandDoubleJump(player, vars); + } + if(command.contentEquals("[EFFECT]")) + { + //Manager.GetEventModule().commandEffect(Manager.GetGameHostManager().getHost(), commandArgs, varMap.get(1)); + for(Player player : varMap.get(1)) + { + player.addPotionEffect(new PotionEffect(PotionEffectType.getByName(args[2]), Integer.parseInt(args[3].split(" ")[0]), Integer.parseInt(args[3].split(" ")[1]))); + } + + } + if(command.contentEquals("[KIT]")) + { + for(Player player : varMap.get(1)) + Manager.GetEventModule().commandKit(player, commandArgs); + } + } + + @EventHandler + public void signBreak(BlockBreakEvent event) + { + if(event.getBlock().getType() == Material.SIGN_POST || event.getBlock().getType() == Material.WALL_SIGN || event.getBlock().getType() == Material.SIGN) + { + Iterator signIter = _functionSigns.keySet().iterator(); + while(signIter.hasNext()) + { + Sign sign = signIter.next(); + if(sign.getLocation().getBlockX() == event.getBlock().getLocation().getBlockX() + && sign.getLocation().getBlockY() == event.getBlock().getLocation().getBlockY() + && sign.getLocation().getBlockZ() == event.getBlock().getLocation().getBlockZ()) + { + signIter.remove(); + } + } + } + } + + public boolean isInArea(EventArea area, Entity entity) + { + if(entity.getLocation().getX() < area.CornerA.getX() || entity.getLocation().getX() > area.CornerB.getX()) + return false; + + if(entity.getLocation().getY() < area.CornerA.getY() || entity.getLocation().getY() > area.CornerB.getY()) + return false; + + if(entity.getLocation().getZ() < area.CornerA.getZ() || entity.getLocation().getZ() > area.CornerB.getZ()) + return false; + + return true; + } + + @EventHandler + public void activateGadget(GadgetActivateEvent event) + { + for(EventArea area : _customAreas.values()) + { + if(area.CornerA == null || area.CornerB == null) + continue; + + if(area.Usable == false) + continue; + + if(!isInArea(area, event.getPlayer())) + continue; + + if(!area.GadgetsEnabled.contains(event.getGadget())) + { + event.setCancelled(true); + } + } + } + + @EventHandler + public void areaPotionEffect(UpdateEvent event) + { + if(event.getType() != UpdateType.SEC) + return; + + for(EventArea area : _customAreas.values()) + { + for(Player player : GetPlayers(true)) + { + if(area.CornerA == null || area.CornerB == null) + continue; + + if(area.Usable == false) + continue; + + if(!isInArea(area, player)) + continue; + + for(PotionEffectType type : area.PotionEffects.keySet()) + { + player.addPotionEffect(new PotionEffect(type, 60, area.PotionEffects.get(type)), true); + } + } + } + } + + @EventHandler(ignoreCancelled=true) + public void areaDamage(CustomDamageEvent event) + { + for(EventArea area : _customAreas.values()) + { + if(area.CornerA == null || area.CornerB == null) + continue; + + if(area.Usable == false) + continue; + + if(Manager.GetEventModule().getDamagePlayers().contains(event.GetDamagerPlayer(true))) + { + if(!Manager.GetGame().DamagePvP) + { + Manager.GetGame().Damage = true; + Manager.GetGame().DamagePvP = true; + Bukkit.getPluginManager().callEvent(event); + Manager.GetGame().DamagePvP = false; + Manager.GetGame().Damage = false; + } + return; + } + + if(!isInArea(area, event.GetDamageeEntity())) + continue; + + if(!area.DamageAll) + { + event.SetCancelled("Event Area"); + continue; + } + if(event.GetCause() == DamageCause.ENTITY_ATTACK && event.GetDamagerPlayer(true) == null) + { + if(!area.DamageEvP) + { + event.SetCancelled("Event Area"); + continue; + } + } + if(!(event.GetDamageeEntity() instanceof Player)) + { + if(!area.DamagePvE) + { + event.SetCancelled("Event Area"); + continue; + } + } + if((event.GetDamageeEntity() instanceof Player) && (event.GetDamagerEntity(true) instanceof Player)) + { + if(!area.DamagePvP) + { + event.SetCancelled("Event Area"); + continue; + } + } + if(!Manager.GetGame().DamagePvP) + { + Manager.GetGame().Damage = true; + Manager.GetGame().DamagePvP = true; + Bukkit.getPluginManager().callEvent(event); + Manager.GetGame().DamagePvP = false; + Manager.GetGame().Damage = false; + } + } + } + + public void listAreaSettings(Player player) + { + for(EventArea area : _customAreas.values()) + { + UtilPlayer.message(player, F.main("Event", "============================")); + UtilPlayer.message(player, F.main("Event", "Settings for area " + area.ID)); + UtilPlayer.message(player, F.oo("Damage All", area.DamageAll) + ", " + + F.oo("Damage PvP", area.DamagePvP) + ", " + + F.oo("Damage PvE", area.DamagePvE) + + ", " + F.oo("Damage EvP", area.DamageEvP)); + + UtilPlayer.message(player, F.main("Event", "Potion Effects for area " + area.ID)); + for(PotionEffectType type : area.PotionEffects.keySet()) + UtilPlayer.message(player, F.oo(type.getName(), true) + " level: " + area.PotionEffects.get(type)); + + UtilPlayer.message(player, F.main("Event", "Gadgets for area " + area.ID)); + for(SalesPackageBase gadget : area.GadgetsEnabled) + UtilPlayer.message(player, F.oo(gadget.GetName(), true)); + } + } + + public void editArea(Player player, String[] args) + { + + if(args[1].equalsIgnoreCase("Info")) + { + listAreaSettings(player); + return; + } + try + { + if(_customAreas.containsKey(Integer.parseInt(args[1]))) + { + if(args[2].equalsIgnoreCase("Del")) + { + _customAreas.remove(Integer.parseInt(args[1])); + UtilPlayer.message(player, F.main("Event", "Region deleted")); + } + if(args[2].equalsIgnoreCase("ALL")) + { + _customAreas.get(Integer.parseInt(args[1])).DamageAll = !_customAreas.get(Integer.parseInt(args[1])).DamageAll; + UtilPlayer.message(player, F.main("Event", "Damage all for Region " + args[1] + ": " + F.tf(_customAreas.get(Integer.parseInt(args[1])).DamageAll))); + } + if(args[2].equalsIgnoreCase("PVP")) + { + _customAreas.get(Integer.parseInt(args[1])).DamagePvP = !_customAreas.get(Integer.parseInt(args[1])).DamagePvP; + UtilPlayer.message(player, F.main("Event", "Damage PvP for Region " + args[1] + ": " + F.tf(_customAreas.get(Integer.parseInt(args[1])).DamagePvP))); + } + if(args[2].equalsIgnoreCase("PVE")) + { + _customAreas.get(Integer.parseInt(args[1])).DamagePvE = !_customAreas.get(Integer.parseInt(args[1])).DamagePvE; + UtilPlayer.message(player, F.main("Event", "Damage PvE for Region " + args[1] + ": " + F.tf(_customAreas.get(Integer.parseInt(args[1])).DamagePvE))); + } + if(args[2].equalsIgnoreCase("EVP")) + { + _customAreas.get(Integer.parseInt(args[1])).DamageEvP = !_customAreas.get(Integer.parseInt(args[1])).DamageEvP; + UtilPlayer.message(player, F.main("Event", "Damage EvP for Region " + args[1] + ": " + F.tf(_customAreas.get(Integer.parseInt(args[1])).DamageEvP))); + } + if(args[2].equalsIgnoreCase("Effect")) + { + PotionEffectType type = PotionEffectType.getByName(args[3]); + if(_customAreas.get(Integer.parseInt(args[1])).PotionEffects.containsKey(type)) + { + _customAreas.get(Integer.parseInt(args[1])).PotionEffects.remove(type); + UtilPlayer.message(player, F.main("Event", "Removed potion effect from area")); + return; + } + if (type == null) + { + UtilPlayer.message(player, F.main("Effect", "Invalid Effect Type: " + args[2])); + UtilPlayer.message(player, F.value("Valid Types", "http://minecraft.gamepedia.com/Status_effect")); + return; + } + int strenght = 0; + try + { + strenght = Integer.parseInt(args[4]); + } + catch (Exception e) {} + _customAreas.get(Integer.parseInt(args[1])).PotionEffects.put(type, strenght); + UtilPlayer.message(player, F.main("Event", "Potion Effect added for Region " + args[1])); + } + if(args[2].equalsIgnoreCase("Gadget")) + { + //Gadgets + for (GadgetType type : GadgetType.values()) + { + for (Gadget gadget : Manager.getCosmeticManager().getGadgetManager().getGadgets(type)) + { + if (gadget.GetName().replaceAll(" ", "").equalsIgnoreCase(args[3])) + { + if (_customAreas.get(Integer.parseInt(args[1])).GadgetsEnabled.remove(gadget)) + { + Manager.GetGame().Announce(F.main("Inventory", F.value(gadget.GetName() + " Gadget for area " + args[1], F.ed(false)))); + } + else + { + Manager.GetGame().Announce(F.main("Inventory", F.value(gadget.GetName() + " Gadget for area " + args[1], F.ed(true)))); + _customAreas.get(Integer.parseInt(args[1])).GadgetsEnabled.add(gadget); + } + + return; + } + } + } + + //Mounts + for (Mount mount : Manager.getCosmeticManager().getMountManager().getMounts()) + { + if (mount.GetName().replaceAll(" ", "").equalsIgnoreCase(args[3])) + { + if (_customAreas.get(Integer.parseInt(args[1])).GadgetsEnabled.remove(mount)) + { + Manager.GetGame().Announce(F.main("Inventory", F.value(mount.GetName() + " Gadget for area " + args[1], F.ed(false)))); + } + else + { + Manager.GetGame().Announce(F.main("Inventory", F.value(mount.GetName() + " Gadget for area " + args[1], F.ed(true)))); + _customAreas.get(Integer.parseInt(args[1])).GadgetsEnabled.add(mount); + } + + return; + } + } + } + } + else + { + UtilPlayer.message(player, F.main("Event", "No Area Found")); + } + if(args[2].equalsIgnoreCase("Add")) + { + if(!_customAreas.containsKey(Integer.parseInt(args[1]))) + _customAreas.put(Integer.parseInt(args[1]), new EventArea(Integer.parseInt(args[1]))); + + EventArea area = _customAreas.get(Integer.parseInt(args[1])); + + if(args[3].equalsIgnoreCase("A")) + { + area.CornerA = player.getLocation(); + UtilPlayer.message(player, F.main("Event", "Corner A set!")); + } + if(args[3].equalsIgnoreCase("B")) + { + area.CornerB = player.getLocation(); + UtilPlayer.message(player, F.main("Event", "Corner B set!")); + } + if(area.CornerA != null && area.CornerB != null) + { + Location tempA = area.CornerA.clone(); + Location tempB = area.CornerB.clone(); + area.CornerA = new Location(tempA.getWorld(), Math.min(tempA.getX(), tempB.getX()), Math.min(tempA.getY(), tempB.getY()), Math.min(tempA.getZ(), tempB.getZ())); + area.CornerB = new Location(tempA.getWorld(), Math.max(tempA.getX(), tempB.getX()), Math.max(tempA.getY(), tempB.getY()), Math.max(tempA.getZ(), tempB.getZ())); + area.Usable = true; + UtilPlayer.message(player, F.main("Event", "Region is Usable")); + } + } + } + catch (Exception e) + { + UtilPlayer.message(player, F.main("Event", "Error while executing command")); + } + } + + @EventHandler + public void preventChestDrop(PlayerDropItemEvent event) + { + if(event.getItemDrop() == null) + return; + + if(event.getItemDrop().getItemStack().getType() != Material.CHEST) + return; + + if(!event.getItemDrop().getItemStack().hasItemMeta()) + return; + + event.setCancelled(true); + } + + @EventHandler + public void gemSign(final PlayerInteractEvent event) + { + if(event.getAction() != Action.RIGHT_CLICK_BLOCK) + return; + + if(event.getClickedBlock().getType() != Material.SIGN && event.getClickedBlock().getType() != Material.WALL_SIGN && event.getClickedBlock().getType() != Material.SIGN_POST) + return; + + Sign sign = (Sign) event.getClickedBlock().getState(); + if(!sign.getLine(0).contentEquals("(GEM)")) + return; + + final Material mat = Material.getMaterial(Integer.parseInt(sign.getLine(1))); + Integer price = Integer.parseInt(sign.getLine(2)); + if(price > 500) + price = 500; + + if(price <= 0) + { + UtilPlayer.message(event.getPlayer(), F.main("Event", "You got an item for free.")); + event.getPlayer().getInventory().addItem(new ItemStack(mat)); + return; + } + + if(Manager.GetDonation().Get(event.getPlayer()).GetGems() < price) + { + UtilPlayer.message(event.getPlayer(), F.main("Event", "You dont have enough Gems.")); + return; + } + + final int gems = price; + Manager.GetDonation().RewardGems(new Callback() + { + public void run(Boolean completed) + { + if (completed) + { + UtilPlayer.message(event.getPlayer(), F.main("Event", "You bought an item for " + gems + " Gems.")); + event.getPlayer().getInventory().addItem(new ItemStack(mat)); + } + } + }, "Gem Sign", event.getPlayer().getName(), event.getPlayer().getUniqueId(), -price); + } + + public class EventArea + { + + public int ID; + + public Location CornerA; + public Location CornerB; + + public boolean DamageAll; + public boolean DamagePvP; + public boolean DamagePvE; + public boolean DamageEvP; + + public boolean Usable; + + public HashMap PotionEffects; + public HashSet GadgetsEnabled; + + public EventArea(Integer id) + { + ID = id; + Usable = false; + PotionEffects = new HashMap<>(); + GadgetsEnabled = new HashSet(); + } + + } + } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/event/EventModule.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/event/EventModule.java index 537e6589c..9dc6de524 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/event/EventModule.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/event/EventModule.java @@ -12,23 +12,33 @@ import mineplex.core.common.util.C; import mineplex.core.common.util.F; import mineplex.core.common.util.NautHashMap; import mineplex.core.common.util.UtilEnt; +import mineplex.core.common.util.UtilEvent; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilSystem; import mineplex.core.common.util.UtilText; +import mineplex.core.common.util.UtilEvent.ActionType; import mineplex.core.creature.event.CreatureKillEntitiesEvent; +import mineplex.core.event.StackerEvent; +import mineplex.core.gadget.gadgets.MorphBlock; import mineplex.core.gadget.types.Gadget; import mineplex.core.gadget.types.GadgetType; import mineplex.core.give.Give; import mineplex.core.mount.Mount; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; +import mineplex.minecraft.game.core.damage.CustomDamageEvent; import nautilus.game.arcade.ArcadeManager; +import nautilus.game.arcade.events.PlayerDeathOutEvent; import org.bukkit.Bukkit; import org.bukkit.ChatColor; +import org.bukkit.Effect; import org.bukkit.GameMode; +import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.OfflinePlayer; +import org.bukkit.Sound; import org.bukkit.World; import org.bukkit.craftbukkit.v1_7_R4.entity.CraftLivingEntity; import org.bukkit.entity.Ageable; @@ -36,16 +46,19 @@ import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.entity.Skeleton; +import org.bukkit.entity.Skeleton.SkeletonType; import org.bukkit.entity.Slime; import org.bukkit.entity.Villager; +import org.bukkit.entity.Villager.Profession; import org.bukkit.entity.Wolf; import org.bukkit.entity.Zombie; -import org.bukkit.entity.Skeleton.SkeletonType; -import org.bukkit.entity.Villager.Profession; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.entity.EntityChangeBlockEvent; import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.event.player.PlayerInteractEntityEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.potion.PotionEffect; @@ -54,17 +67,26 @@ import org.bukkit.potion.PotionEffectType; public class EventModule extends MiniPlugin { - public ArcadeManager Manager; + private ArcadeManager Manager; private NautHashMap _potionEffectsDuration = new NautHashMap<>(); private NautHashMap _potionEffectsMult = new NautHashMap<>(); - private boolean _mobGriefing = true; + private boolean _mobGriefing; + + private HashSet _tempStackShift = new HashSet(); + + private ArrayList _stacker; + private ArrayList _damage; + private boolean _allowStacker; public EventModule(ArcadeManager manager, JavaPlugin plugin) { super("EventModule", plugin); Manager = manager; + _mobGriefing = true; + _stacker = new ArrayList<>(); + _damage = new ArrayList<>(); } @EventHandler @@ -110,7 +132,7 @@ public class EventModule extends MiniPlugin event.setCancelled(true); } - private void commandHelp(Player player) + public void commandHelp(Player player) { UtilPlayer.message(player, F.main("Event", "Displaying Commands;")); @@ -137,6 +159,12 @@ public class EventModule extends MiniPlugin UtilPlayer.message(player, F.value("/e give [e:#,e:#...]", "Give Item")); UtilPlayer.message(player, F.value("/e doublejump", "Toggles Double Jump")); + UtilPlayer.message(player, F.value("/e bc", "Broadcast a message with colorcodes")); + UtilPlayer.message(player, F.value("/e tempgadget", "Activates gadget for all player")); + UtilPlayer.message(player, F.value("/e playerdamage", "Toggles damage fpr player")); + UtilPlayer.message(player, F.value("/e stacker [Player]", "toggles stacker global or for Players")); + UtilPlayer.message(player, F.value("/e kick", "Remove a player from the event")); + UtilPlayer.message(player, F.value("/e area PVP|ALL|PVE|EVP|Gadget|Effect / add", "Create and edit areas")); UtilPlayer.message(player, F.value("/e scoreboard [Text]", "Sets Scoreboard Text")); @@ -151,7 +179,7 @@ public class EventModule extends MiniPlugin UtilPlayer.message(player, F.value("/e effect clear", "")); } - private void commandHelpSettings(Player player) + public void commandHelpSettings(Player player) { UtilPlayer.message(player, F.main("Event", "Displaying Settings Commands;")); UtilPlayer.message(player, F.value("/e damage all", "Toggles All Damage")); @@ -181,7 +209,7 @@ public class EventModule extends MiniPlugin //Command Handler @EventHandler(priority = EventPriority.LOWEST) - private void commandHandler(PlayerCommandPreprocessEvent event) + public void commandHandler(PlayerCommandPreprocessEvent event) { if (!Manager.GetGame().InProgress()) return; @@ -257,7 +285,7 @@ public class EventModule extends MiniPlugin } else if (args[0].equalsIgnoreCase("effect")) { - commandEffect(event.getPlayer(), args); + commandEffect(event.getPlayer(), args, null); } else if (args[0].equalsIgnoreCase("kit")) { @@ -356,17 +384,77 @@ public class EventModule extends MiniPlugin { commandBlockPlaceInCreative(event.getPlayer(), args); } - else if(args[0].equalsIgnoreCase("blockbreakcreative")) + else if(args[0].equalsIgnoreCase("stacker")) { - commandBlockBreakInCreative(event.getPlayer(), args); + commandStacker(event.getPlayer(), args); + } + else if(args[0].equalsIgnoreCase("playerdamage")) + { + if(args[1] == null) + { + UtilPlayer.message(event.getPlayer(), F.main("Event", "Insufficient arguments!")); + return; + } + + if(Bukkit.getPlayer(args[1]) == null) + { + UtilPlayer.message(event.getPlayer(), F.main("Event", "This Player is not online!")); + return; + } + + if(_damage.contains(Bukkit.getPlayer(args[1]))) + _damage.remove(Bukkit.getPlayer(args[1])); + else + _damage.add(Bukkit.getPlayer(args[1])); + } + else if(args[0].equalsIgnoreCase("bc")) + { + commandBC(event.getPlayer(), args); + } + else if(args[0].equalsIgnoreCase("area")) + { + if(!(Manager.GetGame() instanceof EventGame)) { + UtilPlayer.message(event.getPlayer(), F.main("Settings", "You can only edit areas in the Event game!")); + return; + } + + ((EventGame) Manager.GetGame()).editArea(event.getPlayer(), args); } else if(args[0].equalsIgnoreCase("mobgriefing")) { commandMobGriefing(event.getPlayer(), args); } + else if(args[0].equalsIgnoreCase("kick")) + { + if(Bukkit.getPlayer(args[1]) == null) + { + UtilPlayer.message(event.getPlayer(), "No matches for: " + C.cYellow + args[1]); + return; + } + //Bukkit.getPlayer(args[1]).kickPlayer("You where kicked from the event, probably you didn't stick to the Event Rules."); + Manager.GetGameHostManager().getBlacklist().add(Bukkit.getPlayer(args[1]).getName()); + UtilPlayer.message(event.getPlayer(), F.main("Event", "You removed " + C.cYellow + Bukkit.getPlayer(args[1]).getName())); + } + else if(args[0].equalsIgnoreCase("tempgadget")) + { + String gadget = args[1]; + for(int e = 2; e < args.length; e++) + gadget+= " " + args[e]; + + try + { + for(Player target : UtilServer.getPlayers()) + Manager.GetDonation().Get(target).AddUnknownSalesPackagesOwned(gadget); + } + catch (Exception e) + { + UtilPlayer.message(event.getPlayer(), F.main("Event", "Gadget is not vallid")); + } + UtilPlayer.message(event.getPlayer(), F.main("Event", "You gave the gadget " + F.item(gadget) + " to all Players!")); + } } - private void listSettings(Player player) + public void listSettings(Player player) { UtilPlayer.message(player, F.value("Damage All", F.tf(Manager.GetGame().Damage))); UtilPlayer.message(player, F.value("Damage PvP", F.tf(Manager.GetGame().DamagePvP))); @@ -389,28 +477,55 @@ public class EventModule extends MiniPlugin UtilPlayer.message(player, F.value("Mob griefing", F.tf(_mobGriefing))); } - private void commandBlockBreakInCreative(Player player, String[] args) + public void commandBlockBreakInCreative(Player player, String[] args) { Manager.GetGame().BlockBreakCreative = !Manager.GetGame().BlockBreakCreative; UtilPlayer.message(player, F.main("Settings", "BlockBreakCreative: " + F.tf(Manager.GetGame().BlockBreakCreative))); } - private void commandBlockPlaceInCreative(Player player, String[] args) + public void commandStacker(Player player, String[] args) + { + if(args.length == 1) + { + _allowStacker = !_allowStacker; + UtilPlayer.message(player, F.main("Settings", "Stacker all: " + F.tf(_allowStacker))); + } + else + { + for(Player target : UtilPlayer.matchOnline(player, args[1], true)) + { + if(_stacker.contains(target)) + { + _stacker.remove(target); + UtilPlayer.message(target, F.main("Settings", "Stacker: " + F.tf(false))); + UtilPlayer.message(player, F.main("Settings", "Stacker " + target.getName() + ": " + F.tf(false))); + } + else + { + _stacker.add(target); + UtilPlayer.message(target, F.main("Settings", "Stacker: " + F.tf(true))); + UtilPlayer.message(player, F.main("Settings", "Stacker " + target.getName() + ": " + F.tf(true))); + } + } + } + } + + public void commandBlockPlaceInCreative(Player player, String[] args) { Manager.GetGame().BlockPlaceCreative = !Manager.GetGame().BlockPlaceCreative; UtilPlayer.message(player, F.main("Settings", "BlockPlaceCreative: " + F.tf(Manager.GetGame().BlockPlaceCreative))); } - private void commandMobGriefing(Player player, String[] args) + public void commandMobGriefing(Player player, String[] args) { _mobGriefing = !_mobGriefing; UtilPlayer.message(player, F.main("Settings", "Mob Griefing: " + F.tf(_mobGriefing))); } - private void commandBlockPlace(Player player, String[] args, boolean whitelist, String command) + public void commandBlockPlace(Player player, String[] args, boolean whitelist, String command) { try { @@ -471,7 +586,7 @@ public class EventModule extends MiniPlugin commandHelpSettings(player); } - private void commandBlockBreak(Player player, String[] args, boolean whitelist, String command) + public void commandBlockBreak(Player player, String[] args, boolean whitelist, String command) { try { @@ -532,7 +647,7 @@ public class EventModule extends MiniPlugin commandHelpSettings(player); } - private void commandHealth(Player player, String[] args) + public void commandHealth(Player player, String[] args) { try { @@ -563,7 +678,7 @@ public class EventModule extends MiniPlugin commandHelpSettings(player); } - private void commandHunger(Player player, String[] args) + public void commandHunger(Player player, String[] args) { try { @@ -594,7 +709,7 @@ public class EventModule extends MiniPlugin commandHelpSettings(player); } - private void commandTime(Player player, String[] args) + public void commandTime(Player player, String[] args) { try { @@ -626,7 +741,7 @@ public class EventModule extends MiniPlugin } //Teleport Command (To, Here, All) - private void commandTeleport(Player player, String[] args) + public void commandTeleport(Player player, String[] args) { if (args.length >= 3 && args[1].equalsIgnoreCase("here")) { @@ -668,7 +783,7 @@ public class EventModule extends MiniPlugin } //Gadget Commands (Global & Individual) - private void commandGadget(Player player, String[] args) + public void commandGadget(Player player, String[] args) { if(!(Manager.GetGame() instanceof EventGame)) { UtilPlayer.message(player, F.main("Inventory", "You can only enable/disable gadgets in the Event game!")); @@ -780,7 +895,7 @@ public class EventModule extends MiniPlugin } //Silence - private void commandSilence(Player player, String[] args) + public void commandSilence(Player player, String[] args) { try { @@ -813,7 +928,7 @@ public class EventModule extends MiniPlugin } //Gamemode (Self and Others) - private void commandAdmin(Player player, String[] args) + public void commandAdmin(Player player, String[] args) { Player target = player; @@ -835,7 +950,7 @@ public class EventModule extends MiniPlugin } //Gamemode (Self and Others) - private void commandGamemode(Player player, String[] args) + public void commandGamemode(Player player, String[] args) { Player target = player; @@ -857,7 +972,7 @@ public class EventModule extends MiniPlugin } //Forcefield - private void commandForcefieldRadius(Player player, String[] args) + public void commandForcefieldRadius(Player player, String[] args) { if(!(Manager.GetGame() instanceof EventGame)) { @@ -889,7 +1004,7 @@ public class EventModule extends MiniPlugin } //Give - private void commandGive(Player player, String[] args) + public void commandGive(Player player, String[] args) { String[] newArgs = new String[args.length-1]; @@ -900,7 +1015,7 @@ public class EventModule extends MiniPlugin } //Spec - private void commandSpectators(Player player, String[] args) + public void commandSpectators(Player player, String[] args) { Manager.GetGame().JoinInProgress = !Manager.GetGame().JoinInProgress; @@ -908,7 +1023,7 @@ public class EventModule extends MiniPlugin } //Deathout - private void commandDeathout(Player player, String[] args) + public void commandDeathout(Player player, String[] args) { Manager.GetGame().DeathOut = !Manager.GetGame().DeathOut; @@ -916,7 +1031,7 @@ public class EventModule extends MiniPlugin } //QuitOut - private void commandQuitOut(Player player, String[] args) + public void commandQuitOut(Player player, String[] args) { Manager.GetGame().QuitOut = !Manager.GetGame().QuitOut; @@ -924,7 +1039,7 @@ public class EventModule extends MiniPlugin } //Double Jump - private void commandDoubleJump(Player player, String[] args) + public void commandDoubleJump(Player player, String[] args) { if(!(Manager.GetGame() instanceof EventGame)) { @@ -942,7 +1057,7 @@ public class EventModule extends MiniPlugin } //Scoreboard - private void commandScoreboard(Player player, String[] args) + public void commandScoreboard(Player player, String[] args) { if(!(Manager.GetGame() instanceof EventGame)) { @@ -987,7 +1102,7 @@ public class EventModule extends MiniPlugin lineText += " "; } - ((EventGame) Manager.GetGame()).getSideText()[line] = lineText; + ((EventGame) Manager.GetGame()).getSideText()[line] = ChatColor.translateAlternateColorCodes('&', lineText); UtilPlayer.message(player, F.main("Scoreboard", "Set Line " + F.elem(line+"") + " to " + F.elem(lineText) + ".")); @@ -1016,7 +1131,7 @@ public class EventModule extends MiniPlugin } //Whitelist - private void commandWhitelist(Player player, String[] args) + public void commandWhitelist(Player player, String[] args) { //On and Off if (args.length >= 2) @@ -1056,7 +1171,7 @@ public class EventModule extends MiniPlugin } //Mob - private void commandMob(Player caller, String[] args) + public void commandMob(Player caller, String[] args) { if (args.length == 1) { @@ -1444,7 +1559,7 @@ public class EventModule extends MiniPlugin } } - private void commandMobKill(Player caller, String[] args) + public void commandMobKill(Player caller, String[] args) { if (args.length < 3) { @@ -1490,7 +1605,17 @@ public class EventModule extends MiniPlugin UtilPlayer.message(caller, F.main("Creature", "Killed " + target + ". " + count + " Removed.")); } - private void commandKit(Player caller, String[] args) + public void commandBC(Player caller, String[] args) + { + String message = args[1]; + for(int e = 2; e < args.length; e++) + message += " " + args[e]; + + String colored = ChatColor.translateAlternateColorCodes('&', message); + Manager.GetGame().Announce(F.main("Event", colored), true); + } + + public void commandKit(Player caller, String[] args) { if(!(Manager.GetGame() instanceof EventGame)) { @@ -1533,7 +1658,7 @@ public class EventModule extends MiniPlugin commandHelp(caller); } - private void commandEffect(Player caller, String[] args) + public void commandEffect(Player caller, String[] args, ArrayList players) { //Clear if (args.length >= 3 && args[2].equalsIgnoreCase("clear")) @@ -1551,9 +1676,19 @@ public class EventModule extends MiniPlugin } else { - targets = UtilPlayer.matchOnline(caller, args[1], true); - if (targets.isEmpty()) - return; + if(players == null) + { + targets = UtilPlayer.matchOnline(caller, args[1], true); + if (targets.isEmpty()) + return; + } + else + { + targets = new LinkedList<>(); + for(Player player : players) + targets.add(player); + + } } for (Player player : targets) @@ -1647,10 +1782,20 @@ public class EventModule extends MiniPlugin _potionEffectsMult.put(type, mult); } else - { - targets = UtilPlayer.matchOnline(caller, args[1], true); - if (targets.isEmpty()) - return; + { + if(players == null) + { + targets = UtilPlayer.matchOnline(caller, args[1], true); + if (targets.isEmpty()) + return; + } + else + { + targets = new LinkedList<>(); + for(Player player : players) + targets.add(player); + + } } //Apply @@ -1681,9 +1826,110 @@ public class EventModule extends MiniPlugin { for(PotionEffectType effect : _potionEffectsDuration.keySet()) { + if(_potionEffectsDuration.get(effect) < 0) + continue; + player.addPotionEffect(new PotionEffect(effect, (int) (((_potionEffectsDuration.get(effect) - System.currentTimeMillis()) / 1000) * 20), _potionEffectsMult.get(effect))); } } } + @EventHandler + public void StackEntity(PlayerInteractEntityEvent event) + { + if (!Manager.GetGame().IsLive()) + return; + + if (event.getRightClicked().getVehicle() != null) + return; + + Player player = event.getPlayer(); + Entity other = event.getRightClicked(); + + if(!_allowStacker && !_stacker.contains(player)) + return; + + if (Manager.isSpectator(event.getPlayer())) + return; + + if (!Manager.GetGame().IsAlive(event.getPlayer())) + return; + + if (Manager.getCosmeticManager().getGadgetManager().getActive(player, GadgetType.Morph) instanceof MorphBlock) + { + UtilPlayer.message(player, F.main("Stacker", "You cannot stack while using the Block Morph.")); + return; + } + + StackerEvent stackerEvent = new StackerEvent(player); + Bukkit.getServer().getPluginManager().callEvent(stackerEvent); + if (stackerEvent.isCancelled()) + return; + + //Effect + event.getRightClicked().getWorld().playEffect(event.getRightClicked().getLocation(), Effect.STEP_SOUND, 35); + + //Stack + player.setPassenger(other); + + //Audio + player.playSound(player.getLocation(), Sound.HORSE_ARMOR, 1f, 1f); + + //Inform + if ((event.getRightClicked() instanceof Player)) + { + UtilPlayer.message(other, F.main("Event", F.elem(Manager.GetGame().GetTeam(player).GetColor() + player.getName()) + " picked you up.")); + UtilPlayer.message(player, F.main("Event", "You picked up " + F.elem(Manager.GetGame().GetTeam(((Player) other)).GetColor() + ((Player) other).getName()) + ".")); + } + } + + @EventHandler + public void ThrowEntity(PlayerInteractEvent event) + { + if (!UtilEvent.isAction(event, ActionType.L)) + return; + + Player thrower = event.getPlayer(); + + if (thrower.getVehicle() != null) + return; + + Entity throwee = thrower.getPassenger(); + if (throwee == null) + return; + + StackerEvent stackerEvent = new StackerEvent(thrower); + Bukkit.getServer().getPluginManager().callEvent(stackerEvent); + if (stackerEvent.isCancelled()) + return; + + thrower.eject(); + + Entity throweeStack = throwee.getPassenger(); + if (throweeStack != null) + { + throwee.eject(); + throweeStack.leaveVehicle(); + + final Entity fThrower = thrower; + final Entity fThroweeStack = throweeStack; + + _tempStackShift.add(throweeStack); + + getPlugin().getServer().getScheduler().scheduleSyncDelayedTask(getPlugin(), new Runnable() + { + public void run() + { + fThrower.setPassenger(fThroweeStack); + _tempStackShift.remove(fThroweeStack); + } + }, 2); + } + } + + public ArrayList getDamagePlayers() + { + return _damage; + } + }