lots of changes to monster maze, check trello for list

This commit is contained in:
fooify 2015-09-07 07:08:00 -07:00
parent c648d7c186
commit 5824ec6df0
4 changed files with 168 additions and 122 deletions

View File

@ -47,6 +47,7 @@ public class Maze implements Listener
private ArrayList<Location> _goals; private ArrayList<Location> _goals;
private HashSet<Block> _waypoints; private HashSet<Block> _waypoints;
private HashSet<Block> _disabledWaypoints; private HashSet<Block> _disabledWaypoints;
private HashSet<Block> _oldDisabledWaypoints;
private ArrayList<Location> _borders; private ArrayList<Location> _borders;
private Location _center; private Location _center;
@ -60,8 +61,6 @@ public class Maze implements Listener
private int _phaseTimer = -1; private int _phaseTimer = -1;
private int _padDecayTimer = -1; private int _padDecayTimer = -1;
private ArrayList<ClientsideBlock> _clientsideBlocks = new ArrayList<>();
private HashMap<Entity, MazeMobWaypoint> _ents = new HashMap<Entity, MazeMobWaypoint>(); private HashMap<Entity, MazeMobWaypoint> _ents = new HashMap<Entity, MazeMobWaypoint>();
@ -75,6 +74,7 @@ public class Maze implements Listener
_waypoints = new HashSet<Block>(); _waypoints = new HashSet<Block>();
_disabledWaypoints = new HashSet<Block>(); _disabledWaypoints = new HashSet<Block>();
_oldDisabledWaypoints = new HashSet<Block>();
for (Location loc : _map) for (Location loc : _map)
{ {
@ -91,6 +91,7 @@ public class Maze implements Listener
for (Location loc : _spawns) for (Location loc : _spawns)
{ {
_waypoints.add(loc.getBlock());
loc.getBlock().getRelative(BlockFace.DOWN).setType(Material.GOLD_BLOCK); loc.getBlock().getRelative(BlockFace.DOWN).setType(Material.GOLD_BLOCK);
} }
@ -110,12 +111,18 @@ public class Maze implements Listener
public void update() public void update()
{ {
if(_safePad != null)
{
for(Player p : Host.GetPlayers(true))
p.setCompassTarget(_safePad.getLocation());
}
if (Host.IsLive()) if (Host.IsLive())
{ {
//checkGoal(); //checkGoal();
checkPlayersOnSafePad(); checkPlayersOnSafePad();
move(); move();
bump(); bump();
removeMobsOnSafePad();
if(_phaseTimer <= -1) if(_phaseTimer <= -1)
{ {
for(Player p : Host.GetPlayers(true)) for(Player p : Host.GetPlayers(true))
@ -141,6 +148,34 @@ public class Maze implements Listener
} }
} }
} }
private void removeMobsOnSafePad()
{
Iterator<Entity> 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() private void bump()
{ {
@ -150,13 +185,15 @@ public class Maze implements Listener
if (!Recharge.Instance.usable(player, "Monster Hit")) if (!Recharge.Instance.usable(player, "Monster Hit"))
continue; continue;
if(_playersOnPad.contains(player)) if(_safePad != null)
continue; {
if(_safePad.isOn(player)) continue;
}
//Hit Snowman //Hit Snowman
for (Entity ent : _ents.keySet()) for (Entity ent : _ents.keySet())
{ {
if (UtilMath.offset2d(player, ent) < 1) if (UtilMath.offset(player, ent) < 1)
{ {
Recharge.Instance.useForce(player, "Monster Hit", 1000); Recharge.Instance.useForce(player, "Monster Hit", 1000);
@ -382,10 +419,13 @@ public class Maze implements Listener
{ {
_oldSafePad = _safePad; _oldSafePad = _safePad;
_oldSafePad.turnOffBeacon(); _oldSafePad.turnOffBeacon();
_padDecayTimer = 5; _padDecayTimer = 11;
_oldDisabledWaypoints = new HashSet<>(_disabledWaypoints);
} }
_disabledWaypoints.clear();
ArrayList<Location> goals = new ArrayList<Location>(_goals); ArrayList<Location> goals = new ArrayList<Location>(_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 = new SafePad(Host, this, UtilAlg.Random(goals).clone().subtract(0,1,0)); // maybe don't need to clone()
_safePad.build(); _safePad.build();
@ -419,34 +459,63 @@ public class Maze implements Listener
if(_padDecayTimer == -1) return; if(_padDecayTimer == -1) return;
_padDecayTimer--; _padDecayTimer--;
// 5
if(_oldSafePad != null) if(_oldSafePad != null)
{ {
if(_padDecayTimer == 4) if(_padDecayTimer == 10)
{ {
_oldSafePad.setGlassData((byte)4); _oldSafePad.setGlassData((byte)5); // green
_oldSafePad.turnOffBeacon(); _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) else if(_padDecayTimer == 3)
{ {
_oldSafePad.setGlassData((byte)1); _oldSafePad.setCrackedProgress(8);
} }
else if(_padDecayTimer == 2) else if(_padDecayTimer == 2)
{ {
_oldSafePad.setGlassData((byte)14); _oldSafePad.setCrackedProgress(9);
} }
else if(_padDecayTimer == 1) else if(_padDecayTimer == 1)
{ {
_oldSafePad.setCrackedProgress(-1);
_oldSafePad.destroy(); _oldSafePad.destroy();
_oldSafePad = null; _oldSafePad = null;
if(_disabledWaypoints.size() > 0) if(_oldDisabledWaypoints.size() > 0)
{ {
for(Block b : _disabledWaypoints) for(Block b : _oldDisabledWaypoints)
{ {
_waypoints.add(b); _waypoints.add(b);
} }
_disabledWaypoints.clear(); _oldDisabledWaypoints.clear();
} }
} }
} }
@ -464,7 +533,7 @@ public class Maze implements Listener
if(_phaseTimer == 15 || _phaseTimer == 10) 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) if(_phaseTimer == 5 || _phaseTimer == 4)
@ -519,111 +588,33 @@ public class Maze implements Listener
{ {
if(_safePad.isOn(p) && !_playersOnPad.contains(p)) 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); _playersOnPad.add(p);
if(_playersOnPad.size() == 1) // first player 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); 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); 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<Player> pElse = Host.GetPlayers(false); ArrayList<Player> pElse = Host.GetPlayers(false);
pElse.remove(p); pElse.remove(p);
for(Player i : pElse) 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 + 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 } else // not the first
{ {
p.playSound(p.getLocation(), Sound.SUCCESSFUL_HIT, 1.0f, 1.0f); 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); UtilTextMiddle.display(C.cGreen + C.Bold + "Great!", C.cGreen + "Stay on the Safe Pad!", 5, 40, 5, p);
} }
buildSafePadBarrier(p);
} }
} 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);
private void buildSafePadBarrier(Player p) //UtilTextBottom.display(C.cRed + "Get back to the Safe Pad!", p);
{ }
ArrayList<Block> _cube = UtilBlock.getInBoundingBox(_safePad.getLocation().clone().add(3, 2, 3), _safePad.getLocation().clone().add(-3, 1, -3), false);
ArrayList<Block> _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;
} }
} }

View File

@ -40,8 +40,7 @@ public class MonsterMaze extends SoloGame
new String[] new String[]
{ {
"Get to the safe pad, but avoid the monsters!", "Be the first to make it to the Safe Pad, but avoid the monsters!"
"You can't jump.",
}); });
this.DamagePvP = false; this.DamagePvP = false;
@ -69,10 +68,7 @@ public class MonsterMaze extends SoloGame
_maze.spawnSafePad(); _maze.spawnSafePad();
} }
else if(event.GetState() == GameState.Live) else if(event.GetState() == GameState.Live)
{ {
for(Player player : GetPlayers(true))
player.setGameMode(GameMode.ADVENTURE);
_maze.removePlayerContainmentUnit(); _maze.removePlayerContainmentUnit();
UtilTextMiddle.display(C.cAqua + C.Bold + "Push F5", C.cWhite + "Monster Maze is best played in 3rd Person", 10, 70, 10); 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 @EventHandler
public void Antijump(UpdateEvent event) public void PotionEffects(UpdateEvent event)
{ {
if(event.getType() != UpdateType.SEC) return; // because why not if(event.getType() != UpdateType.SEC) return; // because why not
if(!InProgress()) return; if(!InProgress()) return;
for(Player pl : GetPlayers(true)) for(Player pl : GetPlayers(true))
{ {
pl.addPotionEffect(new PotionEffect(PotionEffectType.JUMP, 1000000000, 250)); 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);
}
} }
} }

