diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monstermaze/Maze.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monstermaze/Maze.java index 176b2c8eb..80d4db89d 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monstermaze/Maze.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monstermaze/Maze.java @@ -47,6 +47,7 @@ public class Maze implements Listener private ArrayList _goals; private HashSet _waypoints; private HashSet _disabledWaypoints; + private HashSet _oldDisabledWaypoints; private ArrayList _borders; private Location _center; @@ -60,8 +61,6 @@ public class Maze implements Listener private int _phaseTimer = -1; private int _padDecayTimer = -1; - - private ArrayList _clientsideBlocks = new ArrayList<>(); private HashMap _ents = new HashMap(); @@ -75,6 +74,7 @@ public class Maze implements Listener _waypoints = new HashSet(); _disabledWaypoints = new HashSet(); + _oldDisabledWaypoints = new HashSet(); for (Location loc : _map) { @@ -91,6 +91,7 @@ public class Maze implements Listener for (Location loc : _spawns) { + _waypoints.add(loc.getBlock()); loc.getBlock().getRelative(BlockFace.DOWN).setType(Material.GOLD_BLOCK); } @@ -110,12 +111,18 @@ public class Maze implements Listener public void update() { + if(_safePad != null) + { + for(Player p : Host.GetPlayers(true)) + p.setCompassTarget(_safePad.getLocation()); + } if (Host.IsLive()) { //checkGoal(); checkPlayersOnSafePad(); move(); bump(); + removeMobsOnSafePad(); if(_phaseTimer <= -1) { for(Player p : Host.GetPlayers(true)) @@ -141,6 +148,34 @@ public class Maze implements Listener } } } + + private void removeMobsOnSafePad() + { + Iterator it = _ents.keySet().iterator(); + while (it.hasNext()) { + Entity e = it.next(); + if(_safePad != null) + { + if(_safePad.isOn(e)) + { + System.out.println("entity on safepad removed"); + it.remove(); + e.remove(); + continue; + } + } + + if(_oldSafePad != null) + { + if(_oldSafePad.isOn(e)) + { + System.out.println("entity on old safepad removed"); + it.remove(); + e.remove(); + } + } + } + } private void bump() { @@ -150,13 +185,15 @@ public class Maze implements Listener if (!Recharge.Instance.usable(player, "Monster Hit")) continue; - if(_playersOnPad.contains(player)) - continue; + if(_safePad != null) + { + if(_safePad.isOn(player)) continue; + } //Hit Snowman for (Entity ent : _ents.keySet()) { - if (UtilMath.offset2d(player, ent) < 1) + if (UtilMath.offset(player, ent) < 1) { Recharge.Instance.useForce(player, "Monster Hit", 1000); @@ -382,10 +419,13 @@ public class Maze implements Listener { _oldSafePad = _safePad; _oldSafePad.turnOffBeacon(); - _padDecayTimer = 5; + _padDecayTimer = 11; + + _oldDisabledWaypoints = new HashSet<>(_disabledWaypoints); } + _disabledWaypoints.clear(); ArrayList goals = new ArrayList(_goals); - if(_oldSafePad != null) goals.remove(_oldSafePad.getLocation()); + if(_oldSafePad != null) goals.remove(_oldSafePad.getLocation().clone().add(0, 1, 0)); _safePad = new SafePad(Host, this, UtilAlg.Random(goals).clone().subtract(0,1,0)); // maybe don't need to clone() _safePad.build(); @@ -419,34 +459,63 @@ public class Maze implements Listener if(_padDecayTimer == -1) return; _padDecayTimer--; - // 5 + if(_oldSafePad != null) { - if(_padDecayTimer == 4) + if(_padDecayTimer == 10) { - _oldSafePad.setGlassData((byte)4); - _oldSafePad.turnOffBeacon(); + _oldSafePad.setGlassData((byte)5); // green + _oldSafePad.turnOffBeacon(); + _oldSafePad.setCrackedProgress(1); + } + else if(_padDecayTimer == 9) + { + _oldSafePad.setCrackedProgress(2); + } + else if(_padDecayTimer == 8) + { + _oldSafePad.setGlassData((byte)4); // yellow + _oldSafePad.setCrackedProgress(3); + } + else if(_padDecayTimer == 7) + { + _oldSafePad.setCrackedProgress(4); + } + else if(_padDecayTimer == 6) + { + _oldSafePad.setGlassData((byte)1); // orange + _oldSafePad.setCrackedProgress(5); + } + else if(_padDecayTimer == 5) + { + _oldSafePad.setCrackedProgress(6); + } + else if(_padDecayTimer == 4) + { + _oldSafePad.setGlassData((byte)14); // red + _oldSafePad.setCrackedProgress(7); } else if(_padDecayTimer == 3) { - _oldSafePad.setGlassData((byte)1); + _oldSafePad.setCrackedProgress(8); } else if(_padDecayTimer == 2) { - _oldSafePad.setGlassData((byte)14); + _oldSafePad.setCrackedProgress(9); } else if(_padDecayTimer == 1) { + _oldSafePad.setCrackedProgress(-1); _oldSafePad.destroy(); _oldSafePad = null; - if(_disabledWaypoints.size() > 0) + if(_oldDisabledWaypoints.size() > 0) { - for(Block b : _disabledWaypoints) + for(Block b : _oldDisabledWaypoints) { _waypoints.add(b); } - _disabledWaypoints.clear(); + _oldDisabledWaypoints.clear(); } } } @@ -464,7 +533,7 @@ public class Maze implements Listener if(_phaseTimer == 15 || _phaseTimer == 10) { - UtilTextMiddle.display("", C.cGray + C.Bold + _phaseTimer + " seconds to get to the Safe Zone!", 0, 40, 5, Host.GetPlayers(true).toArray(new Player[Host.GetPlayers(true).size()])); + UtilTextMiddle.display("", C.cAqua + C.Bold + _phaseTimer + " seconds to get to the Safe Pad!", 5, 40, 5, Host.GetPlayers(true).toArray(new Player[Host.GetPlayers(true).size()])); } if(_phaseTimer == 5 || _phaseTimer == 4) @@ -519,111 +588,33 @@ public class Maze implements Listener { if(_safePad.isOn(p) && !_playersOnPad.contains(p)) { + UtilPlayer.message(p, F.main("Game", C.cGreen + "Great, you made it. Stay on the Safe Pad!")); _playersOnPad.add(p); if(_playersOnPad.size() == 1) // first player { - _phaseTimer = 21; // start the countdown + _phaseTimer = 20; // start the countdown UtilTextMiddle.display(C.cGold + C.Bold + "AWESOME!", C.cGold + "You were the first to make it to the Safe Pad!", 5, 40, 5, p); p.playSound(p.getLocation(), Sound.SUCCESSFUL_HIT, 1.0f, 1.0f); - UtilPlayer.message(p, F.main("Game", C.cGreen + "Great, you made it. Stay on the Safe Pad!")); ArrayList pElse = Host.GetPlayers(false); pElse.remove(p); for(Player i : pElse) { UtilPlayer.message(i, C.cRed + C.Bold + p.getName() + " was the first to make it to the Safe Pad!"); - UtilPlayer.message(i, C.cRed + "Everyone not on the Safe Pad in 20 seconds will die!"); // I don't like this message + UtilPlayer.message(i, C.cGray + "Everyone not on the Safe Pad in 20 seconds will die!"); // I don't like this message } } else // not the first { p.playSound(p.getLocation(), Sound.SUCCESSFUL_HIT, 1.0f, 1.0f); UtilTextMiddle.display(C.cGreen + C.Bold + "Great!", C.cGreen + "Stay on the Safe Pad!", 5, 40, 5, p); } - - buildSafePadBarrier(p); } - } - } - - private void buildSafePadBarrier(Player p) - { - ArrayList _cube = UtilBlock.getInBoundingBox(_safePad.getLocation().clone().add(3, 2, 3), _safePad.getLocation().clone().add(-3, 1, -3), false); - ArrayList _hollowedCube = UtilBlock.getInBoundingBox(_safePad.getLocation().clone().add(2, 2, 2), _safePad.getLocation().clone().add(-2, 1, -2), false); - _cube.removeAll(_hollowedCube); - - for(Block b : _cube) - { - _clientsideBlocks.add(new ClientsideBlock(p, b.getLocation(), Material.STAINED_GLASS, (byte)3)); - } - } - - private void removeSafePadBarrier() // for all players ;) - { - for(ClientsideBlock csb : _clientsideBlocks) - { - csb.disable(); - } - _clientsideBlocks.clear(); - } - - private class ClientsideBlock - { - private Player _player; - - private Location _loc; - private Material _mat; - private byte _data; - - private Material _origMat; - private byte _origData; - - private boolean _shown = false; - - public ClientsideBlock(Player p, Location loc, Material mat, byte data) - { - _player = p; - - _loc = loc; - _mat = mat; - _data = data; - - _origMat = _loc.getBlock().getType(); - _origData = _loc.getBlock().getData(); - - enable(); - } - - public void enable() - { - if(isShown()) return; - - _player.sendBlockChange(_loc, _mat, _data); - _shown = true; - } - - public void disable() - { - if(!isShown()) return; - - _player.sendBlockChange(_loc, _origMat, _origData); - - _shown = false; - } - - public boolean isShown() // this can break if the block changes and overrides the client-side blocks, but this won't happen if it's being used properly (maybe should add a check?...) - { - return _shown; - } - - public Player getPlayer() - { - return _player; - } - - public Location getLocation() - { - return _loc; + if(!_safePad.isOn(p) && _playersOnPad.contains(p)) + { + UtilTextMiddle.display(C.cDRed + C.Bold + "Danger!", C.cRed + "Get back to the Safe Pad!", 0, 10, 0, p); + //UtilTextBottom.display(C.cRed + "Get back to the Safe Pad!", p); + } } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monstermaze/MonsterMaze.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monstermaze/MonsterMaze.java index 2434af05e..ef3d0b73a 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monstermaze/MonsterMaze.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monstermaze/MonsterMaze.java @@ -40,8 +40,7 @@ public class MonsterMaze extends SoloGame new String[] { - "Get to the safe pad, but avoid the monsters!", - "You can't jump.", + "Be the first to make it to the Safe Pad, but avoid the monsters!" }); this.DamagePvP = false; @@ -69,10 +68,7 @@ public class MonsterMaze extends SoloGame _maze.spawnSafePad(); } else if(event.GetState() == GameState.Live) - { - for(Player player : GetPlayers(true)) - player.setGameMode(GameMode.ADVENTURE); - + { _maze.removePlayerContainmentUnit(); UtilTextMiddle.display(C.cAqua + C.Bold + "Push F5", C.cWhite + "Monster Maze is best played in 3rd Person", 10, 70, 10); @@ -91,14 +87,21 @@ public class MonsterMaze extends SoloGame } @EventHandler - public void Antijump(UpdateEvent event) + public void PotionEffects(UpdateEvent event) { if(event.getType() != UpdateType.SEC) return; // because why not if(!InProgress()) return; for(Player pl : GetPlayers(true)) { pl.addPotionEffect(new PotionEffect(PotionEffectType.JUMP, 1000000000, 250)); - pl.addPotionEffect(new PotionEffect(PotionEffectType.INVISIBILITY, 80, 250)); + if(GetPlayers(true).size() > 4) + { + pl.addPotionEffect(new PotionEffect(PotionEffectType.INVISIBILITY, 1000000000, 250)); + } + else + { + pl.removePotionEffect(PotionEffectType.INVISIBILITY); + } } } diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monstermaze/SafePad.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monstermaze/SafePad.java index 76d3753f6..e2d9e5a73 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monstermaze/SafePad.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monstermaze/SafePad.java @@ -1,18 +1,21 @@ package nautilus.game.arcade.game.games.monstermaze; import java.util.ArrayList; +import java.util.Iterator; import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; import org.bukkit.entity.Entity; -import org.bukkit.event.Listener; +import org.bukkit.entity.Player; import mineplex.core.common.util.MapUtil; import mineplex.core.common.util.UtilAlg; -import mineplex.core.common.util.UtilBlock; +import mineplex.core.common.util.UtilParticle; +import mineplex.core.common.util.UtilParticle.ParticleType; +import mineplex.core.common.util.UtilParticle.ViewDist; import mineplex.core.common.util.UtilPlayer; +import net.minecraft.server.v1_7_R4.Packet; +import net.minecraft.server.v1_7_R4.PacketPlayOutBlockBreakAnimation; public class SafePad { @@ -80,11 +83,11 @@ public class SafePad public class SafePadBlock { - Material _origM; - byte _origD; + private Material _origM; + private byte _origD; - Material _tempMat; - byte _tempData; + private Material _tempMat; + private byte _tempData; Location _loc; @@ -111,6 +114,16 @@ public class SafePad MapUtil.QuickChangeBlockAt(_loc, _tempMat.getId(), _tempData); } + public Material getBlockMaterial() + { + return _loc.getBlock().getType(); + } + + public byte getBlockData() + { + return _loc.getBlock().getData(); + } + public Location getLocation() { return _loc; @@ -139,7 +152,7 @@ public class SafePad { for(SafePadBlock spb : _blocks) { - if(!spb.getLocation().getBlock().getType().equals(Material.STAINED_GLASS)) continue; + if(!spb.getBlockMaterial().equals(Material.STAINED_GLASS)) continue; spb.setData(newData); } } @@ -148,8 +161,8 @@ public class SafePad { for(SafePadBlock bl : _blocks) { - if(bl.getLocation().getBlock().getType().equals(Material.GOLD_BLOCK)) bl.restore(); - if(bl.getLocation().getBlock().getType().equals(Material.BEACON)) + if(bl.getBlockMaterial().equals(Material.GOLD_BLOCK)) bl.restore(); + if(bl.getBlockMaterial().equals(Material.BEACON)) { bl.setMaterial(Material.STAINED_GLASS); bl.setData((byte)5); @@ -157,6 +170,42 @@ public class SafePad } } + public void setCrackedProgress(int progress) + { + int i = 0; + Iterator iter = _blocks.iterator(); + ArrayList packets = new ArrayList(); + while(iter.hasNext()) + { + SafePadBlock spb = iter.next(); + if(!spb.getLocation().getBlock().getType().equals(Material.STAINED_GLASS)) continue; + + UtilParticle.PlayParticle(ParticleType.BLOCK_DUST.getParticle(Material.STAINED_GLASS, spb.getBlockData()), spb.getLocation(), 0.5f, 0.5f, 0.5f, 0.05f, 8, ViewDist.NORMAL, Host.GetPlayers(false).toArray(new Player[Host.GetPlayers(false).size()])); + + i++; + + Packet packet = new PacketPlayOutBlockBreakAnimation(i, spb.getLocation().getBlockX(), spb.getLocation().getBlockY(), spb.getLocation().getBlockZ(), progress); + packets.add(packet); + } + for(Player p : Host.GetPlayers(false)) + { + Packet[] pcks = new Packet[packets.size()]; + packets.toArray(pcks); + UtilPlayer.sendPacket(p, pcks); + } + /*for(SafePadBlock spb : _blocks) + { + if(!spb.getLocation().getBlock().getType().equals(Material.STAINED_GLASS)) continue; + + UtilParticle.PlayParticle(ParticleType.BLOCK_DUST.getParticle(Material.STAINED_GLASS, spb.getBlockData()), spb.getLocation(), 0.5f, 0.5f, 0.5f, 0.05f, 8, ViewDist.NORMAL, Host.GetPlayers(false).toArray(new Player[Host.GetPlayers(false).size()])); + Packet packet = new PacketPlayOutBlockBreakAnimation(1, spb.getLocation().getBlockX(), spb.getLocation().getBlockY(), spb.getLocation().getBlockZ(), progress); + for(Player p : Host.GetPlayers(false)) + { + UtilPlayer.sendPacket(p, packet); + } + }*/ + } + public void destroy() { for(SafePadBlock bl : _blocks) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monstermaze/kits/KitHyper.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monstermaze/kits/KitHyper.java index 5e08deb76..0408a5381 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monstermaze/kits/KitHyper.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/monstermaze/kits/KitHyper.java @@ -36,6 +36,9 @@ public class KitHyper extends Kit @Override public void GiveItems(Player player) { + player.getInventory().addItem(ItemStackFactory.Instance.CreateStack(Material.COMPASS, (byte)0, 1, + C.cYellow + "Safe Pad Tracking Deviceā„¢")); + player.getInventory().addItem(ItemStackFactory.Instance.CreateStack(Material.SUGAR, (byte)0, 3, C.cYellow + C.Bold + "Right-click" + C.cWhite + C.Bold + " - " + C.cGreen + C.Bold + "Speed Boost")); }