From 6ad09f0adefc61053f697600c9545af7056fb700 Mon Sep 17 00:00:00 2001 From: Mini-Chiss Date: Sat, 2 May 2015 22:05:12 -0500 Subject: [PATCH] Master Builder update --- .../core/common/util/UtilParticle.java | 62 +-- .../game/arcade/game/games/build/Build.java | 466 +++++++++++++++--- .../arcade/game/games/build/BuildData.java | 159 +++++- .../arcade/game/games/build/BuildQuality.java | 13 +- .../games/build/gui/page/ParticlesPage.java | 4 +- 5 files changed, 608 insertions(+), 96 deletions(-) diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilParticle.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilParticle.java index df8cd78a2..644b58e31 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilParticle.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilParticle.java @@ -12,7 +12,7 @@ public class UtilParticle { public enum ParticleType { - ANGRY_VILLAGER("angryVillager", "Angry Villager", Material.SAPLING, (byte) 0), + ANGRY_VILLAGER("angryVillager", "Lightning Cloud", Material.INK_SACK, (byte) 11), BLOCK_CRACK("blockcrack_1_0") { @@ -34,33 +34,33 @@ public class UtilParticle BUBBLE("bubble"), - CLOUD("cloud"), + CLOUD("cloud", "White Smoke", Material.INK_SACK, (byte) 7), - CRIT("crit"), + CRIT("crit", "Brown Magic", Material.INK_SACK, (byte) 14), DEPTH_SUSPEND("depthSuspend"), - DRIP_LAVA("dripLava"), + DRIP_LAVA("dripLava", "Lava Drip", Material.LAVA_BUCKET, (byte) 0), - DRIP_WATER("dripWater"), + DRIP_WATER("dripWater", "Water Drop", Material.WATER_BUCKET, (byte) 0), - DROPLET("droplet"), + DROPLET("droplet", "Water Splash", Material.INK_SACK, (byte) 4), - ENCHANTMENT_TABLE("enchantmenttable"), + ENCHANTMENT_TABLE("enchantmenttable", "Enchantment Words", Material.BOOK, (byte) 0), - EXPLODE("explode"), + EXPLODE("explode", "Big White Smoke", Material.INK_SACK, (byte) 15), - FIREWORKS_SPARK("fireworksSpark"), + FIREWORKS_SPARK("fireworksSpark", "White Sparkle", Material.GHAST_TEAR, (byte) 0), - FLAME("flame"), + FLAME("flame", "Flame", Material.BLAZE_POWDER, (byte) 0), - FOOTSTEP("footstep"), + FOOTSTEP("footstep", "Foot Step", Material.LEATHER_BOOTS, (byte) 0), - HAPPY_VILLAGER("happyVillager"), + HAPPY_VILLAGER("happyVillager", "Emerald Sparkle", Material.EMERALD, (byte) 0), - HEART("heart"), + HEART("heart", "Love Heart", Material.APPLE, (byte) 0), - HUGE_EXPLOSION("hugeexplosion"), + HUGE_EXPLOSION("hugeexplosion", "Huge Explosion", Material.TNT, (byte) 0), ICON_CRACK("iconcrack_1_0") { @@ -73,48 +73,48 @@ public class UtilParticle INSTANT_SPELL("instantSpell"), - LARGE_EXPLODE("largeexplode"), + LARGE_EXPLODE("largeexplode", "Explosion", Material.FIREBALL, (byte) 0), - LARGE_SMOKE("largesmoke"), + LARGE_SMOKE("largesmoke", "Black Smoke", Material.INK_SACK, (byte) 0), - LAVA("lava"), + LAVA("lava", "Lava Debris", Material.LAVA, (byte) 0), - MAGIC_CRIT("magicCrit"), + MAGIC_CRIT("magicCrit", "Teal Magic", Material.INK_SACK, (byte) 6), /** * Can be colored if count is 0, color is RGB and depends on the offset of xyz */ - MOB_SPELL("mobSpell"), + MOB_SPELL("mobSpell", "Black Swirls", Material.getMaterial(2263), (byte) 0), /** * Can be colored if count is 0, color is RGB and depends on the offset of xyz */ - MOB_SPELL_AMBIENT("mobSpellAmbient"), + MOB_SPELL_AMBIENT("mobSpellAmbient", "Transparent Black Swirls", Material.getMaterial(2266), (byte) 0), - NOTE("note"), + NOTE("note", "Musical Note", Material.JUKEBOX, (byte) 0), - PORTAL("portal"), + PORTAL("portal", "Portal Effect", Material.INK_SACK, (byte) 5), /** * Can be colored if count is 0, color is RGB and depends on the offset of xyz. Offset y if 0 will default to 1, counter by making it 0.0001 */ - RED_DUST("reddust"), + RED_DUST("reddust", "Red Smoke", Material.INK_SACK, (byte) 1), - SLIME("slime"), + SLIME("slime", "Slime Particles", Material.SLIME_BALL, (byte) 0), - SNOW_SHOVEL("snowshovel"), + SNOW_SHOVEL("snowshovel", "Snow Puffs", Material.SNOW_BALL, (byte) 0), SNOWBALL_POOF("snowballpoof"), - SPELL("spell"), + SPELL("spell", "White Swirls", Material.getMaterial(2264), (byte) 0), SPLASH("splash"), SUSPEND("suspended"), - TOWN_AURA("townaura"), + TOWN_AURA("townaura", "Black Specks", Material.COAL, (byte) 0), - WITCH_MAGIC("witchMagic"); + WITCH_MAGIC("witchMagic", "Purple Magic", Material.INK_SACK, (byte) 13); public String particleName; private boolean _friendlyData; @@ -130,6 +130,7 @@ public class UtilParticle ParticleType(String particleName, String friendlyName, Material material, byte data) { + this.particleName = particleName; _friendlyData = true; _friendlyName = friendlyName; _material = material; @@ -148,6 +149,11 @@ public class UtilParticle public String getFriendlyName() { + if (_friendlyName == null) + { + return toString(); + } + return _friendlyName; } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/build/Build.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/build/Build.java index 826aa9289..03d8080cb 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/build/Build.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/build/Build.java @@ -8,27 +8,48 @@ import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.block.Block; +import org.bukkit.entity.Boat; import org.bukkit.entity.Entity; import org.bukkit.entity.Item; +import org.bukkit.entity.ItemFrame; +import org.bukkit.entity.Minecart; +import org.bukkit.entity.Painting; import org.bukkit.entity.Player; import org.bukkit.entity.TNTPrimed; import org.bukkit.entity.ThrownPotion; +import org.bukkit.entity.minecart.CommandMinecart; import org.bukkit.entity.minecart.ExplosiveMinecart; +import org.bukkit.entity.minecart.HopperMinecart; +import org.bukkit.entity.minecart.PoweredMinecart; +import org.bukkit.entity.minecart.RideableMinecart; +import org.bukkit.entity.minecart.SpawnerMinecart; +import org.bukkit.entity.minecart.StorageMinecart; 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.BlockFromToEvent; import org.bukkit.event.block.BlockPistonExtendEvent; import org.bukkit.event.block.BlockPistonRetractEvent; import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.CreatureSpawnEvent; +import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; +import org.bukkit.event.entity.EntityCombustEvent; +import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.entity.EntityShootBowEvent; +import org.bukkit.event.entity.EntitySpawnEvent; +import org.bukkit.event.entity.ItemDespawnEvent; import org.bukkit.event.entity.ProjectileLaunchEvent; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.player.PlayerBucketEmptyEvent; import org.bukkit.event.player.PlayerDropItemEvent; +import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerMoveEvent; +import org.bukkit.event.player.PlayerPickupItemEvent; import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.vehicle.VehicleCreateEvent; +import org.bukkit.event.vehicle.VehicleDamageEvent; import org.bukkit.inventory.ItemStack; import mineplex.core.common.util.C; @@ -46,10 +67,12 @@ import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilTime; import mineplex.core.common.util.UtilTextMiddle; +import mineplex.core.explosion.ExplosionEvent; import mineplex.core.itemstack.ItemStackFactory; import mineplex.core.recharge.Recharge; 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.GameType; import nautilus.game.arcade.events.GameStateChangeEvent; @@ -100,16 +123,18 @@ public class Build extends SoloGame this.BlockBreak = true; this.BlockPlace = true; - + this.ItemDrop = true; this.ItemPickup = true; this.InventoryClick = true; this.WorldTimeSet = 6000; - + this.PrepareFreeze = false; + this.CreatureAllow = true; + _words = new String[] { "Pirate Ship", "Mineshaft", "Archers Tower", "Dinner Table", "Pokemon" @@ -124,6 +149,7 @@ public class Build extends SoloGame { event.GetPlayer().setGameMode(GameMode.CREATIVE); event.GetPlayer().setFlying(true); + event.GetPlayer().setFlySpeed(0.04f); } @EventHandler @@ -146,10 +172,12 @@ public class Build extends SoloGame Location spawn = UtilAlg.findClosest(player.getLocation(), this.GetTeamList().get(0).GetSpawns()); _data.put(player, new BuildData(player, spawn, WorldData.GetDataLocs("YELLOW"))); + + player.setFlySpeed(0.1f); } _word = _words[UtilMath.r(_words.length)]; - + UtilTextMiddle.display(null, C.cYellow + "Build " + C.cWhite + _word, 0, 80, 5); } } @@ -170,13 +198,13 @@ public class Build extends SoloGame { _buildGameState++; _buildStateTime = System.currentTimeMillis(); - + //Flags this.BlockBreak = false; this.BlockPlace = false; this.InventoryClick = false; - + UtilTextMiddle.display(null, C.cYellow + "Time Up!", 0, 60, 5); for (Player player : GetPlayers(true)) @@ -201,33 +229,33 @@ public class Build extends SoloGame { for (Player player : GetPlayers(true)) UtilInv.Clear(player); - + //Verdict if (!_viewData.Judged) { - BuildQuality quality = getQuality(_viewData.getScore()); - + BuildQuality quality = BuildQuality.getQuality(_viewData.getScore()); + if (quality == BuildQuality.Failure) { Manager.GetExplosion().BlockExplosion(_viewData.Blocks, _viewData.Spawn, false); - + //Effects _viewData.Spawn.getWorld().playSound(_viewData.Spawn, Sound.EXPLODE, 3f, 1f); UtilParticle.PlayParticle(ParticleType.HUGE_EXPLOSION, _viewData.Spawn, 4f, 4f, 4f, 0, 10); } - + //Announce Builder UtilTextMiddle.display(quality.getText(), "Built by: " + C.Bold + _viewData.Player.getName(), 0, 80, 5); } - + _viewData.Judged = true; } - + //Start Vote if (UtilTime.elapsed(_buildStateTime, _viewTime) || _viewData == null) { _viewData = null; - + //Get Next View Data for (BuildData data : _data.values()) { @@ -237,7 +265,7 @@ public class Build extends SoloGame break; } } - + //All Builds are Viewed if (_viewData == null) { @@ -252,7 +280,7 @@ public class Build extends SoloGame else { teleportPlayers(_viewData); - + //Give Items for (Player player : GetPlayers(true)) { @@ -265,10 +293,10 @@ public class Build extends SoloGame player.getInventory().addItem(ItemStackFactory.Instance.CreateStack(160, (byte)3, 1, C.Bold + "+4 " + C.cAqua + C.Bold + "Amazing")); player.getInventory().addItem(ItemStackFactory.Instance.CreateStack(160, (byte)10, 1, C.Bold + "+5 " + C.cPurple + C.Bold + "WOW! EVERYTHING IS AWESOME!")); } - + //Text UtilTextMiddle.display(null, C.cYellow + "Cast Your Vote!", 0, 60, 5); - + _buildStateTime = System.currentTimeMillis(); } } @@ -306,19 +334,19 @@ public class Build extends SoloGame AddGems(bestPlayer, bestScore, "Build Votes", false, false); - + BuildData data = _data.remove(bestPlayer); - + //Teleport to winner if (first) { teleportPlayers(data); - + first = false; } //Only count if they got above TERRIBLE score - if (getQuality(bestScore) != BuildQuality.Failure) + if (BuildQuality.getQuality(bestScore) != BuildQuality.Failure) places.add(bestPlayer); } @@ -346,14 +374,14 @@ public class Build extends SoloGame private void teleportPlayers(BuildData data) { - //Teleport + //Teleport for (int i=0 ; i Math.max(data.CornerA.getBlockY(), data.CornerB.getBlockY()) + 3) + if (event.getTo().getY() > Math.max(data.CornerA.getBlockY(), data.CornerB.getBlockY()) + 3 && + UtilMath.offset(data.Spawn, event.getFrom()) < UtilMath.offset(data.Spawn, event.getTo())) { //Inform if (Recharge.Instance.use(event.getPlayer(), "Boundary Check", 1000, false, false)) @@ -468,28 +494,28 @@ public class Build extends SoloGame if (_buildGameState != 2) return; - + if (_viewData == null) return; - + if (!IsAlive(event.getPlayer())) return; - + if (!UtilGear.isMat(event.getPlayer().getItemInHand(), Material.STAINED_GLASS_PANE)) return; - + if (!UtilEvent.isAction(event, ActionType.R) && !UtilEvent.isAction(event, ActionType.L)) return; - + if (event.getPlayer().equals(_viewData.Player)) { UtilPlayer.message(event.getPlayer(), F.main("Game", "You cannot vote on your own creation!")); return; } - + if (!UtilTime.elapsed(_buildStateTime, 1500)) return; - + switch (event.getPlayer().getItemInHand().getData().getData()) { case 14: @@ -520,18 +546,18 @@ public class Build extends SoloGame break; } } - + @EventHandler public void playerQuit(PlayerQuitEvent event) { _data.remove(event.getPlayer()); - + for (BuildData data : _data.values()) data.removeScore(event.getPlayer()); } @EventHandler - public void clean(UpdateEvent event) + public void cleanTNT(UpdateEvent event) { if (!InProgress()) return; @@ -541,40 +567,38 @@ public class Build extends SoloGame for (Entity ent : this.WorldData.World.getEntities()) { - if (ent instanceof TNTPrimed || - ent instanceof ExplosiveMinecart || - ent instanceof Item) + if (ent instanceof TNTPrimed) { ent.remove(); } } } - + @EventHandler public void potionThrow(ProjectileLaunchEvent event) { if (event.getEntity() instanceof ThrownPotion) event.getEntity().remove(); } - + @EventHandler public void bowShoot(EntityShootBowEvent event) { event.getProjectile().remove(); } - + @EventHandler public void blockFromTo(BlockFromToEvent event) { for (BuildData data : _data.values()) if (data.inBuildArea(event.getToBlock())) return; - + event.setCancelled(true); } - + @EventHandler - public void blockFromTo(BlockPistonExtendEvent event) + public void pistonExtend(BlockPistonExtendEvent event) { for (BuildData data : _data.values()) for (Block block : event.getBlocks()) @@ -584,9 +608,9 @@ public class Build extends SoloGame return; } } - + @EventHandler - public void blockFromTo(BlockPistonRetractEvent event) + public void pistonRetract(BlockPistonRetractEvent event) { for (BuildData data : _data.values()) if (!data.inBuildArea(event.getBlock())) @@ -595,6 +619,255 @@ public class Build extends SoloGame return; } } + + @EventHandler + public void entityCombust(EntityCombustEvent event) + { + event.setCancelled(true); + } + + @EventHandler + public void itemClean(UpdateEvent event) + { + if (event.getType() != UpdateType.FAST) + return; + + for (BuildData data : _data.values()) + { + data.clean(); + } + + for (Entity ent : this.WorldData.World.getEntities()) + { + if (!(ent instanceof Item)) + continue; + + boolean isPlacedItem = false; + for (BuildData data : _data.values()) + { + if (data.Items.contains(ent)) + { + isPlacedItem = true; + break; + } + } + + if (!isPlacedItem) + ent.remove(); + } + } + + @EventHandler + public void itemDrop(PlayerDropItemEvent event) + { + BuildData data = _data.get(event.getPlayer()); + + if (data == null) + { + event.setCancelled(true); + return; + } + + data.addItem(event.getItemDrop()); + } + + @EventHandler + public void itemPickup(PlayerPickupItemEvent event) + { + event.setCancelled(true); + + BuildData data = _data.get(event.getPlayer()); + + if (data == null) + return; + + if (data.Player.equals(event.getPlayer())) + { + event.getItem().remove(); + UtilParticle.PlayParticle(ParticleType.LARGE_EXPLODE, event.getItem().getLocation().add(0, 0.5, 0), 0, 0, 0, 0, 1); + } + } + + @EventHandler + public void itemExpire(ItemDespawnEvent event) + { + for (BuildData data : _data.values()) + { + if (data.Items.contains(event.getEntity())) + { + event.setCancelled(true); + return; + } + } + } + + @EventHandler + public void dataClean(UpdateEvent event) + { + if (event.getType() != UpdateType.FAST) + return; + + for (BuildData data : _data.values()) + { + data.clean(); + } + } + + @EventHandler + public void entSpawn(CreatureSpawnEvent event) + { + if (event.getSpawnReason() != SpawnReason.SPAWNER_EGG) + { + event.setCancelled(true); + return; + } + + Player bestPlayer = null; + double bestDist = 0; + + for (Player player : GetPlayers(true)) + { + double dist = UtilMath.offset(event.getLocation(), player.getLocation()); + + if (bestPlayer == null || dist < bestDist) + { + bestPlayer = player; + bestDist = dist; + } + } + + if (bestPlayer == null) + { + event.setCancelled(true); + return; + } + + + BuildData data = _data.get(bestPlayer); + + if (data == null) + { + event.setCancelled(true); + return; + } + + //Not in area + if (!inBuildArea(data, event.getLocation().getBlock())) + { + event.setCancelled(true); + } + + //Maxed + else if (!data.addEntity(event.getEntity())) + { + event.setCancelled(true); + } + } + + @EventHandler + public void entKill(CustomDamageEvent event) + { + if (event.GetDamagerPlayer(false) == null) + return; + + BuildData data = _data.get(event.GetDamagerPlayer(false)); + + if (data == null) + return; + + data.removeEntity(event.GetDamageeEntity()); + } + + @EventHandler + public void entKill(PlayerInteractEntityEvent event) + { + BuildData data = _data.get(event.getPlayer()); + + if (data == null) + return; + + data.removeEntity(event.getRightClicked()); + } + + @EventHandler + public void vehicleSpawn(VehicleCreateEvent event) + { + if (event.getVehicle() instanceof Boat || + event.getVehicle() instanceof Minecart || + event.getVehicle() instanceof ExplosiveMinecart || + event.getVehicle() instanceof HopperMinecart || + event.getVehicle() instanceof CommandMinecart || + event.getVehicle() instanceof StorageMinecart || + event.getVehicle() instanceof SpawnerMinecart || + event.getVehicle() instanceof PoweredMinecart || + event.getVehicle() instanceof RideableMinecart || + event.getVehicle() instanceof Painting || + event.getVehicle() instanceof ItemFrame) + { + Player bestPlayer = null; + double bestDist = 0; + + for (Player player : GetPlayers(true)) + { + double dist = UtilMath.offset(event.getVehicle().getLocation(), player.getLocation()); + + if (bestPlayer == null || dist < bestDist) + { + bestPlayer = player; + bestDist = dist; + } + } + + if (bestPlayer == null) + { + event.getVehicle().remove(); + return; + } + + + BuildData data = _data.get(bestPlayer); + + if (data == null) + { + event.getVehicle().remove(); + return; + } + + //Not in area + if (!inBuildArea(data, event.getVehicle().getLocation().getBlock())) + { + event.getVehicle().remove(); + } + + //Maxed + else if (!data.addEntity(event.getVehicle())) + { + event.getVehicle().remove(); + } + } + } + + @EventHandler(priority = EventPriority.LOWEST) + public void vehicleDamage(VehicleDamageEvent event) + { + if (_buildGameState != 0 || event.getAttacker() == null || !(event.getAttacker() instanceof Player)) + { + event.setCancelled(true); + return; + } + + Player player = (Player)event.getAttacker(); + + BuildData data = _data.get(player); + + if (data == null) + { + event.setCancelled(true); + return; + } + + data.removeEntity(event.getVehicle()); + } @Override @EventHandler @@ -625,13 +898,23 @@ public class Build extends SoloGame { Scoreboard.Write(C.cYellow + C.Bold + "Vote Time"); Scoreboard.Write(UtilTime.MakeStr(Math.max(0, _voteTime - (System.currentTimeMillis() - _buildStateTime)), 1)); - + if (_viewData != null) { Scoreboard.WriteBlank(); - - Scoreboard.Write(C.cYellow + C.Bold + "Votes Cast"); + + Scoreboard.Write(C.cYellow + C.Bold + "Debug Voted"); Scoreboard.Write(_viewData.Score.size() + " / " + (GetPlayers(true).size()-1)); + + Scoreboard.WriteBlank(); + + Scoreboard.Write(C.cYellow + C.Bold + "Debug Avg"); + Scoreboard.Write(UtilMath.trim(2, _viewData.getScore()) + ""); + + Scoreboard.WriteBlank(); + + Scoreboard.Write(C.cYellow + C.Bold + "Debug Rating"); + Scoreboard.Write(BuildQuality.getQuality(_viewData.getScore()) + ""); } } @@ -639,6 +922,13 @@ public class Build extends SoloGame Scoreboard.Draw(); } + @EventHandler + public void disableInteraction(PlayerInteractEvent event) + { + if (_buildGameState != 0 && IsLive()) + event.setCancelled(true); + } + @EventHandler public void openShop(PlayerInteractEvent event) { @@ -659,7 +949,8 @@ public class Build extends SoloGame @EventHandler public void giveItem(UpdateEvent event) { - if (event.getType() != UpdateType.TWOSEC) return; + if (event.getType() != UpdateType.FAST) + return; if (IsLive() && _buildGameState == 0) for (Player player : GetPlayers(true)) @@ -683,18 +974,25 @@ public class Build extends SoloGame @EventHandler public void placeParticles(PlayerInteractEvent event) { - if (event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK) return; + if (event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK) + return; ItemStack itemInHand = event.getPlayer().getItemInHand(); - if (itemInHand != null && itemInHand.getItemMeta().getDisplayName().startsWith(ChatColor.GREEN + "Place ")) + + if (itemInHand != null && + itemInHand.getItemMeta() != null && + itemInHand.getItemMeta().getDisplayName() != null && + itemInHand.getItemMeta().getDisplayName().startsWith(ChatColor.GREEN + "Place ")) { ParticleType particleType = ParticleType.getFromFriendlyName(itemInHand.getItemMeta().getDisplayName().substring(8)); + if (particleType != null) { BuildData data = _data.get(event.getPlayer()); + if (data != null) { - data.Particles.put(event.getPlayer().getLocation(), particleType); + data.addParticles(particleType); } event.setCancelled(true); @@ -705,4 +1003,54 @@ public class Build extends SoloGame } } } + + @EventHandler + public void playParticles(UpdateEvent event) + { + if (event.getType() != UpdateType.FAST) + return; + + if (_viewData != null) + { + _viewData.playParticles(true); + } + else + { + for (BuildData data : _data.values()) + { + data.playParticles(false); + } + } + } + + @EventHandler + public void setWeather(UpdateEvent event) + { + if (event.getType() != UpdateType.FAST) + return; + + if (_viewData != null) + { + _viewData.playWeather(true); + } + else + { + for (BuildData data : _data.values()) + { + data.playWeather(false); + } + } + } + + @EventHandler(priority = EventPriority.LOWEST) + public void explode(ExplosionEvent event) + { + event.GetBlocks().clear(); + } + + @EventHandler(priority = EventPriority.LOWEST) + public void explode(EntityExplodeEvent event) + { + event.blockList().clear(); + } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/build/BuildData.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/build/BuildData.java index b169ef50d..981d35c08 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/build/BuildData.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/build/BuildData.java @@ -2,19 +2,25 @@ package nautilus.game.arcade.game.games.build; import java.util.ArrayList; import java.util.HashSet; +import java.util.Iterator; import mineplex.core.common.util.F; import mineplex.core.common.util.NautHashMap; import mineplex.core.common.util.UtilAlg; -import mineplex.core.common.util.UtilMath; +import mineplex.core.common.util.UtilEnt; +import mineplex.core.common.util.UtilParticle; import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilServer; import mineplex.core.common.util.UtilParticle.ParticleType; import org.bukkit.Location; +import org.bukkit.WeatherType; import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; import org.bukkit.entity.Entity; +import org.bukkit.entity.Ghast; +import org.bukkit.entity.Item; import org.bukkit.entity.Player; +import org.bukkit.inventory.meta.ItemMeta; public class BuildData { @@ -31,6 +37,8 @@ public class BuildData public HashSet Entities = new HashSet(); + public HashSet Items = new HashSet(); + public NautHashMap Particles = new NautHashMap(); public int Time = 6000; @@ -50,6 +58,79 @@ public class BuildData buildBorders.remove(CornerB); } + public boolean addItem(Item item) + { + if (Items.size() >= 16) + { + UtilPlayer.message(Player, F.main("Game", "You cannot drop more than 16 Items!")); + item.remove(); + return false; + } + + Items.add(item); + + ItemMeta meta = item.getItemStack().getItemMeta(); + meta.setDisplayName(item.getUniqueId() + " NoStack"); + item.getItemStack().setItemMeta(meta); + return true; + } + + public boolean addParticles(ParticleType particleType) + { + if (Particles.size() >= 24) + { + UtilPlayer.message(Player, F.main("Game", "You cannot spawn more than 24 Particles!")); + return false; + } + + Particles.put(Player.getEyeLocation().add(Player.getLocation().getDirection()), particleType); + + UtilPlayer.message(Player, F.main("Game", "You placed " + particleType.getFriendlyName() + "!")); + + return true; + } + + public void resetParticles() + { + Particles.clear(); + + UtilPlayer.message(Player, F.main("Game", "You cleared your Particles!")); + } + + public boolean addEntity(Entity entity) + { + if (entity instanceof Ghast) + { + UtilPlayer.message(Player, F.main("Game", "You cannot spawn Ghasts!")); + + entity.remove(); + return false; + } + + if (Entities.size() >= 16) + { + UtilPlayer.message(Player, F.main("Game", "You cannot spawn more than 16 Entities!")); + + entity.remove(); + return false; + } + + Entities.add(entity); + UtilEnt.Vegetate(entity, true); + UtilEnt.ghost(entity, true, false); + return true; + } + + public void removeEntity(Entity entity) + { + if (Entities.remove(entity)) + { + entity.remove(); + + UtilParticle.PlayParticle(ParticleType.LARGE_EXPLODE, entity.getLocation().add(0, 0.5, 0), 0, 0, 0, 0, 1); + } + } + public void addBlock(Block block) { Blocks.add(block); @@ -67,6 +148,9 @@ public class BuildData public double getScore() { + if (Score.isEmpty()) + return -1; + double score = 0; for (int i : Score.values()) @@ -102,4 +186,75 @@ public class BuildData { SUNNY, RAINING, STORMING; } + + public void clean() + { + //Clean Ents + Iterator entIter = Entities.iterator(); + + while (entIter.hasNext()) + { + Entity ent = entIter.next(); + if (!ent.isValid() || !inBuildArea(ent.getLocation().getBlock())) + { + entIter.remove(); + ent.remove(); + UtilParticle.PlayParticle(ParticleType.LARGE_EXPLODE, ent.getLocation().add(0, 0.5, 0), 0, 0, 0, 0, 1); + } + + } + + //Clean Items + Iterator itemIter = Items.iterator(); + + while (itemIter.hasNext()) + { + Entity ent = itemIter.next(); + if (!ent.isValid() || !inBuildArea(ent.getLocation().getBlock())) + { + itemIter.remove(); + ent.remove(); + UtilParticle.PlayParticle(ParticleType.LARGE_EXPLODE, ent.getLocation().add(0, 0.5, 0), 0, 0, 0, 0, 1); + } + } + } + + public void playParticles(boolean all) + { + for (Location loc : Particles.keySet()) + { + int amount = 8; + + ParticleType type = Particles.get(loc); + + if (type == ParticleType.HUGE_EXPLOSION || + type == ParticleType.LARGE_EXPLODE || + type == ParticleType.NOTE) + amount = 1; + + if (all) + UtilParticle.PlayParticle(type, loc, 0.4f, 0.4f, 0.4f, 0, amount); + else + UtilParticle.PlayParticle(Player, type, loc, 0.4f, 0.4f, 0.4f, 0, amount); + } + } + + public void playWeather(boolean b) + { + org.bukkit.WeatherType type = org.bukkit.WeatherType.CLEAR; + if (Weather == WeatherType.STORMING || Weather == WeatherType.RAINING) + type = org.bukkit.WeatherType.DOWNFALL; + + if (b) + { + for (Player player : UtilServer.getPlayers()) + player.setPlayerWeather(type); + + } + else + { + Player.setPlayerWeather(type); + } + } + } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/build/BuildQuality.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/build/BuildQuality.java index 7b5d2b218..3cb6e5715 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/build/BuildQuality.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/build/BuildQuality.java @@ -4,6 +4,8 @@ import mineplex.core.common.util.C; public enum BuildQuality { + NoVotes(C.cGray + "No Votes"), + Mindblowing(C.cAqua + "Mindblowing"), Amazing(C.cGreen + "Amazing"), Good(C.cYellow + "Good"), @@ -22,12 +24,13 @@ public enum BuildQuality return _text; } - public static BuildQuality getQuality(double score) + public static BuildQuality getQuality(double avgScore) { - if (score <= 0.25) return Failure; - if (score <= 0.50) return Satisfactory; - if (score <= 0.70) return Good; - if (score <= 0.95) return Amazing; + if (avgScore < 0) return NoVotes; + if (avgScore <= 1) return Failure; + if (avgScore <= 2) return Satisfactory; + if (avgScore <= 3) return Good; + if (avgScore <= 4) return Amazing; return Mindblowing; } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/build/gui/page/ParticlesPage.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/build/gui/page/ParticlesPage.java index 4afc50e15..ed4d99a2b 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/build/gui/page/ParticlesPage.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/build/gui/page/ParticlesPage.java @@ -48,7 +48,7 @@ public class ParticlesPage extends ShopPageBase { if (particleType.hasFriendlyData()) { - ShopItem shopItem = new ShopItem(particleType.getMaterial(), particleType.getFriendlyName(), null, 0, false); + ShopItem shopItem = new ShopItem(particleType.getMaterial(), particleType.getData(), particleType.getFriendlyName(), null, 0, false, false); addButton(index, shopItem, new IButton() { @Override @@ -70,7 +70,7 @@ public class ParticlesPage extends ShopPageBase @Override public void onClick(Player player, ClickType clickType) { - buildData.Particles.clear(); + buildData.resetParticles(); } });