View File

@ -1,18 +1,21 @@
package nautilus.game.arcade.game.games.monstermaze; package nautilus.game.arcade.game.games.monstermaze;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.entity.Entity; 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.MapUtil;
import mineplex.core.common.util.UtilAlg; 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 mineplex.core.common.util.UtilPlayer;
import net.minecraft.server.v1_7_R4.Packet;
import net.minecraft.server.v1_7_R4.PacketPlayOutBlockBreakAnimation;
public class SafePad public class SafePad
{ {
@ -80,11 +83,11 @@ public class SafePad
public class SafePadBlock public class SafePadBlock
{ {
Material _origM; private Material _origM;
byte _origD; private byte _origD;
Material _tempMat; private Material _tempMat;
byte _tempData; private byte _tempData;
Location _loc; Location _loc;
@ -111,6 +114,16 @@ public class SafePad
MapUtil.QuickChangeBlockAt(_loc, _tempMat.getId(), _tempData); MapUtil.QuickChangeBlockAt(_loc, _tempMat.getId(), _tempData);
} }
public Material getBlockMaterial()
{
return _loc.getBlock().getType();
}
public byte getBlockData()
{
return _loc.getBlock().getData();
}
public Location getLocation() public Location getLocation()
{ {
return _loc; return _loc;
@ -139,7 +152,7 @@ public class SafePad
{ {
for(SafePadBlock spb : _blocks) 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); spb.setData(newData);
} }
} }
@ -148,8 +161,8 @@ public class SafePad
{ {
for(SafePadBlock bl : _blocks) for(SafePadBlock bl : _blocks)
{ {
if(bl.getLocation().getBlock().getType().equals(Material.GOLD_BLOCK)) bl.restore(); if(bl.getBlockMaterial().equals(Material.GOLD_BLOCK)) bl.restore();
if(bl.getLocation().getBlock().getType().equals(Material.BEACON)) if(bl.getBlockMaterial().equals(Material.BEACON))
{ {
bl.setMaterial(Material.STAINED_GLASS); bl.setMaterial(Material.STAINED_GLASS);
bl.setData((byte)5); bl.setData((byte)5);
@ -157,6 +170,42 @@ public class SafePad
} }
} }
public void setCrackedProgress(int progress)
{
int i = 0;
Iterator<SafePadBlock> iter = _blocks.iterator();
ArrayList<Packet> packets = new ArrayList<Packet>();
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() public void destroy()
{ {
for(SafePadBlock bl : _blocks) for(SafePadBlock bl : _blocks)

View File

@ -36,6 +36,9 @@ public class KitHyper extends Kit
@Override @Override
public void GiveItems(Player player) 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, 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")); C.cYellow + C.Bold + "Right-click" + C.cWhite + C.Bold + " - " + C.cGreen + C.Bold + "Speed Boost"));
} }