From f660620e4b2780f685d9a4236a63834911a6eaab Mon Sep 17 00:00:00 2001 From: Shaun Bennett Date: Wed, 11 Mar 2015 22:18:29 -0400 Subject: [PATCH 1/4] Revert "Pre-Frost changes" This reverts commit dbeea5bf690c0e3013aa2a3814c8b4efa9bfb001. --- .../games/survivalgames/SurvivalGames.java | 1774 +++++------------ 1 file changed, 545 insertions(+), 1229 deletions(-) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/survivalgames/SurvivalGames.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/survivalgames/SurvivalGames.java index 30f07f341..1d050b58e 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/survivalgames/SurvivalGames.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/survivalgames/SurvivalGames.java @@ -1,6 +1,5 @@ package nautilus.game.arcade.game.games.survivalgames; -import java.lang.reflect.Field; import java.util.*; import java.util.Map.Entry; @@ -8,16 +7,8 @@ import org.bukkit.*; import org.bukkit.FireworkEffect.Type; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; -import org.bukkit.block.BlockState; import org.bukkit.block.Chest; -import org.bukkit.block.DoubleChest; -import org.bukkit.block.Furnace; -import org.bukkit.craftbukkit.v1_7_R4.CraftWorld; -import org.bukkit.craftbukkit.v1_7_R4.entity.CraftArrow; -import org.bukkit.craftbukkit.v1_7_R4.entity.CraftPlayer; import org.bukkit.entity.Entity; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.Firework; import org.bukkit.entity.ItemFrame; import org.bukkit.entity.Player; import org.bukkit.entity.Snowball; @@ -36,27 +27,17 @@ import org.bukkit.event.entity.ExplosionPrimeEvent; import org.bukkit.event.entity.ItemSpawnEvent; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.hanging.HangingBreakEvent; -import org.bukkit.event.inventory.InventoryCloseEvent; -import org.bukkit.event.inventory.PrepareItemCraftEvent; import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.inventory.FurnaceInventory; -import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.FireworkMeta; -import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.scoreboard.Scoreboard; -import org.bukkit.scoreboard.Team; -import org.bukkit.scoreboard.TeamNameTagVisibility; +import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.util.Vector; import mineplex.core.common.util.C; import mineplex.core.common.util.F; import mineplex.core.common.util.MapUtil; -import mineplex.core.common.util.NautHashMap; import mineplex.core.common.util.UtilAction; import mineplex.core.common.util.UtilAlg; import mineplex.core.common.util.UtilBlock; @@ -73,11 +54,7 @@ import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilTime; import mineplex.core.common.util.UtilTime.TimeUnit; import mineplex.core.common.util.UtilWorld; -import mineplex.core.disguise.disguises.DisguisePlayer; -import mineplex.core.itemstack.ItemBuilder; -import mineplex.core.loot.*; -import mineplex.core.packethandler.IPacketHandler; -import mineplex.core.packethandler.PacketInfo; +import mineplex.core.itemstack.ItemStackFactory; import mineplex.core.recharge.Recharge; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; @@ -95,126 +72,96 @@ import nautilus.game.arcade.stats.FirstSupplyDropOpenStatTracker; import nautilus.game.arcade.stats.KillsWithinTimeLimitStatTracker; import nautilus.game.arcade.stats.SimultaneousSkeletonStatTracker; import nautilus.game.arcade.stats.WinWithoutWearingArmorStatTracker; -import net.minecraft.server.v1_7_R4.EntityArrow; -import net.minecraft.server.v1_7_R4.PacketPlayInUseEntity; -import net.minecraft.server.v1_7_R4.PacketPlayOutScoreboardTeam; -import net.minecraft.server.v1_7_R4.ScoreboardTeam; -import net.minecraft.server.v1_7_R4.TileEntity; -import net.minecraft.server.v1_7_R4.TileEntityChest; -import net.minecraft.util.com.mojang.authlib.GameProfile; public class SurvivalGames extends SoloGame -{ - // Lootables - private ChestLoot _baseLoot = new ChestLoot(); - private ChestLoot _spawnLoot = new ChestLoot(); - private ChestLoot _superLoot = new ChestLoot(); - private ChestLoot _cookedFurnace = new ChestLoot(); - private ChestLoot _rawFurnace = new ChestLoot(); +{ + private HashSet _openedChest = new HashSet(); + private ArrayList _baseChestLoot = new ArrayList(); + private ArrayList _superChestLoot = new ArrayList(); - private HashMap> _hiddenNames = new HashMap>(); - private HashSet _lootedBlocks = new HashSet(); - - // Misc + //Misc private HashMap _tntMap = new HashMap(); private HashSet _placedBlocks = new HashSet(); private Location _spawn; - // Creep + //Creep private int _maxSpreadRate = 120; - private ArrayList _frostLocations = new ArrayList(); + private ArrayList _redLocations = new ArrayList(); private int _spreadType = 0; private String _spreadName = ""; private boolean _ignoreLiquids = true; private ArrayList> _spreadTypeBlocks; - private HashMap _frostOutTime = new HashMap(); + private HashMap _redOutTime = new HashMap(); - private HashMap>> _frostMap = new HashMap>>(); - private HashMap> _frostChunks = new HashMap>(); + private HashMap>> _redMap = new HashMap>>(); + private HashMap> _redChunks = new HashMap>(); - // Supply Drop + //Supply Drop private ArrayList _supplyLocations = new ArrayList(); private Location _supplyCurrent = null; private Location _supplyEffect = null; - private ArrayList _supplyCrates = new ArrayList(); - private HashSet _landedCrates = new HashSet(); + private ArrayList _supplyChests = new ArrayList(); - // Deathmatch + //Deathmatch private boolean _deathmatchCountdown = false; private boolean _deathmatchLive = false; private long _deathmatchTime = 0; - private int _chestRefillTime = 60 * 7; - - // Debug + //Debug private long totalTime = 0; - private Field _nameTagVisibility; - private Field _packetTeam; - private IPacketHandler _useEntityPacketHandler; - private int _deadBodyCount; - - private NautHashMap _openedChests = new NautHashMap(); - /** - * @The field is originally set to 1, if the next tick finds it at 1, then its set to 10. If the next tick finds it at 10 then - * it removes. - * @Else the ticks set it to 50 - */ - private Field _ticksField; - - public SurvivalGames(ArcadeManager manager) + public SurvivalGames(ArcadeManager manager) { super(manager, GameType.SurvivalGames, - new Kit[] - { - new KitAxeman(manager), - // new KitLooter(manager), - new KitKnight(manager), + new Kit[] + { + new KitAxeman(manager), + //new KitLooter(manager), + new KitKnight(manager), - new KitArcher(manager), + new KitArcher(manager), + new KitBrawler(manager), - new KitBrawler(manager), + new KitAssassin(manager), + new KitBeastmaster(manager), + new KitBomber(manager), + new KitNecromancer(manager), + + new KitHorseman(manager) + }, - new KitAssassin(manager), + new String[] + { + "Search for chests to find loot", + "Slaughter your opponents", + "Stay away from the Deep Freeze!", + "Last tribute alive wins!" + }); + + _help = new String[] + { + C.cGreen + "Use a Compass to find and kill enemies!", + C.cAqua + "Crouch to become invisible to Compass tracking!", + C.cGreen + "Avoid the Deep Freeze at all costs!", + C.cAqua + "Use TNT & Tripwires to make traps!", + C.cGreen + "You lose Speed 2 at start of game if you attack.", + C.cAqua + "Avoid enemies who have better gear than you!", + C.cGreen + "Compass finds Supply Drops during night time.", + C.cAqua + "Compass finds Players during day time.", + }; - new KitBeastmaster(manager), - - new KitBomber(manager), - - new KitNecromancer(manager), - - new KitHorseman(manager) - }, - - new String[] - { - "Search for chests to find loot", "Slaughter your opponents", "Stay away from the Deep Freeze!", - "Last tribute alive wins!" - }); - - _help = new String[] - { - C.cGreen + "Use a Compass to find and kill enemies!", - - C.cGreen + "Avoid the Deep Freeze at all costs!", - - C.cGreen + "You lose Speed 2 at start of game if you attack.", - - C.cAqua + "Avoid enemies who have better gear than you!" - }; - - // Manager.GetAntiStack().SetEnabled(false); + //Manager.GetAntiStack().SetEnabled(false); this.StrictAntiHack = true; - + this.GameTimeout = 9600000; - + this.QuitDropItems = true; - + this.WorldTimeSet = 0; - this.WorldBoundaryKill = false; - + this.WorldBoundaryKill = false; + this.SpawnDistanceRequirement = 48; this.DamageSelf = true; @@ -224,51 +171,39 @@ public class SurvivalGames extends SoloGame this.ItemDrop = true; this.ItemPickup = true; - + this.InventoryClick = true; this.InventoryOpenBlock = true; this.InventoryOpenChest = true; - // Blocks - this.BlockBreakAllow.add(46); // TNT + this.CompassEnabled = false; //XXX + + //Blocks + this.BlockBreakAllow.add(46); //TNT this.BlockPlaceAllow.add(46); - this.BlockBreakAllow.add(30); // Web + this.BlockBreakAllow.add(30); //Web this.BlockPlaceAllow.add(30); - this.BlockBreakAllow.add(132); // Tripwire + this.BlockBreakAllow.add(132); //Tripwire this.BlockPlaceAllow.add(132); - this.BlockBreakAllow.add(131); // Wire Hook + this.BlockBreakAllow.add(131); //Wire Hook this.BlockPlaceAllow.add(131); - this.BlockBreakAllow.add(55); // Redstone Dust + this.BlockBreakAllow.add(55); //Redstone Dust this.BlockPlaceAllow.add(55); - this.BlockBreakAllow.add(72); // Wood Pressure Plate + this.BlockBreakAllow.add(72); //Wood Pressure Plate this.BlockPlaceAllow.add(72); - this.BlockBreakAllow.add(69); // Lever + this.BlockBreakAllow.add(69); //Lever this.BlockPlaceAllow.add(69); - this.BlockBreakAllow.add(18); // Leaves + this.BlockBreakAllow.add(18); //Leaves - BlockBreakAllow.add(Material.LONG_GRASS.getId()); - BlockBreakAllow.add(Material.RED_ROSE.getId()); - BlockBreakAllow.add(Material.YELLOW_FLOWER.getId()); - BlockBreakAllow.add(Material.BROWN_MUSHROOM.getId()); - BlockBreakAllow.add(Material.RED_MUSHROOM.getId()); - BlockBreakAllow.add(Material.DEAD_BUSH.getId()); - BlockBreakAllow.add(Material.CARROT.getId()); - BlockBreakAllow.add(Material.POTATO.getId()); - BlockBreakAllow.add(Material.DOUBLE_PLANT.getId()); - BlockBreakAllow.add(Material.CROPS.getId()); - BlockBreakAllow.add(Material.SAPLING.getId()); - BlockBreakAllow.add(Material.VINE.getId()); - BlockBreakAllow.add(Material.WATER_LILY.getId()); - - // SPREAD - _spreadType = 1;// UtilMath.r(3); + //SPREAD + _spreadType = 1;//UtilMath.r(3); _spreadTypeBlocks = new ArrayList>(); @@ -300,179 +235,14 @@ public class SurvivalGames extends SoloGame System.out.println("==================="); System.out.println("CREEP TYPE: " + _spreadName); System.out.println("==================="); - // Manager.GetStatsManager().addTable(GetName(), "kills", "deaths", "chestsOpened"); + //Manager.GetStatsManager().addTable(GetName(), "kills", "deaths", "chestsOpened"); - setupLoot(); - - try - { - - _packetTeam = Class.forName("org.bukkit.craftbukkit.v1_7_R4.scoreboard.CraftTeam").getDeclaredField("team"); - _packetTeam.setAccessible(true); - - _nameTagVisibility = PacketPlayOutScoreboardTeam.class.getDeclaredField("_nameTagVisibility"); - _nameTagVisibility.setAccessible(true); - - _ticksField = TileEntityChest.class.getDeclaredField("ticks"); - _ticksField.setAccessible(true); - } - catch (Exception ex) - { - ex.printStackTrace(); - } - - _useEntityPacketHandler = new IPacketHandler() - { - @Override - public void handle(PacketInfo packetInfo) - { - if (packetInfo.getPacket() instanceof PacketPlayInUseEntity) - { - net.minecraft.server.v1_7_R4.Entity entity = ((PacketPlayInUseEntity) packetInfo.getPacket()) - .a(((CraftWorld) packetInfo.getPlayer().getWorld()).getHandle()); - - if (entity instanceof EntityArrow) - { - packetInfo.setCancelled(true); - } - } - } - }; - - registerStatTrackers(new WinWithoutWearingArmorStatTracker(this), new KillsWithinTimeLimitStatTracker(this, 3, 60, - "Bloodlust"), new FirstSupplyDropOpenStatTracker(this), new SimultaneousSkeletonStatTracker(this, 5)); - } - - @EventHandler - public void handleEntityPacket(GameStateChangeEvent event) - { - if (event.GetState() == GameState.Live) - { - getArcadeManager().getPacketHandler().addPacketHandler(_useEntityPacketHandler); - } - else if (event.GetState() == GameState.Dead) - { - getArcadeManager().getPacketHandler().removePacketHandler(_useEntityPacketHandler); - } - } - - @Override - public boolean isPlaySoundGameStart() - { - return false; - } - - private void setupLoot() - { - // Food - _baseLoot.registerLoot(new RandomItem(Material.RAW_FISH, 30, 1, 2)); - _baseLoot.registerLoot(new RandomItem(Material.RAW_BEEF, 30, 1, 2)); - _baseLoot.registerLoot(new RandomItem(Material.RAW_CHICKEN, 30, 1, 2)); - _baseLoot.registerLoot(new RandomItem(Material.POTATO_ITEM, 30, 1, 2)); - _baseLoot.registerLoot(new RandomItem(Material.CARROT_ITEM, 30, 1, 2)); - _baseLoot.registerLoot(new RandomItem(Material.RED_MUSHROOM, 30, 1, 2)); - _baseLoot.registerLoot(new RandomItem(Material.BROWN_MUSHROOM, 30, 1, 2)); - _baseLoot.registerLoot(new RandomItem(Material.WHEAT, 30, 1, 2)); - _baseLoot.registerLoot(new RandomItem(Material.APPLE, 30, 1, 2)); - _baseLoot.registerLoot(new RandomItem(Material.PORK, 30, 1, 2)); - _baseLoot.registerLoot(new RandomItem(new ItemStack(Material.INK_SACK, 1, (short) 3), 30, 1, 2)); // Cocoa beans - _baseLoot.registerLoot(new RandomItem(Material.ROTTEN_FLESH, 30, 1, 2)); - - // Weapons - _baseLoot.registerLoot(new RandomItem(Material.WOOD_AXE, 30)); - _baseLoot.registerLoot(new RandomItem(Material.WOOD_SWORD, 30)); - _baseLoot.registerLoot(new RandomItem(Material.STONE_AXE, 30)); - - // Leather armor - _baseLoot.registerLoot(new RandomItem(Material.LEATHER_BOOTS, 30)); - _baseLoot.registerLoot(new RandomItem(Material.LEATHER_CHESTPLATE, 30)); - _baseLoot.registerLoot(new RandomItem(Material.LEATHER_HELMET, 30)); - _baseLoot.registerLoot(new RandomItem(Material.LEATHER_LEGGINGS, 30)); - - // Chain armor - _baseLoot.registerLoot(new RandomItem(Material.CHAINMAIL_BOOTS, 30)); - _baseLoot.registerLoot(new RandomItem(Material.CHAINMAIL_CHESTPLATE, 30)); - _baseLoot.registerLoot(new RandomItem(Material.CHAINMAIL_HELMET, 30)); - _baseLoot.registerLoot(new RandomItem(Material.CHAINMAIL_LEGGINGS, 30)); - - // Throwable - _baseLoot.registerLoot(new RandomItem(Material.FISHING_ROD, 30)); - _baseLoot.registerLoot(new RandomItem(Material.BOW, 30)); - _baseLoot.registerLoot(new RandomItem(Material.ARROW, 30, 1, 5)); - _baseLoot.registerLoot(new RandomItem(Material.SNOW_BALL, 30, 1, 2)); - _baseLoot.registerLoot(new RandomItem(Material.EGG, 30, 1, 2)); - - // Misc - _baseLoot.registerLoot(new RandomItem(Material.EXP_BOTTLE, 30, 1, 2)); - _baseLoot.registerLoot(new RandomItem(Material.FLINT_AND_STEEL, 1)); - _baseLoot.registerLoot(new RandomItem(Material.COMPASS, 50)); - _baseLoot.registerLoot(new RandomItem(Material.STICK, 30, 1, 2)); - _baseLoot.registerLoot(new RandomItem(Material.BOAT, 30)); - _baseLoot.registerLoot(new RandomItem(Material.FLINT, 30, 1, 2)); - _baseLoot.registerLoot(new RandomItem(Material.FEATHER, 30, 1, 2)); - _baseLoot.registerLoot(new RandomItem(Material.GOLD_INGOT, 30, 1, 2)); - - _spawnLoot.cloneLoot(_baseLoot); - - // Food - _spawnLoot.registerLoot(new RandomItem(Material.BAKED_POTATO, 30, 1, 2)); - _spawnLoot.registerLoot(new RandomItem(Material.CAKE, 30)); - _spawnLoot.registerLoot(new RandomItem(Material.COOKED_BEEF, 30, 1, 2)); - _spawnLoot.registerLoot(new RandomItem(Material.COOKED_CHICKEN, 30, 1, 2)); - _spawnLoot.registerLoot(new RandomItem(Material.COOKED_FISH, 30, 1, 2)); - _spawnLoot.registerLoot(new RandomItem(Material.GRILLED_PORK, 30, 1, 2)); - _spawnLoot.registerLoot(new RandomItem(Material.COOKIE, 30, 1, 2)); - _spawnLoot.registerLoot(new RandomItem(Material.PUMPKIN_PIE, 30, 1, 2)); - _spawnLoot.registerLoot(new RandomItem(Material.APPLE, 30, 1, 2)); - - // Loot for chests in spawn - // Random bowl - _spawnLoot.registerLoot(new RandomItem(Material.BOWL, 30, 1, 2)); - - // Weaponry and ores - _spawnLoot.registerLoot(new RandomItem(Material.STONE_SWORD, 30)); - _spawnLoot.registerLoot(new RandomItem(Material.IRON_INGOT, 30, 1, 2)); - _spawnLoot.registerLoot(new RandomItem(Material.DIAMOND, 30)); - - // Iron gear - _spawnLoot.registerLoot(new RandomItem(Material.IRON_BOOTS, 30)); - _spawnLoot.registerLoot(new RandomItem(Material.IRON_CHESTPLATE, 30)); - _spawnLoot.registerLoot(new RandomItem(Material.IRON_HELMET, 30)); - _spawnLoot.registerLoot(new RandomItem(Material.IRON_LEGGINGS, 30)); - - // Supply crate loot - // Diamond gear - _superLoot.registerLoot(new RandomItem(Material.DIAMOND_HELMET, 3)); - _superLoot.registerLoot(new RandomItem(Material.DIAMOND_CHESTPLATE, 1)); - _superLoot.registerLoot(new RandomItem(Material.DIAMOND_LEGGINGS, 2)); - _superLoot.registerLoot(new RandomItem(Material.DIAMOND_BOOTS, 3)); - - // Iron gear - _superLoot.registerLoot(new RandomItem(Material.IRON_HELMET, 30)); - _superLoot.registerLoot(new RandomItem(Material.IRON_CHESTPLATE, 24)); - _superLoot.registerLoot(new RandomItem(Material.IRON_LEGGINGS, 27)); - _superLoot.registerLoot(new RandomItem(Material.IRON_BOOTS, 30)); - - // Weapons - _superLoot.registerLoot(new RandomItem(Material.IRON_SWORD, 24)); - _superLoot.registerLoot(new RandomItem(Material.DIAMOND_SWORD, 8)); - _superLoot.registerLoot(new RandomItem(Material.DIAMOND_AXE, 16)); - - // Cooked furnace - _cookedFurnace.registerLoot(new RandomItem(Material.COOKED_BEEF, 3, 1, 2)); - _cookedFurnace.registerLoot(new RandomItem(Material.COOKED_CHICKEN, 3, 1, 2)); - _cookedFurnace.registerLoot(new RandomItem(Material.COOKED_FISH, 3, 1, 2)); - _cookedFurnace.registerLoot(new RandomItem(Material.GRILLED_PORK, 3, 1, 2)); - _cookedFurnace.registerLoot(new RandomItem(Material.IRON_INGOT, 1, 1, 1)); - _cookedFurnace.registerLoot(new RandomItem(Material.BAKED_POTATO, 3, 1, 1)); - _cookedFurnace.registerLoot(new RandomItem(Material.PUMPKIN_PIE, 3, 1, 1)); - - // Raw furnace - _rawFurnace.registerLoot(new RandomItem(Material.RAW_BEEF, 1, 1, 2)); - _rawFurnace.registerLoot(new RandomItem(Material.RAW_CHICKEN, 1, 1, 2)); - _rawFurnace.registerLoot(new RandomItem(Material.RAW_FISH, 1, 1, 2)); - _rawFurnace.registerLoot(new RandomItem(Material.PORK, 1, 1, 2)); - _rawFurnace.registerLoot(new RandomItem(Material.POTATO_ITEM, 1, 1, 2)); + registerStatTrackers( + new WinWithoutWearingArmorStatTracker(this), + new KillsWithinTimeLimitStatTracker(this, 3, 60, "Bloodlust"), + new FirstSupplyDropOpenStatTracker(this), + new SimultaneousSkeletonStatTracker(this, 5) + ); } @Override @@ -482,14 +252,14 @@ public class SurvivalGames extends SoloGame } @Override - public void ParseData() + public void ParseData() { _spawn = UtilWorld.averageLocation(this.GetTeamList().get(0).GetSpawns()); for (Location loc : this.GetTeamList().get(0).GetSpawns()) loc.setYaw(UtilAlg.GetYaw(UtilAlg.getTrajectory(loc, _spawn))); - setupChestsEnchantingCrafting(); + CreateChestCraftEnchant(); _supplyLocations = WorldData.GetDataLocs("WHITE"); for (Location loc : _supplyLocations) @@ -502,35 +272,35 @@ public class SurvivalGames extends SoloGame } } - private void setupChestsEnchantingCrafting() + private void CreateChestCraftEnchant() { ArrayList chests = WorldData.GetCustomLocs("54"); System.out.println("Map Chest Locations: " + chests.size()); - // Enchants + //Enchants System.out.println("Enchanting Tables: " + Math.min(5, chests.size())); - for (int i = 0; i < 5 && !chests.isEmpty(); i++) + for (int i=0 ; i<5 && !chests.isEmpty() ; i++) { - Location loc = chests.remove(UtilMath.r(chests.size())); + Location loc = chests.remove(UtilMath.r(chests.size())); loc.getBlock().setType(Material.ENCHANTMENT_TABLE); } - // Crafting + //Crafting System.out.println("Crafting Benches: " + Math.min(10, chests.size())); - for (int i = 0; i < 10 && !chests.isEmpty(); i++) + for (int i=0 ; i<10 && !chests.isEmpty() ; i++) { - Location loc = chests.remove(UtilMath.r(chests.size())); + Location loc = chests.remove(UtilMath.r(chests.size())); loc.getBlock().setType(Material.WORKBENCH); } int spawn = 0; - // Chests + //Chests System.out.println("Chests: " + Math.min(250, chests.size())); - for (int i = 0; i < 250 && !chests.isEmpty(); i++) + for (int i=0 ; i<250 && !chests.isEmpty() ; i++) { - Location loc = chests.remove(UtilMath.r(chests.size())); + Location loc = chests.remove(UtilMath.r(chests.size())); if (UtilMath.offset2d(loc, _spawn) < 8) spawn++; @@ -566,174 +336,194 @@ public class SurvivalGames extends SoloGame while (done < 40) { - Block block = UtilBlock.getHighest(WorldData.World, WorldData.MinX + UtilMath.r(xDiff), - WorldData.MinZ + UtilMath.r(zDiff), ignore); + Block block = UtilBlock.getHighest(WorldData.World, WorldData.MinX + UtilMath.r(xDiff), WorldData.MinZ + UtilMath.r(zDiff), ignore); if (!UtilBlock.airFoliage(block) || !UtilBlock.solid(block.getRelative(BlockFace.DOWN))) continue; - block.setTypeIdAndData(Material.CHEST.getId(), (byte) UtilMath.r(4), true); + block.setTypeIdAndData(54, (byte)UtilMath.r(4), true); done++; } } - private void fillChest(Player looter, Block block) - { - _lootedBlocks.add(block.getLocation()); - - Chest chest = (Chest) block.getState(); - - chest.getBlockInventory().clear(); - - int items = 2; - if (Math.random() > 0.50) - items++; - if (Math.random() > 0.65) - items++; - if (Math.random() > 0.80) - items++; - if (Math.random() > 0.95) - items++; - - boolean spawnChest = UtilMath.offset(chest.getLocation(), _spawn) < 8; - if (spawnChest) - items += 3; - - if (GetKit(looter) instanceof KitLooter) - { - items += UtilMath.r(3); - } - - if (_supplyCrates.contains(block)) - { - items = 2; - if (Math.random() > 0.75) - items++; - if (Math.random() > 0.95) - items++; - } - - for (int i = 0; i < items; i++) - { - ItemStack item; - - if (spawnChest) - { - item = _spawnLoot.getLoot(); - } - else - { - item = GetChestItem(_supplyCrates.contains(block)); - } - - if (item.getType() == Material.COMPASS) - { - item = buildCompass(5); - } - - chest.getBlockInventory().setItem(UtilMath.r(27), item); - } - - if (_supplyCrates.contains(block)) - { - Bukkit.getPluginManager().callEvent(new SupplyChestOpenEvent(looter, block)); - } - - _supplyCrates.remove(block); - _landedCrates.add(block.getLocation()); - } - @EventHandler - public void OpenChest(PlayerInteractEvent event) + private void OpenChest(PlayerInteractEvent event) { if (event.isCancelled()) return; - Block block = event.getClickedBlock(); - - if (block == null) + if (event.getClickedBlock() == null) return; - if (!IsLive()) + if (!(event.getClickedBlock().getState() instanceof Chest)) return; - if (_lootedBlocks.contains(block.getLocation())) + if (GetState() != GameState.Live) return; - BlockState state = block.getState(); + if (_openedChest.contains(event.getClickedBlock().getLocation())) + return; - if (state instanceof DoubleChest) + _openedChest.add(event.getClickedBlock().getLocation()); + + Chest chest = (Chest)event.getClickedBlock().getState(); + + chest.getBlockInventory().clear(); + + int count = 2; + if (Math.random() > 0.50) count++; + if (Math.random() > 0.65) count++; + if (Math.random() > 0.80) count++; + if (Math.random() > 0.95) count++; + + if (UtilMath.offset(chest.getLocation(), _spawn) < 8) + count += 3; + + if (GetKit(event.getPlayer()) instanceof KitLooter) { - DoubleChest doubleChest = (DoubleChest) state; - - fillChest(event.getPlayer(), ((Chest) doubleChest.getLeftSide()).getBlock()); - fillChest(event.getPlayer(), ((Chest) doubleChest.getRightSide()).getBlock()); + count += UtilMath.r(3); } - else if (state instanceof Chest) + + if (_supplyChests.contains(event.getClickedBlock())) { - fillChest(event.getPlayer(), block); + count = 2; + if (Math.random() > 0.75) count++; + if (Math.random() > 0.95) count++; } - else if (state instanceof Furnace) + + for (int i = 0; i < count; i++) + chest.getBlockInventory().setItem(UtilMath.r(27), GetChestItem(_supplyChests.contains(event.getClickedBlock()))); + + if (_supplyChests.contains(event.getClickedBlock())) { - Furnace furnace = (Furnace) state; - - if (furnace.getCookTime() == 0) - { - FurnaceInventory inv = furnace.getInventory(); - - if (UtilMath.r(3) == 0) - { - int random = UtilMath.r(9); - - if (random == 0) - { - inv.setFuel(new ItemStack(Material.STICK, new Random().nextInt(2) + 1)); - } - else if (random <= 3) - { - inv.setSmelting(_rawFurnace.getLoot()); - } - else - { - inv.setResult(_cookedFurnace.getLoot()); - } - } - - _lootedBlocks.add(block.getLocation()); - } + Bukkit.getPluginManager().callEvent(new SupplyChestOpenEvent(event.getPlayer(), event.getClickedBlock())); } + + _supplyChests.remove(event.getClickedBlock()); } private ItemStack GetChestItem(boolean superChest) { - if (superChest) - return _superLoot.getLoot(); - - return _baseLoot.getLoot(); - } - - private String buildTime() - { - String s = ""; - - for (char c : ("" + System.nanoTime()).toCharArray()) + if (_baseChestLoot.isEmpty()) { - s += "§" + c; + //Armor + for (int i = 0; i < 10; i++) _baseChestLoot.add(new ItemStack(Material.IRON_HELMET)); + for (int i = 0; i < 3; i++) _baseChestLoot.add(new ItemStack(Material.IRON_CHESTPLATE)); + for (int i = 0; i < 5; i++) _baseChestLoot.add(new ItemStack(Material.IRON_LEGGINGS)); + for (int i = 0; i < 10; i++) _baseChestLoot.add(new ItemStack(Material.IRON_BOOTS)); + + for (int i = 0; i < 30; i++) _baseChestLoot.add(new ItemStack(Material.CHAINMAIL_HELMET)); + for (int i = 0; i < 20; i++) _baseChestLoot.add(new ItemStack(Material.CHAINMAIL_CHESTPLATE)); + for (int i = 0; i < 25; i++) _baseChestLoot.add(new ItemStack(Material.CHAINMAIL_LEGGINGS)); + for (int i = 0; i < 30; i++) _baseChestLoot.add(new ItemStack(Material.CHAINMAIL_BOOTS)); + + for (int i = 0; i < 40; i++) _baseChestLoot.add(new ItemStack(Material.GOLD_HELMET)); + for (int i = 0; i < 30; i++) _baseChestLoot.add(new ItemStack(Material.GOLD_CHESTPLATE)); + for (int i = 0; i < 35; i++) _baseChestLoot.add(new ItemStack(Material.GOLD_LEGGINGS)); + for (int i = 0; i < 40; i++) _baseChestLoot.add(new ItemStack(Material.GOLD_BOOTS)); + + for (int i = 0; i < 100; i++) _baseChestLoot.add(new ItemStack(Material.LEATHER_HELMET)); + for (int i = 0; i < 90; i++) _baseChestLoot.add(new ItemStack(Material.LEATHER_CHESTPLATE)); + for (int i = 0; i < 85; i++) _baseChestLoot.add(new ItemStack(Material.LEATHER_LEGGINGS)); + for (int i = 0; i < 100; i++) _baseChestLoot.add(new ItemStack(Material.LEATHER_BOOTS)); + + //Weapons + for (int i = 0; i < 70; i++) _baseChestLoot.add(new ItemStack(Material.WOOD_AXE)); + for (int i = 0; i < 45; i++) _baseChestLoot.add(new ItemStack(Material.GOLD_AXE)); + for (int i = 0; i < 35; i++) _baseChestLoot.add(new ItemStack(Material.STONE_AXE)); + for (int i = 0; i < 15; i++) _baseChestLoot.add(new ItemStack(Material.IRON_AXE)); + + for (int i = 0; i < 60; i++) _baseChestLoot.add(new ItemStack(Material.WOOD_SWORD)); + for (int i = 0; i < 35; i++) _baseChestLoot.add(new ItemStack(Material.GOLD_SWORD)); + for (int i = 0; i < 25; i++) _baseChestLoot.add(new ItemStack(Material.STONE_SWORD)); + for (int i = 0; i < 8; i++) _baseChestLoot.add(new ItemStack(Material.IRON_SWORD)); + + for (int i = 0; i < 45; i++) _baseChestLoot.add(new ItemStack(Material.BOW)); + for (int i = 0; i < 55; i++) _baseChestLoot.add(new ItemStack(Material.ARROW, 4)); + + for (int i = 0; i < 15; i++) _baseChestLoot.add(new ItemStack(Material.TNT, 1)); + for (int i = 0; i < 30; i++) _baseChestLoot.add(new ItemStack(Material.WEB, 2)); + + //Food + for (int i = 0; i < 40; i++) _baseChestLoot.add(new ItemStack(Material.MUSHROOM_SOUP)); + for (int i = 0; i < 50; i++) _baseChestLoot.add(new ItemStack(Material.COOKED_CHICKEN, 4)); + for (int i = 0; i < 80; i++) _baseChestLoot.add(new ItemStack(Material.RAW_BEEF, 6)); + for (int i = 0; i < 50; i++) _baseChestLoot.add(new ItemStack(Material.GRILLED_PORK, 4)); + for (int i = 0; i < 160; i++) _baseChestLoot.add(new ItemStack(Material.BREAD, 5)); + for (int i = 0; i < 40; i++) _baseChestLoot.add(new ItemStack(Material.PUMPKIN_PIE, 3)); + for (int i = 0; i < 80; i++) _baseChestLoot.add(new ItemStack(Material.COOKIE, 7)); + for (int i = 0; i < 90; i++) _baseChestLoot.add(new ItemStack(Material.ROTTEN_FLESH, 4)); + + for (int i = 0; i < 80; i++) _baseChestLoot.add(new ItemStack(Material.WHEAT, 6)); + + //Misc + for (int i = 0; i < 50; i++) _baseChestLoot.add(new ItemStack(Material.COMPASS, 1)); + for (int i = 0; i < 25; i++) _baseChestLoot.add(new ItemStack(Material.EXP_BOTTLE, 1)); + for (int i = 0; i < 50; i++) _baseChestLoot.add(new ItemStack(Material.GOLD_INGOT, 2)); + for (int i = 0; i < 30; i++) _baseChestLoot.add(new ItemStack(Material.IRON_INGOT)); + for (int i = 0; i < 5; i++) _baseChestLoot.add(new ItemStack(Material.DIAMOND)); + for (int i = 0; i < 60; i++) _baseChestLoot.add(new ItemStack(Material.STICK, 4)); + for (int i = 0; i < 80; i++) _baseChestLoot.add(new ItemStack(Material.FLINT, 6)); + for (int i = 0; i < 80; i++) _baseChestLoot.add(new ItemStack(Material.FEATHER, 6)); + for (int i = 0; i < 40; i++) _baseChestLoot.add(new ItemStack(Material.BOAT)); + for (int i = 0; i < 70; i++) _baseChestLoot.add(new ItemStack(Material.FISHING_ROD)); + + //Building Supplies + for (int i = 0; i < 45; i++) _baseChestLoot.add(new ItemStack(Material.PISTON_BASE, 4)); + + /* + String material = _baseChestLoot.get(0).getType().toString(); + double count = 0; + + for (int i = 0; i < _baseChestLoot.size(); i++) + { + if (!_baseChestLoot.get(i).getType().toString().equalsIgnoreCase(material)) + { + System.out.println(material + " - " + count + " - " + (count / _baseChestLoot.size() * 100) + "%"); + material = _baseChestLoot.get(i).getType().toString(); + count = 1; + } + else + { + count++; + } + } + + System.out.println(material + " " + (count / _baseChestLoot.size() * 100) + "%"); + */ } - return s; - } + if (_superChestLoot.isEmpty()) + { + for (int i = 0; i < 3; i++) _superChestLoot.add(new ItemStack(Material.DIAMOND_HELMET)); + for (int i = 0; i < 1; i++) _superChestLoot.add(new ItemStack(Material.DIAMOND_CHESTPLATE)); + for (int i = 0; i < 2; i++) _superChestLoot.add(new ItemStack(Material.DIAMOND_LEGGINGS)); + for (int i = 0; i < 3; i++) _superChestLoot.add(new ItemStack(Material.DIAMOND_BOOTS)); - private ItemStack buildCompass(int uses) - { - ItemBuilder item = new ItemBuilder(Material.COMPASS); - item.setTitle(C.cWhite + "Player Tracker" + buildTime()); + for (int i = 0; i < 30; i++) _superChestLoot.add(new ItemStack(Material.IRON_HELMET)); + for (int i = 0; i < 24; i++) _superChestLoot.add(new ItemStack(Material.IRON_CHESTPLATE)); + for (int i = 0; i < 27; i++) _superChestLoot.add(new ItemStack(Material.IRON_LEGGINGS)); + for (int i = 0; i < 30; i++) _superChestLoot.add(new ItemStack(Material.IRON_BOOTS)); - item.addLore(C.cBlue + "Uses remaining: " + C.cWhite + uses); - item.addLore(C.cGray + "Use this to find the location and"); - item.addLore(C.cGray + "distance of the nearest player!"); + for (int i = 0; i < 24; i++) _superChestLoot.add(new ItemStack(Material.IRON_SWORD)); + for (int i = 0; i < 8; i++) _superChestLoot.add(new ItemStack(Material.DIAMOND_SWORD)); + for (int i = 0; i < 16; i++) _superChestLoot.add(new ItemStack(Material.DIAMOND_AXE)); + } - return item.build(); + + ItemStack stack = _baseChestLoot.get(UtilMath.r(_baseChestLoot.size())); + if (superChest) + stack = _superChestLoot.get(UtilMath.r(_superChestLoot.size())); + + int amount = 1; + + if (stack.getType().getMaxStackSize() > 1) + amount = Math.max(1, UtilMath.r(stack.getAmount())); + + if (stack.getTypeId() == 33) + return ItemStackFactory.Instance.CreateStack(stack.getTypeId(), (byte)0, amount, "Barricade"); + + return ItemStackFactory.Instance.CreateStack(stack.getTypeId(), amount); } @EventHandler @@ -742,191 +532,15 @@ public class SurvivalGames extends SoloGame if (event.GetState() != GameState.Live) return; - Scoreboard board = GetScoreboard().GetScoreboard(); - for (Player player : GetPlayers(true)) { - player.playSound(player.getLocation(), Sound.DONKEY_DEATH, 0.8F, 0); - Manager.GetCondition().Factory().Speed("Start Speed", player, player, 30, 1, false, false, false); Manager.GetCondition().Factory().HealthBoost("Start Health", player, player, 30, 1, false, false, false); player.setHealth(player.getMaxHealth()); - - Team team = board.registerNewTeam(player.getName()); - - team.setPrefix(board.getPlayerTeam(player).getPrefix()); - - team.addPlayer(player); } } - @EventHandler - public void joinMessage(PlayerJoinEvent event) - { - if (!UtilPlayer.is1_8(event.getPlayer())) - returnToHub(event.getPlayer()); - } - - @EventHandler - public void outdatedVersion(GameStateChangeEvent event) - { - for (Player player : UtilServer.getPlayers()) - { - if (!UtilPlayer.is1_8(player)) - returnToHub(player); - } - } - - public void returnToHub(Player player) - { - UtilPlayer.message(player, " "); - UtilPlayer.message(player, C.cGold + C.Bold + "SurvivalGames requires you to be using Minecraft 1.8!"); - UtilPlayer.message(player, " "); - - player.playSound(player.getLocation(), Sound.ENDERDRAGON_GROWL, 10f, 1f); - Manager.GetPortal().sendPlayerToServer(player, "Lobby"); - } - - @EventHandler - public void UpdateNametagVisibility(UpdateEvent event) - { - if (event.getType() != UpdateType.TICK) - return; - - if (!IsLive()) - return; - - ArrayList alivePlayers = GetPlayers(true); - HashMap> checkedPlayers = new HashMap>(); - - for (Player target : alivePlayers) - { - - PacketPlayOutScoreboardTeam packet = null; - - try - { - ScoreboardTeam nmsTeam = (ScoreboardTeam) _packetTeam.get(target.getScoreboard().getTeam(target.getName())); - - packet = new PacketPlayOutScoreboardTeam(nmsTeam, 2); - } - catch (Exception ex) - { - ex.printStackTrace(); - } - - for (Player player : alivePlayers) - { - if (target != player) - { - boolean hideName = false; - - if (!checkedPlayers.containsKey(target) || !checkedPlayers.get(target).containsKey(player)) - { - if (target.getLocation().distance(player.getLocation()) > 16) - { - hideName = true; - } - else if (!target.hasLineOfSight(player)) - { - // no los - hideName = true; - } - - Player[] players = new Player[] - { - target, player - }; - - for (int i = 0; i <= 1; i++) - { - Player p1 = players[i]; - Player p2 = players[1 - i]; - - if (!checkedPlayers.containsKey(p1)) - { - checkedPlayers.put(p1, new HashMap()); - } - - checkedPlayers.get(p1).put(p2, hideName); - } - } - else - { - hideName = checkedPlayers.get(target).get(player); - } - - // If hiddenNames conta - if (hideName != (_hiddenNames.containsKey(player) && _hiddenNames.get(player).contains(target.getName()))) - { - if (!hideName) - { - _hiddenNames.get(player).remove(target.getName()); - } - else - { - if (!_hiddenNames.containsKey(player)) - { - _hiddenNames.put(player, new HashSet()); - } - - _hiddenNames.get(player).add(target.getName()); - } - - try - { - _nameTagVisibility.set(packet, hideName ? "never" : "always"); - } - catch (Exception ex) - { - ex.printStackTrace(); - } - - UtilPlayer.sendPacket(player, packet); - } - } - } - } - } - - @EventHandler - public void RemoveNametagInfo(PlayerQuitEvent event) - { - _hiddenNames.remove(event.getPlayer()); - deathOrQuit(event.getPlayer()); - } - - @EventHandler - public void onGameEnd(GameStateChangeEvent event) - { - if (event.GetState() != GameState.End) - return; - - new BukkitRunnable() - { - public void run() - { - if (GetState() != GameState.End) - { - cancel(); - return; - } - - for (Location loc : GetTeamList().get(0).GetSpawns()) - { - Firework firework = (Firework) loc.getWorld().spawnEntity(loc, EntityType.FIREWORK); - - FireworkMeta meta = firework.getFireworkMeta(); - - meta.addEffect(FireworkEffect.builder().withColor(Color.AQUA).with(Type.BALL).withTrail().build()); - - firework.setFireworkMeta(meta); - } - } - }.runTaskTimer(getArcadeManager().getPlugin(), 0, 60); - } - @EventHandler public void SpeedRemove(CustomDamageEvent event) { @@ -935,29 +549,10 @@ public class SurvivalGames extends SoloGame Manager.GetCondition().EndCondition(damager, null, "Start Speed"); } - // If an item spawns and no one is there to see it, does it really spawn? No. + //If an item spawns and no one is there to see it, does it really spawn? No. @EventHandler public void ItemSpawn(ItemSpawnEvent event) { - Material mat = event.getEntity().getItemStack().getType(); - - switch (mat) - { - case SEEDS: - case SAPLING: - case VINE: - case LEAVES: - case LONG_GRASS: - case RED_ROSE: - case YELLOW_FLOWER: - case DEAD_BUSH: - case WATER_LILY: - event.setCancelled(true); - return; - default: - break; - } - for (Player player : GetPlayers(true)) if (UtilMath.offset(player, event.getEntity()) < 6) return; @@ -966,54 +561,52 @@ public class SurvivalGames extends SoloGame } @EventHandler - // TODO - public void frostBorderStart(GameStateChangeEvent event) + public void RedBorderStart(GameStateChangeEvent event) { if (event.GetState() != GameState.Prepare) return; - // Start Red + //Start Red Block block; - for (int x = WorldData.MinX; x <= WorldData.MaxX; x++) + for (int x=WorldData.MinX ; x<=WorldData.MaxX ; x++) { block = WorldData.World.getHighestBlockAt(x, WorldData.MinZ); while (!UtilBlock.solid(block) && !block.isLiquid() && block.getY() > 0) block = block.getRelative(BlockFace.DOWN); if (block.getY() > 0) - _frostLocations.add(block.getLocation()); + _redLocations.add(block.getLocation()); block = WorldData.World.getHighestBlockAt(x, WorldData.MaxZ); while (!UtilBlock.solid(block) && !block.isLiquid() && block.getY() > 0) block = block.getRelative(BlockFace.DOWN); if (block.getY() > 0) - _frostLocations.add(block.getLocation()); + _redLocations.add(block.getLocation()); } - for (int z = WorldData.MinZ; z <= WorldData.MaxZ; z++) + for (int z=WorldData.MinZ ; z<=WorldData.MaxZ ; z++) { block = WorldData.World.getHighestBlockAt(WorldData.MinX, z); while (!UtilBlock.solid(block) && !block.isLiquid() && block.getY() > 0) block = block.getRelative(BlockFace.DOWN); if (block.getY() > 0) - _frostLocations.add(block.getLocation()); + _redLocations.add(block.getLocation()); block = WorldData.World.getHighestBlockAt(WorldData.MaxX, z); while (!UtilBlock.solid(block) && !block.isLiquid() && block.getY() > 0) block = block.getRelative(BlockFace.DOWN); if (block.getY() > 0) - _frostLocations.add(block.getLocation()); + _redLocations.add(block.getLocation()); } } - public int frostMax() + public int RedMax() { return _maxSpreadRate;// + (24 - GetPlayers(true).size())*2; } @EventHandler - // TODO - public void frostUpdate(UpdateEvent event) + public void RedUpdate(UpdateEvent event) { if (event.getType() != UpdateType.TICK) return; @@ -1023,56 +616,56 @@ public class SurvivalGames extends SoloGame long time = System.currentTimeMillis(); - if (_frostLocations.isEmpty()) + if (_redLocations.isEmpty()) return; - int max = Math.max(5, Math.min(frostMax(), _frostLocations.size() / 100)); + int max = Math.max(5, Math.min(RedMax(), _redLocations.size()/100)); - for (int i = 0; i < max; i++) + for (int i=0 ; i WorldData.MaxX || block.getZ() < WorldData.MinZ - || block.getZ() > WorldData.MaxZ) + //Outside Boundaries + if (block.getX() < WorldData.MinX || block.getX() > WorldData.MaxX || block.getZ() < WorldData.MinZ || block.getZ() > WorldData.MaxZ) return false; - // Not Visible + //Not Visible if (!UtilBlock.isVisible(block)) return false; - // Apply - _frostLocations.add(block.getLocation()); + //Apply + _redLocations.add(block.getLocation()); return true; } - public void frostChangeBlock(Location loc, int id, byte data) + public void RedChangeBlock(Location loc, int id, byte data) { if (!IsLive()) return; MapUtil.ChunkBlockChange(loc, id, data, false); - // Old Style + //Old Style /* if (true) { @@ -1212,22 +803,20 @@ public class SurvivalGames extends SoloGame } */ - // Non-Queue + //Non-Queue for (Player player : UtilServer.getPlayers()) { - if (Math.abs(player.getLocation().getChunk().getX() - loc.getChunk().getX()) > UtilServer.getServer() - .getViewDistance()) + if (Math.abs(player.getLocation().getChunk().getX() - loc.getChunk().getX()) > UtilServer.getServer().getViewDistance()) continue; - if (Math.abs(player.getLocation().getChunk().getZ() - loc.getChunk().getZ()) > UtilServer.getServer() - .getViewDistance()) + if (Math.abs(player.getLocation().getChunk().getZ() - loc.getChunk().getZ()) > UtilServer.getServer().getViewDistance()) continue; - if (!_frostChunks.containsKey(player)) - _frostChunks.put(player, new ArrayList()); + if (!_redChunks.containsKey(player)) + _redChunks.put(player, new ArrayList()); boolean added = false; - for (ChunkChange change : _frostChunks.get(player)) + for (ChunkChange change : _redChunks.get(player)) { if (change.Chunk.equals(loc.getChunk()))// && change.DirtyCount < 63) { @@ -1237,13 +826,12 @@ public class SurvivalGames extends SoloGame } } if (!added) - _frostChunks.get(player).add(new ChunkChange(loc, id, data)); + _redChunks.get(player).add(new ChunkChange(loc, id, data)); } } @EventHandler - // TODO - public void frostChunkUpdate(UpdateEvent event) + public void RedChunkUpdate(UpdateEvent event) { if (event.getType() != UpdateType.FAST) return; @@ -1251,49 +839,47 @@ public class SurvivalGames extends SoloGame if (!IsLive()) return; - for (Player player : _frostChunks.keySet()) + for (Player player : _redChunks.keySet()) { - // Remove Far Away - Iterator chunkIterator = _frostChunks.get(player).iterator(); + //Remove Far Away + Iterator chunkIterator = _redChunks.get(player).iterator(); while (chunkIterator.hasNext()) { ChunkChange change = chunkIterator.next(); - if (Math.abs(player.getLocation().getChunk().getX() - change.Chunk.getX()) > UtilServer.getServer() - .getViewDistance() - || Math.abs(player.getLocation().getChunk().getZ() - change.Chunk.getZ()) > UtilServer.getServer() - .getViewDistance()) + if (Math.abs(player.getLocation().getChunk().getX() - change.Chunk.getX()) > UtilServer.getServer().getViewDistance() || + Math.abs(player.getLocation().getChunk().getZ() - change.Chunk.getZ()) > UtilServer.getServer().getViewDistance()) { chunkIterator.remove(); } } - if (_frostChunks.get(player).isEmpty()) + if (_redChunks.get(player).isEmpty()) continue; - // Get Fittest Chunk to Update + //Get Fittest Chunk to Update int bestId = -1; double bestScore = 0; - for (int i = 0; i < _frostChunks.get(player).size(); i++) + for (int i=0 ; i<_redChunks.get(player).size() ; i++) { - ChunkChange change = _frostChunks.get(player).get(i); + ChunkChange change = _redChunks.get(player).get(i); - // Base Score, 1 per block + //Base Score, 1 per block double score = change.Changes.size(); - // Time Score, multiply block score by 1 + 0.5 per second - score = score * (1 + (System.currentTimeMillis() - change.Time) / 200d); + //Time Score, multiply block score by 1 + 0.5 per second + score = score * (1 + (System.currentTimeMillis() - change.Time)/200d); - // Distance Divisor + //Distance Divisor double dist = 0.5; if (!player.getLocation().getChunk().equals(change.Chunk)) { int x = Math.abs(player.getLocation().getChunk().getX() - change.Chunk.getX()); int z = Math.abs(player.getLocation().getChunk().getZ() - change.Chunk.getZ()); - dist = Math.sqrt(x * x + z * z); + dist = Math.sqrt(x*x + z*z); } - score = score / (dist * dist); + score = score/(dist*dist); if (bestId == -1 || score > bestScore) { @@ -1305,79 +891,70 @@ public class SurvivalGames extends SoloGame if (bestId == -1) continue; - // Send MultiBlock or Chunk Update for Fittest Chunk - ChunkChange change = _frostChunks.get(player).remove(bestId); + //Send MultiBlock or Chunk Update for Fittest Chunk + ChunkChange change = _redChunks.get(player).remove(bestId); if (change.DirtyCount > 63) MapUtil.SendChunkForPlayer(change.Chunk.getX(), change.Chunk.getZ(), player); else - MapUtil.SendMultiBlockForPlayer(change.Chunk.getX(), change.Chunk.getZ(), change.DirtyBlocks, change.DirtyCount, - change.Chunk.getWorld(), player); + MapUtil.SendMultiBlockForPlayer(change.Chunk.getX(), change.Chunk.getZ(), change.DirtyBlocks, change.DirtyCount, change.Chunk.getWorld(), player); } } - public boolean isFrost(Block block) + public boolean IsRed(Block block) { - if (!_frostMap.containsKey(block.getX())) + if (!_redMap.containsKey(block.getX())) return false; - if (!_frostMap.get(block.getX()).containsKey(block.getY())) + if (!_redMap.get(block.getX()).containsKey(block.getY())) return false; - return _frostMap.get(block.getX()).get(block.getY()).contains(block.getZ()); + return _redMap.get(block.getX()).get(block.getY()).contains(block.getZ()); } - public void setFrost(Location loc) + public void SetRed(Location loc) { - // Save Red - if (!_frostMap.containsKey(loc.getBlockX())) - _frostMap.put(loc.getBlockX(), new HashMap>()); + //Save Red + if (!_redMap.containsKey(loc.getBlockX())) + _redMap.put(loc.getBlockX(), new HashMap>()); - if (!_frostMap.get(loc.getBlockX()).containsKey(loc.getBlockY())) - _frostMap.get(loc.getBlockX()).put(loc.getBlockY(), new HashSet()); + if (!_redMap.get(loc.getBlockX()).containsKey(loc.getBlockY())) + _redMap.get(loc.getBlockX()).put(loc.getBlockY(), new HashSet()); - _frostMap.get(loc.getBlockX()).get(loc.getBlockY()).add(loc.getBlockZ()); + _redMap.get(loc.getBlockX()).get(loc.getBlockY()).add(loc.getBlockZ()); - // Red + //Red if (_spreadType == 0) { - frostChangeBlock(loc, 159, (byte) 14); + RedChangeBlock(loc, 159, (byte)14); } - // Snow + //Snow else if (_spreadType == 1) { - if (loc.getBlock().getType() == Material.LEAVES) // RedChangeBlock(loc, 79, (byte)0); + if (loc.getBlock().getType() == Material.LEAVES) //RedChangeBlock(loc, 79, (byte)0); { } - else if (loc.getBlock().getTypeId() == 8 || loc.getBlock().getTypeId() == 9) - frostChangeBlock(loc, 79, (byte) 0); - else if (loc.getBlock().getTypeId() == 10 || loc.getBlock().getTypeId() == 11) - frostChangeBlock(loc, 49, (byte) 0); - else - frostChangeBlock(loc, 80, (byte) 0); + else if (loc.getBlock().getTypeId() == 8 || loc.getBlock().getTypeId() == 9) RedChangeBlock(loc, 79, (byte)0); + else if (loc.getBlock().getTypeId() == 10 || loc.getBlock().getTypeId() == 11) RedChangeBlock(loc, 49, (byte)0); + else RedChangeBlock(loc, 80, (byte)0); } - // Nether - else + //Nether + else { - if (loc.getBlock().getType() == Material.LEAVES) - frostChangeBlock(loc, 88, (byte) 0); - else if (loc.getBlock().getTypeId() == 8 || loc.getBlock().getTypeId() == 9) - frostChangeBlock(loc, 49, (byte) 0); + if (loc.getBlock().getType() == Material.LEAVES) RedChangeBlock(loc, 88, (byte)0); + else if (loc.getBlock().getTypeId() == 8 || loc.getBlock().getTypeId() == 9) RedChangeBlock(loc, 49, (byte)0); else { double r = Math.random(); - if (r > 0.1) - frostChangeBlock(loc, 87, (byte) 0); - else - frostChangeBlock(loc, 153, (byte) 0); - } + if (r > 0.1) RedChangeBlock(loc, 87, (byte)0); + else RedChangeBlock(loc, 153, (byte)0); + } } } @EventHandler - // TODO - public void frostAttack(UpdateEvent event) + public void RedAttack(UpdateEvent event) { if (event.getType() != UpdateType.FASTER) return; @@ -1388,12 +965,12 @@ public class SurvivalGames extends SoloGame for (Block block : UtilBlock.getInRadius(player.getLocation(), 5d).keySet()) { - if (!isFrost(block)) + if (!IsRed(block)) continue; near = true; - // Red + //Red if (_spreadType == 0) { if (block.getRelative(BlockFace.UP).getType() == Material.AIR) @@ -1403,26 +980,23 @@ public class SurvivalGames extends SoloGame } } - // Snow + //Snow else if (_spreadType == 1) { if (Math.random() > 0.95) player.playEffect(block.getLocation().add(0, 1, 0), Effect.STEP_SOUND, Material.SNOW_BLOCK); if (Math.random() > 0.8) - { + { Vector traj = UtilAlg.getTrajectory(block.getLocation().add(0.5, 1.5, 0.5), player.getLocation()); - Snowball ball = player.getWorld().spawn( - block.getLocation().add(0.5, 1.5, 0.5).subtract(traj.clone().multiply(8 + UtilMath.r(8))), - Snowball.class); + Snowball ball = player.getWorld().spawn(block.getLocation().add(0.5, 1.5, 0.5).subtract(traj.clone().multiply(8 + UtilMath.r(8))), Snowball.class); - ball.setVelocity(UtilAlg.getTrajectory(ball.getLocation(), player.getEyeLocation().add(0, 3, 0)).add( - new Vector(Math.random() - 0.5, Math.random() - 0.5, Math.random() - 0.5).multiply(0.1))); - } + ball.setVelocity(UtilAlg.getTrajectory(ball.getLocation(), player.getEyeLocation().add(0, 3, 0)).add(new Vector(Math.random()-0.5, Math.random()-0.5, Math.random()-0.5).multiply(0.1))); + } } - // Nether + //Nether if (_spreadType == 2) { if (block.getRelative(BlockFace.UP).getType() == Material.AIR) @@ -1442,7 +1016,7 @@ public class SurvivalGames extends SoloGame while (!UtilBlock.solid(block) && block.getY() > 0) block = block.getRelative(BlockFace.DOWN); - if (isFrost(block) || block.getY() == 0) + if (IsRed(block) || block.getY() == 0) near = true; } } @@ -1457,111 +1031,29 @@ public class SurvivalGames extends SoloGame { player.getWorld().playSound(player.getLocation(), Sound.AMBIENCE_RAIN, 0.5f, 0f); - if (!_frostOutTime.containsKey(player)) + if (!_redOutTime.containsKey(player)) { - _frostOutTime.put(player, System.currentTimeMillis()); - } + _redOutTime.put(player, System.currentTimeMillis()); + } else { - if (UtilTime.elapsed(_frostOutTime.get(player), 5000)) - { - Manager.GetDamage().NewDamageEvent(player, null, null, DamageCause.VOID, 1, false, true, false, - "Hunger Games", _spreadName); + if (UtilTime.elapsed(_redOutTime.get(player), 5000)) + { + Manager.GetDamage().NewDamageEvent(player, null, null, + DamageCause.VOID, 1, false, true, false, + "Hunger Games", _spreadName); } } } else { - _frostOutTime.remove(player); - } - } - } - - public void refillChests() - { - ArrayList list = new ArrayList(_lootedBlocks); - - _lootedBlocks.clear(); - - for (Location loc : list) - { - if (loc.getChunk().isLoaded()) - { - Block block = loc.getBlock(); - - if (_landedCrates.contains(loc)) - continue; - - if (block.getState() instanceof InventoryHolder) - { - InventoryHolder holder = (InventoryHolder) block.getState(); - - if (!holder.getInventory().getViewers().isEmpty()) - { - fillChest((Player) holder.getInventory().getViewers().get(0), block); - } - } + _redOutTime.remove(player); } } } @EventHandler - public void chestRefill(UpdateEvent event) - { - if (!IsLive() || event.getType() != UpdateType.SEC) - return; - - if (_deathmatchCountdown || _deathmatchLive) - return; - - if (_chestRefillTime > 0) - { - _chestRefillTime--; - switch (_chestRefillTime) - { - case 0: - - Bukkit.broadcastMessage(ChatColor.GOLD + "➽" + ChatColor.GREEN + " The chests has been refilled!"); - - for (Player player : Bukkit.getOnlinePlayers()) - { - player.playSound(player.getEyeLocation(), Sound.IRONGOLEM_DEATH, 1000, 0); - } - - refillChests(); - break; - case 1: - case 2: - case 3: - case 4: - case 5: - case 10: - case 15: - case 30: - case 60: - case 120: - case 180: - case 300: - - String time; - - if (_chestRefillTime >= 60) - time = (_chestRefillTime / 60) + " minute" + (_chestRefillTime > 60 ? "s" : ""); - else - time = _chestRefillTime + " second" + (_chestRefillTime != 1 ? "s" : ""); - - Bukkit.broadcastMessage(ChatColor.GOLD + "➽" + ChatColor.GREEN + " The chests will be refilled in " + time); - - break; - default: - break; - } - } - } - - @EventHandler - // TODO - public void frostDamage(CustomDamageEvent event) + public void RedDamage(CustomDamageEvent event) { if (event.GetProjectile() == null) return; @@ -1574,6 +1066,29 @@ public class SurvivalGames extends SoloGame event.AddKnockback("Snowball", 4); } + @EventHandler + public void DayNightCycle(UpdateEvent event) + { + if (!IsLive()) + return; + + if (event.getType() != UpdateType.TICK) + return; + + long time = WorldData.World.getTime(); + + if (time > 22000 || time < 14000) + { + WorldTimeSet = (WorldTimeSet + 4)%24000; + } + else + { + WorldTimeSet = (WorldTimeSet + 16)%24000; + } + + WorldData.World.setTime(WorldTimeSet); + } + @EventHandler public void SupplyDrop(UpdateEvent event) { @@ -1594,19 +1109,18 @@ public class SurvivalGames extends SoloGame _supplyCurrent = _supplyLocations.remove(UtilMath.r(_supplyLocations.size())); - // Remove Prior - _supplyCrates.remove(_supplyCurrent.getBlock().getRelative(BlockFace.UP)); + //Remove Prior + _supplyChests.remove(_supplyCurrent.getBlock().getRelative(BlockFace.UP)); _supplyCurrent.getBlock().getRelative(BlockFace.UP).setType(Material.AIR); - // Create New + //Create New _supplyCurrent.getBlock().setType(Material.BEACON); - for (int x = -1; x <= 1; x++) - for (int z = -1; z <= 1; z++) + for (int x=-1 ; x<=1 ; x++) + for (int z=-1 ; z<=1 ; z++) _supplyCurrent.getBlock().getRelative(x, -1, z).setType(Material.IRON_BLOCK); - // Announce - this.Announce(C.cYellow + C.Bold + "Supply Drop Incoming (" + ChatColor.RESET - + UtilWorld.locToStrClean(_supplyCurrent) + C.cYellow + C.Bold + ")"); + //Announce + this.Announce(C.cYellow + C.Bold + "Supply Drop Incoming (" + ChatColor.RESET + UtilWorld.locToStrClean(_supplyCurrent) + C.cYellow + C.Bold + ")"); } } else @@ -1619,25 +1133,23 @@ public class SurvivalGames extends SoloGame _supplyEffect.setY(250); } - FireworkEffect effect = FireworkEffect.builder().flicker(false).withColor(Color.YELLOW).with(Type.BURST) - .trail(false).build(); + FireworkEffect effect = FireworkEffect.builder().flicker(false).withColor(Color.YELLOW).with(Type.BURST).trail(false).build(); UtilFirework.playFirework(_supplyEffect, effect); - _supplyEffect.setY(_supplyEffect.getY() - 2); + _supplyEffect.setY(_supplyEffect.getY()-2); if (UtilMath.offset(_supplyEffect, _supplyCurrent) < 2) { - effect = FireworkEffect.builder().flicker(false).withColor(Color.YELLOW).with(Type.BALL_LARGE).trail(true) - .build(); + effect = FireworkEffect.builder().flicker(false).withColor(Color.YELLOW).with(Type.BALL_LARGE).trail(true).build(); UtilFirework.playFirework(_supplyEffect, effect); - // Create Chest + //Create Chest _supplyCurrent.getBlock().setType(Material.GLASS); _supplyCurrent.getBlock().getRelative(BlockFace.UP).setType(Material.CHEST); - _supplyCrates.add(_supplyCurrent.getBlock().getRelative(BlockFace.UP)); - _lootedBlocks.remove(_supplyCurrent); + _supplyChests.add(_supplyCurrent.getBlock().getRelative(BlockFace.UP)); + _openedChest.remove(_supplyCurrent); - // Reset + //Reset _supplyEffect = null; _supplyCurrent = null; } @@ -1645,29 +1157,6 @@ public class SurvivalGames extends SoloGame } } - @EventHandler - public void DayNightCycle(UpdateEvent event) - { - if (!IsLive()) - return; - - if (event.getType() != UpdateType.TICK) - return; - - long time = WorldData.World.getTime(); - - if (time > 22000 || time < 14000) - { - WorldTimeSet = (WorldTimeSet + 4) % 24000; - } - else - { - WorldTimeSet = (WorldTimeSet + 16) % 24000; - } - - WorldData.World.setTime(WorldTimeSet); - } - @EventHandler public void SupplyGlow(UpdateEvent event) { @@ -1677,10 +1166,10 @@ public class SurvivalGames extends SoloGame if (event.getType() != UpdateType.TICK) return; - if (_supplyCrates.isEmpty()) + if (_supplyChests.isEmpty()) return; - Iterator chestIterator = _supplyCrates.iterator(); + Iterator chestIterator = _supplyChests.iterator(); while (chestIterator.hasNext()) { @@ -1696,22 +1185,6 @@ public class SurvivalGames extends SoloGame } } - @EventHandler - public void preventBucketCraft(PrepareItemCraftEvent event) - { - ItemStack result = event.getInventory().getResult(); - - if (result != null) - { - Material type = result.getType(); - - if (type == Material.BUCKET) - { - event.getInventory().setResult(new ItemStack(Material.AIR)); - } - } - } - @EventHandler public void DeathmatchUpdate(UpdateEvent event) { @@ -1745,18 +1218,18 @@ public class SurvivalGames extends SoloGame long timeLeft = 60000 - (System.currentTimeMillis() - _deathmatchTime); if (timeLeft <= 0) - { + { _deathmatchLive = true; - GetTeamList().get(0).SpawnTeleport(false); + GetTeamList().get(0).SpawnTeleport(); - _frostLocations.clear(); + _redLocations.clear(); for (Block block : UtilBlock.getInRadius(_spawn, 52d).keySet()) - frostSpread(block); + RedSpread(block); _deathmatchTime = 10; - } + } } else { @@ -1813,9 +1286,9 @@ public class SurvivalGames extends SoloGame { if (!event.getMessage().equalsIgnoreCase("/dm")) return; - + event.setCancelled(true); - + if (!IsAlive(event.getPlayer())) { UtilPlayer.message(event.getPlayer(), F.main("Game", "You are not in the game.")); @@ -1857,175 +1330,91 @@ public class SurvivalGames extends SoloGame } @EventHandler - public void chestTickEvent(UpdateEvent event) + public void CompassUpdate(UpdateEvent event) { - if (event.getType() != UpdateType.SLOW) + if (event.getType() != UpdateType.SEC) return; - Iterator> itel = _openedChests.entrySet().iterator(); - - while (itel.hasNext()) - { - Entry entry = itel.next(); - // TODO Test this is removed properly when unloaded chunks - // TODO Load chests status when chunk loads packets - try - { - int key = (entry.getKey().x + entry.getKey().y + entry.getKey().z) % 200; - - int ticks = (_ticksField.getInt(entry.getKey()) + key) % 200; - - System.out.print(ticks + " - " + entry.getKey().o); - - if (ticks == entry.getValue()) - { - if (ticks == 1) - { - System.out.print("Removed"); - itel.remove(); - } - else - { - _ticksField.setInt(entry.getKey(), (200 - key) + ticks - 1); - _openedChests.put(entry.getKey(), ticks - 1); - } - } - else - { - _ticksField.setInt(entry.getKey(), (200 - key) + 10); - System.out.print((_ticksField.getInt(entry.getKey()) + key)); - _openedChests.put(entry.getKey(), 10); - } - } - catch (Exception ex) - { - ex.printStackTrace(); - } - } - } - - @EventHandler - public void chestCloseEvent(InventoryCloseEvent event) - { - InventoryHolder holder = event.getInventory().getHolder(); - - if (holder instanceof DoubleChest) - { - holder = (Chest) ((DoubleChest) holder).getLeftSide(); - } - - if (holder instanceof Chest) - { - Block block = ((Chest) holder).getBlock(); - - TileEntity tileEntity = ((CraftWorld) block.getWorld()).getTileEntityAt(block.getX(), block.getY(), block.getZ()); - - if (tileEntity instanceof TileEntityChest) - { - TileEntityChest chest = (TileEntityChest) tileEntity; - - try - { - chest.o = 10; - - int key = (chest.x + chest.y + chest.z) % 200; - - _ticksField.setInt(chest, (200 - key) + 10); - - _openedChests.put(chest, 10); - } - catch (Exception ex) - { - ex.printStackTrace(); - } - } - } - } - - @EventHandler - public void onUse(PlayerInteractEvent event) - { if (!IsLive()) return; - Player player = event.getPlayer(); - - if (!IsAlive(player)) - return; - - if (!event.getAction().name().contains("RIGHT")) - return; - - ItemStack item = event.getItem(); - - if (item == null || item.getType() != Material.COMPASS) - return; - - int uses = Integer.parseInt(ChatColor.stripColor(item.getItemMeta().getLore().get(0)).replaceAll("\\D+", "")); - - if (uses > 0) + //Night Time > Drop Target + if (WorldData.World.getTime() > 14000 && WorldData.World.getTime() < 23000 && _supplyCurrent != null) { - uses--; - - Player closest = null; - double cDist = 0; - - for (Player p : GetPlayers(true)) + for (Player player : GetPlayers(true)) { - if (p != player) - { - double dist = p.getLocation().distance(player.getLocation()); + player.setCompassTarget(_supplyCurrent); - if (dist > 10 && (closest == null || dist < cDist)) + for (int i : player.getInventory().all(Material.COMPASS).keySet()) + { + ItemStack stack = player.getInventory().getItem(i); + + ItemMeta itemMeta = stack.getItemMeta(); + itemMeta.setDisplayName( + C.cWhite + C.Bold + "Supply Drop Location: " + C.cYellow + UtilMath.trim(1, UtilMath.offset(player.getLocation(), _supplyCurrent))); + stack.setItemMeta(itemMeta); + + player.getInventory().setItem(i, stack); + } + } + } + //Player Target + else + { + for (Player player : GetPlayers(true)) + { + Player target = null; + double bestDist = 0; + + for (Player other : Manager.GetGame().GetPlayers(true)) + { + if (other.equals(player)) + continue; + + if (other.isSneaking()) + continue; + + double dist = UtilMath.offset(player, other); + + if (target == null || dist < bestDist) { - cDist = dist; - closest = p; + target = other; + bestDist = dist; + } + } + + if (target != null) + { + player.setCompassTarget(target.getLocation()); + + for (int i : player.getInventory().all(Material.COMPASS).keySet()) + { + ItemStack stack = player.getInventory().getItem(i); + + + ItemMeta itemMeta = stack.getItemMeta(); + itemMeta.setDisplayName( + " " + C.cWhite + C.Bold + "Nearest Player: " + C.cYellow + target.getName() + + " " + C.cWhite + C.Bold + "Distance: " + C.cYellow + UtilMath.trim(1, bestDist)); + stack.setItemMeta(itemMeta); + + player.getInventory().setItem(i, stack); } } } - - if (closest != null) - { - player.playSound(player.getLocation(), Sound.ORB_PICKUP, 1, 0); - closest.playSound(closest.getLocation(), Sound.ORB_PICKUP, 1, 0); - - player.setCompassTarget(closest.getLocation()); - player.setItemInHand(buildCompass(uses)); - - closest.sendMessage(F.main("Compass", player.getName() + " used a compass on you!")); - - player.sendMessage(F.main("Compass", "Located " + closest.getName() + " " + (int) cDist + " blocks away")); - - if (uses >= 1) - { - player.sendMessage(F.main("Compass", uses + " use" + (uses > 1 ? "s" : "") + " of the compass remaining.")); - } - else - { - player.sendMessage(F.main("Compass", "No remaining uses! Next use will break it!")); - } - } - } - else - { - player.sendMessage(F.main("Compass", "The compass breaks! No remaining uses!")); - - player.getWorld().playSound(player.getLocation(), Sound.ITEM_BREAK, 1, 5); - - player.setItemInHand(new ItemStack(Material.AIR)); - } - } + } + } @EventHandler - public void DisallowBrewingStand(PlayerInteractEvent event) + public void DisallowBrewFurnace(PlayerInteractEvent event) { if (event.getClickedBlock() == null) return; - if (event.getClickedBlock().getType() == Material.BREWING_STAND) - { + if (event.getClickedBlock().getType() == Material.BREWING_STAND || + event.getClickedBlock().getType() == Material.FURNACE || + event.getClickedBlock().getType() == Material.BURNING_FURNACE) event.setCancelled(true); - } } @EventHandler @@ -2058,7 +1447,7 @@ public class SurvivalGames extends SoloGame Player player = event.getPlayer(); - if (!UtilInv.IsItem(player.getItemInHand(), Material.TNT, (byte) 0)) + if (!UtilInv.IsItem(player.getItemInHand(), Material.TNT, (byte)0)) return; event.setCancelled(true); @@ -2071,16 +1460,15 @@ public class SurvivalGames extends SoloGame if (!Manager.GetGame().CanThrowTNT(player.getLocation())) { - // Inform + //Inform UtilPlayer.message(event.getPlayer(), F.main(GetName(), "You cannot use " + F.item("Throw TNT") + " here.")); return; } - UtilInv.remove(player, Material.TNT, (byte) 0, 1); + UtilInv.remove(player, Material.TNT, (byte)0, 1); UtilInv.Update(player); - TNTPrimed tnt = player.getWorld() - .spawn(player.getEyeLocation().add(player.getLocation().getDirection()), TNTPrimed.class); + TNTPrimed tnt = player.getWorld().spawn(player.getEyeLocation().add(player.getLocation().getDirection()), TNTPrimed.class); UtilAction.velocity(tnt, player.getLocation().getDirection(), 0.5, false, 0, 0.1, 10, false); @@ -2095,53 +1483,64 @@ public class SurvivalGames extends SoloGame Player player = _tntMap.remove(event.getEntity()); - /*CustomExplosion explosion = new CustomExplosion(this.getArcadeManager().GetDamage(), event.getEntity().getLocation(), - ((TNTPrimed) event.getEntity()).getYield(), "Throwing TNT"); - - explosion.setPlayer(player, true);*/ - for (Player other : UtilPlayer.getNearby(event.getEntity().getLocation(), 14)) Manager.GetCondition().Factory().Explosion("Throwing TNT", other, player, 50, 0.1, false, false); } @EventHandler - // TODO - public void BlockPlaceOnFrost(BlockPlaceEvent event) - { - if (isFrost(event.getBlockAgainst())) + public void BlockPlace(BlockPlaceEvent event) + { + if (IsRed(event.getBlockAgainst())) { event.setCancelled(true); return; } + + if (event.getItemInHand().getType() == Material.PISTON_BASE) + { + _placedBlocks.add(event.getBlock().getLocation()); + event.setCancelled(false); + + final Block block = event.getBlock(); + + UtilServer.getServer().getScheduler().scheduleSyncDelayedTask(Manager.getPlugin(), new Runnable() + { + public void run() + { + block.setType(Material.PISTON_BASE); + block.setData((byte) 6); + } + }, 0); + } } @EventHandler - public void TourneyKills(CombatDeathEvent event) - { - if (!(event.GetEvent().getEntity() instanceof Player)) - return; - - Player killed = (Player) event.GetEvent().getEntity(); - - if (event.GetLog().GetKiller() != null) - { - Player killer = UtilPlayer.searchExact(event.GetLog().GetKiller().GetName()); - - if (killer != null && !killer.equals(killed)) - { - // Manager.GetStatsManager().addStat(killer, GetName(), "kills", 1); - } - } - - if (event.GetLog().GetPlayer() != null) - { - if (killed != null) - { - // Manager.GetStatsManager().addStat(killed, GetName(), "deaths", 1); - } - } - } + public void TourneyKills(CombatDeathEvent event) + { + if (!(event.GetEvent().getEntity() instanceof Player)) + return; + + Player killed = (Player)event.GetEvent().getEntity(); + + if (event.GetLog().GetKiller() != null) + { + Player killer = UtilPlayer.searchExact(event.GetLog().GetKiller().GetName()); + if (killer != null && !killer.equals(killed)) + { + //Manager.GetStatsManager().addStat(killer, GetName(), "kills", 1); + } + } + + if (event.GetLog().GetPlayer() != null) + { + if (killed != null) + { + //Manager.GetStatsManager().addStat(killed, GetName(), "deaths", 1); + } + } + } + @EventHandler public void BlockBreak(BlockBreakEvent event) { @@ -2176,102 +1575,18 @@ public class SurvivalGames extends SoloGame event.setCancelled(true); } - private void deathOrQuit(Player player) - { - if (!IsLive()) - return; - - String name = ""; - - for (char c : ("" + _deadBodyCount++).toCharArray()) - { - name += "§" + c; - } - - try - { - - Team team = player.getScoreboard().registerNewTeam(name); - - if (_hiddenNames.containsKey(player) && !_hiddenNames.get(player).isEmpty()) - { - ScoreboardTeam nmsTeam = (ScoreboardTeam) _packetTeam.get(team); - - PacketPlayOutScoreboardTeam packet = new PacketPlayOutScoreboardTeam(nmsTeam, 2); - - Field teamName = PacketPlayOutScoreboardTeam.class.getDeclaredField("a"); - teamName.setAccessible(true); - - for (Player alive : GetPlayers(true)) - { - if (_hiddenNames.get(player).contains(alive.getName())) - { - teamName.set(packet, alive.getName()); - UtilPlayer.sendPacket(player, packet); - } - } - } - - team.setNameTagVisibility(TeamNameTagVisibility.NEVER); - team.addEntry(name); - - PacketPlayOutScoreboardTeam packet = new PacketPlayOutScoreboardTeam((ScoreboardTeam) _packetTeam.get(team), 2); - - for (Player alive : GetPlayers(false)) - { - UtilPlayer.sendPacket(alive, packet); - } - - } - catch (Exception ex) - { - ex.printStackTrace(); - } - - GameProfile newProfile = new GameProfile(UUID.randomUUID(), name); - - newProfile.getProperties().putAll(((CraftPlayer) player).getHandle().getProfile().getProperties()); - - DisguisePlayer disguise = new DisguisePlayer(null, newProfile); - disguise.setSleeping(BlockFace.values()[Math.round(player.getLocation().getYaw() / 90F) & 0x3].getOppositeFace()); - - getArcadeManager().GetDisguise().addFutureDisguise(disguise); - - Entity entity = player.getWorld().spawnEntity(player.getLocation(), EntityType.ARROW); - try - { - EntityArrow entityArrow = ((CraftArrow) entity).getHandle(); - - Field at = EntityArrow.class.getDeclaredField("at"); - at.setAccessible(true); - at.set(entityArrow, Integer.MIN_VALUE); // Despawn time - } - catch (Exception ex) - { - ex.printStackTrace(); - } - - _hiddenNames.remove(player); - } - @EventHandler public void PlayerKillAward(CombatDeathEvent event) { Game game = Manager.GetGame(); - if (game == null) - return; + if (game == null) return; if (!(event.GetEvent().getEntity() instanceof Player)) return; - Player player = (Player) event.GetEvent().getEntity(); - - deathOrQuit(player); - - FireworkEffect effect = FireworkEffect.builder().flicker(false).withColor(Color.RED).with(Type.BALL_LARGE).trail(false) - .build(); - for (int i = 0; i < 3; i++) - UtilFirework.launchFirework(player.getLocation(), effect, null, 3); + FireworkEffect effect = FireworkEffect.builder().flicker(false).withColor(Color.RED).with(Type.BALL_LARGE).trail(false).build(); + for (int i=0 ; i<3 ; i++) + UtilFirework.launchFirework(event.GetEvent().getEntity().getLocation(), effect, null, 3); if (event.GetLog().GetKiller() == null) return; @@ -2280,7 +1595,7 @@ public class SurvivalGames extends SoloGame if (killer == null) return; - if (killer.equals(player)) + if (killer.equals(event.GetEvent().getEntity())) return; killer.giveExpLevels(1); @@ -2299,12 +1614,11 @@ public class SurvivalGames extends SoloGame } @EventHandler - // TODO public void FixClean(PlayerQuitEvent event) { - _frostChunks.remove(event.getPlayer()); + _redChunks.remove(event.getPlayer()); } - + @Override @EventHandler public void ScoreboardUpdate(UpdateEvent event) @@ -2318,7 +1632,7 @@ public class SurvivalGames extends SoloGame Scoreboard.Reset(); Scoreboard.WriteBlank(); - + GameTeam team = GetTeamList().get(0); if (team.GetPlayers(false).size() < 9) @@ -2351,18 +1665,19 @@ public class SurvivalGames extends SoloGame Scoreboard.Write(C.cRed + "Players Dead"); Scoreboard.Write("" + (team.GetPlayers(false).size() - team.GetPlayers(true).size())); } - + + if (_deathmatchCountdown) { if (event.getType() != UpdateType.TICK) return; long timeLeft = 60000 - (System.currentTimeMillis() - _deathmatchTime); - + Scoreboard.WriteBlank(); Scoreboard.Write(C.cYellow + C.Bold + "Deathmatch"); Scoreboard.Write(UtilTime.MakeStr(Math.max(0, timeLeft), 0)); - + } Scoreboard.Draw(); @@ -2378,12 +1693,13 @@ public class SurvivalGames extends SoloGame return true; } - + @EventHandler public void deathmatchBowShoot(EntityShootBowEvent event) { if (isDeathMatchAboutToStart()) event.getProjectile().remove(); } - + + } From 98b14c9c7e361ee2b3d3ff6573fe197e804fa3af Mon Sep 17 00:00:00 2001 From: Jonathan Williams Date: Wed, 11 Mar 2015 19:20:42 -0700 Subject: [PATCH 2/4] Fixed Clans repository so it uses the pool. --- .../mineplex/game/clans/clans/repository/ClanRepository.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/repository/ClanRepository.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/repository/ClanRepository.java index 109d4354e..e22160e3c 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/repository/ClanRepository.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/repository/ClanRepository.java @@ -9,6 +9,7 @@ import java.util.UUID; import org.bukkit.plugin.java.JavaPlugin; import mineplex.core.common.util.NautHashMap; +import mineplex.core.database.DBPool; import mineplex.core.database.RepositoryBase; import mineplex.core.database.ResultSetCallable; import mineplex.core.database.column.ColumnBoolean; @@ -59,7 +60,7 @@ public class ClanRepository extends RepositoryBase public ClanRepository(JavaPlugin plugin, String serverName) { - super(plugin, "jdbc:mysql://db.mineplex.com:3306/Account?autoReconnect=true&failOverReadOnly=false&maxReconnects=10", "root", "tAbechAk3wR7tuTh"); + super(plugin, DBPool.ACCOUNT); _serverName = serverName; } From ca9ebbb1bd1c8e4181f35b0e601500c5ce8ad5d9 Mon Sep 17 00:00:00 2001 From: Jonathan Williams Date: Thu, 12 Mar 2015 04:09:38 -0700 Subject: [PATCH 3/4] Updated NoCheatPlus.jar - Removed VehicleExit check because we don't use and we altered the event. It spammed consoles when people dismounted from non-vehicles. --- Plugins/Libraries/NoCheatPlus.jar | Bin 853820 -> 845482 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Plugins/Libraries/NoCheatPlus.jar b/Plugins/Libraries/NoCheatPlus.jar index c7977e1a04a5baeb9713f72d53801e850e016993..8f367f9965b6d3a4cc8ac69a384dc3ae9c94fcd8 100644 GIT binary patch delta 63615 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 delta 76013 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 Date: Thu, 12 Mar 2015 04:10:15 -0700 Subject: [PATCH 4/4] Re-enabled cross-server functionality. RedisPartyHandler execution is now run on Bukkit main thread. --- .../src/mineplex/core/message/MessageManager.java | 10 +++------- .../src/mineplex/core/party/PartyManager.java | 6 ++---- .../mineplex/core/party/redis/RedisPartyHandler.java | 11 ++++++++--- .../src/mineplex/core/punish/Punish.java | 4 ++-- .../src/mineplex/core/teleport/Teleport.java | 6 ++---- 5 files changed, 17 insertions(+), 20 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/message/MessageManager.java b/Plugins/Mineplex.Core/src/mineplex/core/message/MessageManager.java index 6096e46e9..108587241 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/message/MessageManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/message/MessageManager.java @@ -66,9 +66,9 @@ public class MessageManager extends MiniClientPlugin ServerCommandManager.getInstance().registerCommandType("AnnouncementCommand", AnnouncementCommand.class, new AnnouncementHandler()); - //ServerCommandManager.getInstance().registerCommandType("RedisMessage", RedisMessage.class, messageHandler); - //ServerCommandManager.getInstance() - // .registerCommandType("RedisMessageCallback", RedisMessageCallback.class, messageHandler); + ServerCommandManager.getInstance().registerCommandType("RedisMessage", RedisMessage.class, messageHandler); + ServerCommandManager.getInstance() + .registerCommandType("RedisMessageCallback", RedisMessageCallback.class, messageHandler); } public void addCommands() @@ -113,7 +113,6 @@ public class MessageManager extends MiniClientPlugin public String canReceiverMessageThem(String sender, Player target) { - // If the receiver has turned off private messaging and the sender isn't a mod if (!_preferences.Get(target).PrivateMessaging) { @@ -311,7 +310,6 @@ public class MessageManager extends MiniClientPlugin public void receiveMessage(Player to, RedisMessage globalMessage) { - if (globalMessage.isStaffMessage()) { // Message the receiver @@ -490,7 +488,6 @@ public class MessageManager extends MiniClientPlugin // If this is a admin message, or the sender isn't muted/ignoring the target if (adminMessage || canSenderMessageThem(sender, playerTarget)) { - /* // Construct the command to send to redis RedisMessage globalMessage = new RedisMessage(_serverName, @@ -530,7 +527,6 @@ public class MessageManager extends MiniClientPlugin // Time to send the message! globalMessage.publish(); - */ } } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/party/PartyManager.java b/Plugins/Mineplex.Core/src/mineplex/core/party/PartyManager.java index 20601c066..89afcd12b 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/party/PartyManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/party/PartyManager.java @@ -40,8 +40,8 @@ public class PartyManager extends MiniPlugin _preferenceManager = preferenceManager; _serverName = getPlugin().getConfig().getString("serverstatus.name"); - //ServerCommandManager.getInstance().registerCommandType("RedisPartyData", RedisPartyData.class, - // new RedisPartyHandler(this)); + ServerCommandManager.getInstance().registerCommandType("RedisPartyData", RedisPartyData.class, + new RedisPartyHandler(this)); } @Override @@ -92,7 +92,6 @@ public class PartyManager extends MiniPlugin @EventHandler public void serverTransfer(ServerTransferEvent event) { - /* for (Party party : _parties) { if (party.GetLeader().equals(event.getPlayer().getName())) @@ -124,7 +123,6 @@ public class PartyManager extends MiniPlugin break; } } - */ } @EventHandler(priority = EventPriority.MONITOR) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/party/redis/RedisPartyHandler.java b/Plugins/Mineplex.Core/src/mineplex/core/party/redis/RedisPartyHandler.java index fbd3a4bc2..927582c1f 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/party/redis/RedisPartyHandler.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/party/redis/RedisPartyHandler.java @@ -17,9 +17,14 @@ public class RedisPartyHandler implements CommandCallback @Override public void run(ServerCommand command) { - RedisPartyData data = (RedisPartyData) command; + final RedisPartyData data = (RedisPartyData) command; - _partyManager.addParty(new Party(_partyManager, data)); + _partyManager.getPlugin().getServer().getScheduler().runTask(_partyManager.getPlugin(), new Runnable() + { + public void run() + { + _partyManager.addParty(new Party(_partyManager, data)); + } + }); } - } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/punish/Punish.java b/Plugins/Mineplex.Core/src/mineplex/core/punish/Punish.java index e84a1c1bd..ad0cf6594 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/punish/Punish.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/punish/Punish.java @@ -167,7 +167,7 @@ public class Punish extends MiniPlugin if (target != null) target.kickPlayer(kickReason); else - ;//new mineplex.serverdata.transfers.PunishCommand(playerName, true, false, kickReason).publish(); + new mineplex.serverdata.transfers.PunishCommand(playerName, true, false, kickReason).publish(); } }); @@ -193,7 +193,7 @@ public class Punish extends MiniPlugin target.playSound(target.getLocation(), Sound.CAT_MEOW, 1f, 1f); } else - ;//new mineplex.serverdata.transfers.PunishCommand(playerName, false, finalDuration != 0, F.main("Punish", F.elem(C.cGray + C.Bold + (finalDuration != 0 ? "Mute" : "Warning") + " Reason: ") + reason)).publish(); + new mineplex.serverdata.transfers.PunishCommand(playerName, false, finalDuration != 0, F.main("Punish", F.elem(C.cGray + C.Bold + (finalDuration != 0 ? "Mute" : "Warning") + " Reason: ") + reason)).publish(); _repository.LoadPunishClient(playerName, new Callback() { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/teleport/Teleport.java b/Plugins/Mineplex.Core/src/mineplex/core/teleport/Teleport.java index 6e13426a4..40a2d0f83 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/teleport/Teleport.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/teleport/Teleport.java @@ -45,20 +45,18 @@ public class Teleport extends MiniPlugin super("Teleport", plugin); _serverName = getPlugin().getConfig().getString("serverstatus.name"); - - /* + RedisLocateHandler locateHandler = new RedisLocateHandler(this); ServerCommandManager.getInstance().registerCommandType("RedisLocate", RedisLocate.class, locateHandler); ServerCommandManager.getInstance().registerCommandType("RedisLocateCallback", RedisLocateCallback.class, locateHandler); - */ } @Override public void addCommands() { addCommand(new TeleportCommand(this)); - //addCommand(new LocateCommand(this)); + addCommand(new LocateCommand(this)); } public void handleLocateCallback(RedisLocateCallback callback)