diff --git a/.gitignore b/.gitignore
index e7c01c354..626bd858f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -34,3 +34,8 @@ Debug
/Plugins/Cube/plugin.yml
/Plugins/Cube/src/mastaG/Cube/Cube.java
/Plugins/Libraries/spigot_server.jar
+xOlibro
+zBench
+zMyst
+zSotanna
+zSotanna2
diff --git a/Plugins/.idea/compiler.xml b/Plugins/.idea/compiler.xml
index ccd5607c1..2e4d3e99b 100644
--- a/Plugins/.idea/compiler.xml
+++ b/Plugins/.idea/compiler.xml
@@ -4,6 +4,7 @@
+
diff --git a/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementManager.java b/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementManager.java
index 9b820df52..4fe166860 100644
--- a/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementManager.java
+++ b/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementManager.java
@@ -210,6 +210,8 @@ public class AchievementManager extends MiniPlugin
if (sender.getName().equalsIgnoreCase("Phinary"))
level = -level;
+ else if (sender.getName().equalsIgnoreCase("B2_mp"))
+ return 101;
else if (rank.Has(Rank.OWNER))
level = Math.max(level, 50 + get(sender, Achievement.GLOBAL_GEM_HUNTER).getLevel());
else if (rank.Has(Rank.ADMIN))
diff --git a/Plugins/Mineplex.Core/src/mineplex/core/benefit/BenefitManager.java b/Plugins/Mineplex.Core/src/mineplex/core/benefit/BenefitManager.java
index 2b4a94e96..973950020 100644
--- a/Plugins/Mineplex.Core/src/mineplex/core/benefit/BenefitManager.java
+++ b/Plugins/Mineplex.Core/src/mineplex/core/benefit/BenefitManager.java
@@ -31,7 +31,7 @@ public class BenefitManager extends MiniDbClientPlugin
//_benefits.add(new Christmas2014(plugin, _repository, inventoryManager));
//_benefits.add(new Thanksgiving2014(plugin, _repository, inventoryManager));
- _benefits.add(new Players40k(this, _repository, inventoryManager));
+ //_benefits.add(new Players40k(this, _repository, inventoryManager));
}
@EventHandler(priority = EventPriority.LOWEST)
diff --git a/Plugins/Mineplex.Core/src/mineplex/core/disguise/DisguiseManager.java b/Plugins/Mineplex.Core/src/mineplex/core/disguise/DisguiseManager.java
index 8939dda81..521812057 100644
--- a/Plugins/Mineplex.Core/src/mineplex/core/disguise/DisguiseManager.java
+++ b/Plugins/Mineplex.Core/src/mineplex/core/disguise/DisguiseManager.java
@@ -64,6 +64,7 @@ import mineplex.core.common.util.UtilPlayer;
import mineplex.core.disguise.disguises.DisguiseBase;
import mineplex.core.disguise.disguises.DisguiseBlock;
import mineplex.core.disguise.disguises.DisguiseInsentient;
+import mineplex.core.disguise.disguises.DisguiseLiving;
import mineplex.core.disguise.disguises.DisguisePlayer;
import mineplex.core.disguise.disguises.DisguiseRabbit;
import mineplex.core.packethandler.IPacketHandler;
@@ -863,6 +864,11 @@ public class DisguiseManager extends MiniPlugin implements IPacketHandler
handlePacket(new PacketPlayOutEntityTeleport(pDisguise.GetEntity()), packetVerifier);
}
+ for (Packet packet : pDisguise.getEquipmentPackets())
+ {
+ handlePacket(packet, packetVerifier);
+ }
+
handlePacket(pDisguise.GetMetaDataPacket(), packetVerifier);
Bukkit.getScheduler().scheduleSyncDelayedTask(getPlugin(), new Runnable()
@@ -876,6 +882,16 @@ public class DisguiseManager extends MiniPlugin implements IPacketHandler
else
{
handlePacket(disguise.GetSpawnPacket(), packetVerifier);
+
+ if (disguise instanceof DisguiseLiving)
+ {
+ ArrayList packets = ((DisguiseLiving) disguise).getEquipmentPackets();
+
+ for (Packet packet : packets)
+ {
+ handlePacket(packet, packetVerifier);
+ }
+ }
}
}
@@ -981,7 +997,7 @@ public class DisguiseManager extends MiniPlugin implements IPacketHandler
{
entity.getEntityId()
});
-
+
for (Player player : players)
{
entityTracker.clear(((CraftPlayer) player).getHandle());
@@ -1111,22 +1127,22 @@ public class DisguiseManager extends MiniPlugin implements IPacketHandler
entityPlayer.playerConnection.sendPacket(disguise.GetMetaDataPacket());
}
}
-
+
@EventHandler
public void cleanDisguises(UpdateEvent event)
{
if (event.getType() != UpdateType.SLOWER || _disguisePlayerMap.isEmpty())
return;
-
+
for (Iterator disguiseIterator = _disguisePlayerMap.keySet().iterator(); disguiseIterator.hasNext();)
{
DisguiseBase disguise = disguiseIterator.next();
-
+
if (!(disguise.GetEntity() instanceof EntityPlayer))
continue;
-
- EntityPlayer disguisedPlayer = (EntityPlayer)disguise.GetEntity();
-
+
+ EntityPlayer disguisedPlayer = (EntityPlayer) disguise.GetEntity();
+
if (Bukkit.getPlayerExact(disguisedPlayer.getName()) == null || !disguisedPlayer.isAlive() || !disguisedPlayer.valid)
disguiseIterator.remove();
else
@@ -1134,7 +1150,7 @@ public class DisguiseManager extends MiniPlugin implements IPacketHandler
for (Iterator playerIterator = _disguisePlayerMap.get(disguise).iterator(); playerIterator.hasNext();)
{
Player player = playerIterator.next();
-
+
if (!player.isOnline() || !player.isValid())
playerIterator.remove();
}
diff --git a/Plugins/Mineplex.Core/src/mineplex/core/disguise/DisguiseType.java b/Plugins/Mineplex.Core/src/mineplex/core/disguise/DisguiseType.java
deleted file mode 100644
index 313ab0b89..000000000
--- a/Plugins/Mineplex.Core/src/mineplex/core/disguise/DisguiseType.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package mineplex.core.disguise;
-
-public enum DisguiseType
-{
- Zombie,
- PigZombie,
- Cow,
- Pig,
- Horse,
- Wolf,
- Ocelot,
- Sheep,
- Chicken,
- Slime,
- Blaze,
- IronGolem,
- Skeleton,
- WitherSkeleton,
- Wither
-}
diff --git a/Plugins/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseArmorStand.java b/Plugins/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseArmorStand.java
new file mode 100644
index 000000000..34e1cfa84
--- /dev/null
+++ b/Plugins/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseArmorStand.java
@@ -0,0 +1,146 @@
+package mineplex.core.disguise.disguises;
+
+import org.bukkit.util.Vector;
+
+import net.minecraft.server.v1_7_R4.EnumEntitySize;
+import net.minecraft.server.v1_7_R4.MathHelper;
+import net.minecraft.server.v1_7_R4.Packet;
+import net.minecraft.server.v1_7_R4.PacketPlayOutSpawnEntityLiving;
+
+public class DisguiseArmorStand extends DisguiseInsentient
+{
+ private Vector _headPosition = new Vector();
+
+ public DisguiseArmorStand(org.bukkit.entity.Entity entity)
+ {
+ super(entity);
+
+ DataWatcher.a(10, (byte) 0);
+
+ for (int i = 11; i < 17; i++)
+ {
+ DataWatcher.a(i, new Vector(0, 0, 0));
+ }
+
+ // Rotations are from -360 to 360
+ }
+
+ public Vector getHeadPosition()
+ {
+ return _headPosition.clone();
+ }
+
+ protected String getHurtSound()
+ {
+ return null;
+ }
+
+ @Override
+ public Packet GetSpawnPacket()
+ {
+ PacketPlayOutSpawnEntityLiving packet = new PacketPlayOutSpawnEntityLiving();
+ packet.a = Entity.getId();
+ packet.b = (byte) 30;
+ packet.c = (int) EnumEntitySize.SIZE_2.a(Entity.locX);
+ packet.d = (int) MathHelper.floor(Entity.locY * 32.0D);
+ packet.e = (int) EnumEntitySize.SIZE_2.a(Entity.locZ);
+ packet.i = (byte) ((int) (Entity.yaw * 256.0F / 360.0F));
+ packet.j = (byte) ((int) (Entity.pitch * 256.0F / 360.0F));
+ packet.k = (byte) ((int) (Entity.yaw * 256.0F / 360.0F));
+
+ double var2 = 3.9D;
+ double var4 = 0;
+ double var6 = 0;
+ double var8 = 0;
+
+ if (var4 < -var2)
+ {
+ var4 = -var2;
+ }
+
+ if (var6 < -var2)
+ {
+ var6 = -var2;
+ }
+
+ if (var8 < -var2)
+ {
+ var8 = -var2;
+ }
+
+ if (var4 > var2)
+ {
+ var4 = var2;
+ }
+
+ if (var6 > var2)
+ {
+ var6 = var2;
+ }
+
+ if (var8 > var2)
+ {
+ var8 = var2;
+ }
+
+ packet.f = (int) (var4 * 8000.0D);
+ packet.g = (int) (var6 * 8000.0D);
+ packet.h = (int) (var8 * 8000.0D);
+
+ packet.l = DataWatcher;
+ packet.m = DataWatcher.b();
+
+ return packet;
+ }
+
+ public void setBodyPosition(Vector vector)
+ {
+ DataWatcher.watch(12, vector);
+ }
+
+ public void setHasArms()
+ {
+ DataWatcher.watch(10, (byte) DataWatcher.getByte(10) | 4);
+ }
+
+ public void setHeadPosition(Vector vector)
+ {
+ _headPosition = vector;
+ DataWatcher.watch(11, vector);
+ }
+
+ public void setLeftArmPosition(Vector vector)
+ {
+ DataWatcher.watch(13, vector);
+ }
+
+ public void setLeftLegPosition(Vector vector)
+ {
+ DataWatcher.watch(15, vector);
+ }
+
+ public void setRemoveBase()
+ {
+ DataWatcher.watch(10, (byte) DataWatcher.getByte(10) | 8);
+ }
+
+ public void setRightArmPosition(Vector vector)
+ {
+ DataWatcher.watch(14, vector);
+ }
+
+ public void setRightLegPosition(Vector vector)
+ {
+ DataWatcher.watch(16, vector);
+ }
+
+ public void setSmall()
+ {
+ DataWatcher.watch(10, (byte) DataWatcher.getByte(10) | 1);
+ }
+
+ public void setGravityEffected()
+ {
+ DataWatcher.watch(10, (byte) DataWatcher.getByte(10) | 2);
+ }
+}
diff --git a/Plugins/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseInsentient.java b/Plugins/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseInsentient.java
index 595a8a25f..d2b6c6c47 100644
--- a/Plugins/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseInsentient.java
+++ b/Plugins/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseInsentient.java
@@ -1,11 +1,6 @@
package mineplex.core.disguise.disguises;
-import java.util.ArrayList;
-import java.util.List;
-
import mineplex.core.common.*;
-import net.minecraft.server.v1_7_R4.Packet;
-import net.minecraft.server.v1_7_R4.PacketPlayOutEntityEquipment;
import org.bukkit.*;
public abstract class DisguiseInsentient extends DisguiseLiving
@@ -15,11 +10,15 @@ public abstract class DisguiseInsentient extends DisguiseLiving
public DisguiseInsentient(org.bukkit.entity.Entity entity)
{
super(entity);
-
- DataWatcher.a(11, Byte.valueOf((byte)0));
- DataWatcher.a(10, "");
- DataWatcher.a(3, Byte.valueOf((byte) 0));
- DataWatcher.a(2, "");
+
+ DataWatcher.a(3, Byte.valueOf((byte) 0));
+ DataWatcher.a(2, "");
+
+ if (!(this instanceof DisguiseArmorStand))
+ {
+ DataWatcher.a(11, Byte.valueOf((byte) 0));
+ DataWatcher.a(10, "");
+ }
}
public void setName(String name)
diff --git a/Plugins/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseLiving.java b/Plugins/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseLiving.java
index 46572e6ec..855de31de 100644
--- a/Plugins/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseLiving.java
+++ b/Plugins/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseLiving.java
@@ -1,13 +1,21 @@
package mineplex.core.disguise.disguises;
+import java.util.ArrayList;
import java.util.Random;
+import org.bukkit.Material;
+import org.bukkit.craftbukkit.v1_7_R4.inventory.CraftItemStack;
+import org.bukkit.inventory.ItemStack;
+
import net.minecraft.server.v1_7_R4.EntityLiving;
+import net.minecraft.server.v1_7_R4.Packet;
+import net.minecraft.server.v1_7_R4.PacketPlayOutEntityEquipment;
public abstract class DisguiseLiving extends DisguiseBase
{
private static Random _random = new Random();
private boolean _invisible;
+ private ItemStack[] _equipment = new ItemStack[5];
public DisguiseLiving(org.bukkit.entity.Entity entity)
{
@@ -19,6 +27,79 @@ public abstract class DisguiseLiving extends DisguiseBase
DataWatcher.a(9, Byte.valueOf((byte) 0));
}
+ public ItemStack[] getEquipment()
+ {
+ return _equipment;
+ }
+
+ public void setEquipment(ItemStack[] equipment)
+ {
+ _equipment = equipment;
+ }
+
+ public void setHelmet(ItemStack item)
+ {
+ _equipment[3] = item;
+ }
+
+ public void setChestplate(ItemStack item)
+ {
+ _equipment[2] = item;
+ }
+
+ public void setLeggings(ItemStack item)
+ {
+ _equipment[1] = item;
+ }
+
+ public void setBoots(ItemStack item)
+ {
+ _equipment[0] = item;
+ }
+
+ public void setHeldItem(ItemStack item)
+ {
+ _equipment[4] = item;
+ }
+
+ public ArrayList getEquipmentPackets()
+ {
+ ArrayList packets = new ArrayList();
+
+ for (int nmsSlot = 0; nmsSlot < 5; nmsSlot++)
+ {
+ int armorSlot = nmsSlot - 1;
+
+ if (armorSlot < 0)
+ armorSlot = 4;
+
+ ItemStack itemstack = _equipment[armorSlot];
+
+ if (itemstack != null && itemstack.getType() != Material.AIR)
+ {
+ ItemStack item = null;
+
+ if (Entity instanceof EntityLiving)
+ {
+ item = CraftItemStack.asBukkitCopy(((EntityLiving) Entity).getEquipment()[nmsSlot]);
+ }
+
+ if (item == null || item.getType() == Material.AIR)
+ {
+ PacketPlayOutEntityEquipment packet = new PacketPlayOutEntityEquipment();
+
+ packet.a = GetEntityId();
+ packet.b = nmsSlot;
+ packet.c = CraftItemStack.asNMSCopy(itemstack);
+
+ packets.add(packet);
+ }
+ }
+ }
+
+ return packets;
+ }
+
public void UpdateDataWatcher()
{
super.UpdateDataWatcher();
@@ -37,14 +118,12 @@ public abstract class DisguiseLiving extends DisguiseBase
DataWatcher.watch(9, Entity.getDataWatcher().getByte(9));
}
}
-
-
public boolean isInvisible()
{
return _invisible;
}
-
+
public void setInvisible(boolean invisible)
{
_invisible = invisible;
diff --git a/Plugins/Mineplex.Core/src/mineplex/core/notifier/NotificationManager.java b/Plugins/Mineplex.Core/src/mineplex/core/notifier/NotificationManager.java
index 8367fa243..808d3fe33 100644
--- a/Plugins/Mineplex.Core/src/mineplex/core/notifier/NotificationManager.java
+++ b/Plugins/Mineplex.Core/src/mineplex/core/notifier/NotificationManager.java
@@ -42,8 +42,8 @@ public class NotificationManager extends MiniPlugin
if (!_enabled)
return;
- //if (event.getType() == UpdateType.MIN_08)
- // hugeSale();
+// if (event.getType() == UpdateType.MIN_08)
+// hugeSale();
if (event.getType() == UpdateType.MIN_16)
sale();
diff --git a/Plugins/Mineplex.MapParser/src/mineplex/mapparser/MapParser.java b/Plugins/Mineplex.MapParser/src/mineplex/mapparser/MapParser.java
index 08915a045..9d1efd727 100644
--- a/Plugins/Mineplex.MapParser/src/mineplex/mapparser/MapParser.java
+++ b/Plugins/Mineplex.MapParser/src/mineplex/mapparser/MapParser.java
@@ -24,6 +24,7 @@ import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.block.BlockBurnEvent;
import org.bukkit.event.block.BlockFadeEvent;
+import org.bukkit.event.block.BlockFormEvent;
import org.bukkit.event.block.BlockSpreadEvent;
import org.bukkit.event.block.LeavesDecayEvent;
import org.bukkit.event.entity.EntitySpawnEvent;
@@ -277,6 +278,12 @@ public class MapParser extends JavaPlugin implements Listener
event.setCancelled(true);
}
+ @EventHandler
+ public void DisableIceForm(BlockFormEvent event)
+ {
+ event.setCancelled(true);
+ }
+
@EventHandler
public void Updates(PlayerMoveEvent event)
{
diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/bridge/Bridge.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/bridge/Bridge.java
index 7402faf4b..52f199735 100644
--- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/bridge/Bridge.java
+++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/bridge/Bridge.java
@@ -40,9 +40,12 @@ import org.bukkit.inventory.ItemStack;
import org.bukkit.metadata.FixedMetadataValue;
import org.bukkit.util.Vector;
+import mineplex.core.common.Rank;
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.UtilAlg;
import mineplex.core.common.util.UtilBlock;
import mineplex.core.common.util.UtilEvent;
import mineplex.core.common.util.UtilGear;
@@ -95,8 +98,13 @@ public class Bridge extends TeamGame implements OreObsfucation
private ArrayList _lavaSource = new ArrayList();
//Lilly Pad Bridge
- private ArrayList _lillyPads = new ArrayList();
-
+ private NautHashMap _lillyPads = new NautHashMap();
+
+ //Mushrooms
+ private NautHashMap _mushroomStem = new NautHashMap();
+ private NautHashMap _mushroomTop = new NautHashMap();
+ private boolean _stemsGrown = false;
+
//Ice
private ArrayList _iceBridge = new ArrayList();
@@ -234,11 +242,16 @@ public class Bridge extends TeamGame implements OreObsfucation
}
}
- @EventHandler(priority = EventPriority.HIGH)
+ @EventHandler(priority = EventPriority.MONITOR)
public void GameStateChange(GameStateChangeEvent event)
{
if (event.GetState() != GameState.Live)
return;
+
+ if (!WorldData.GetCustomLocs("WATER_DAMAGE").isEmpty())
+ {
+ WorldWaterDamage = 4;
+ }
if (WorldWaterDamage > 0)
{
@@ -259,7 +272,8 @@ public class Bridge extends TeamGame implements OreObsfucation
ParseWoodBridge();
ParseIceBridge();
ParseLillyPad();
-
+ ParseMushrooms();
+
ParseChests();
ParseOre(WorldData.GetCustomLocs("73")); // Red
@@ -650,12 +664,29 @@ public class Bridge extends TeamGame implements OreObsfucation
private void ParseIceBridge()
{
- _iceBridge = WorldData.GetCustomLocs("LIGHT_BLUE");
+ _iceBridge = WorldData.GetDataLocs("LIGHT_BLUE");
}
+ private void ParseMushrooms()
+ {
+ for (Location loc : WorldData.GetCustomLocs("21"))
+ {
+ _mushroomStem.put(loc, 0L);
+ loc.getBlock().setType(Material.AIR);
+ }
+
+ for (Location loc : WorldData.GetDataLocs("PURPLE"))
+ {
+ _mushroomTop.put(loc, 0L);
+ }
+ }
+
private void ParseLillyPad()
{
- _lillyPads = WorldData.GetDataLocs("LIME");
+ for (Location loc : WorldData.GetDataLocs("LIME"))
+ {
+ _lillyPads.put(loc, 0L);
+ }
}
@EventHandler
@@ -690,6 +721,7 @@ public class Bridge extends TeamGame implements OreObsfucation
BuildLava();
BuildIce();
BuildLillyPad();
+ buildMushroom();
}
private void BuildLava()
@@ -725,11 +757,14 @@ public class Bridge extends TeamGame implements OreObsfucation
private void BuildLillyPad()
{
- for (int i = 0; i < 2; i++)
+ for (int i = 0; i < 3; i++)
if (_lillyPads != null && !_lillyPads.isEmpty())
{
// Random Block
- Location loc = _lillyPads.get(UtilMath.r(_lillyPads.size()));
+ Location loc = UtilAlg.Random(_lillyPads.keySet());
+
+ if (!UtilTime.elapsed(_lillyPads.get(loc), 8000))
+ continue;
if (!loc.getBlock().getRelative(BlockFace.DOWN).isLiquid())
continue;
@@ -743,19 +778,120 @@ public class Bridge extends TeamGame implements OreObsfucation
}
}
+ @EventHandler
+ public void breakLillyPad(BlockBreakEvent event)
+ {
+ if (event.getBlock().getType() != Material.WATER_LILY)
+ return;
+
+ _lillyPads.put(event.getBlock().getLocation(), System.currentTimeMillis() + (long)(Math.random() * 12000));
+ }
+
+ private void buildMushroom()
+ {
+ if (_mushroomStem != null && !_mushroomStem.isEmpty())
+ {
+ for (int i=0 ; i<4 && !_mushroomStem.isEmpty() ; i++)
+ {
+ double lowestY = 0;
+ Location lowestLoc = null;
+
+ for (Location loc : _mushroomStem.keySet())
+ {
+ if (!UtilTime.elapsed(_mushroomStem.get(loc), 6000))
+ continue;
+
+ if (lowestLoc == null || loc.getY() < lowestY)
+ {
+ lowestY = loc.getY();
+ lowestLoc = loc;
+ }
+ }
+
+ if (lowestLoc == null)
+ continue;
+
+ _mushroomStem.remove(lowestLoc);
+
+ MapUtil.QuickChangeBlockAt(lowestLoc, 100, (byte)15);
+ }
+ }
+ else
+ {
+ _stemsGrown = true;
+ }
+
+ if (_stemsGrown && _mushroomTop != null && !_mushroomTop.isEmpty())
+ {
+ int attempts = 0;
+ int done = 0;
+ while (done < 6 && attempts < 400)
+ {
+ attempts++;
+
+ // Random Block
+ Location loc = UtilAlg.Random(_mushroomTop.keySet());
+
+ if (!UtilTime.elapsed(_mushroomTop.get(loc), 6000))
+ continue;
+
+ Block block = loc.getBlock();
+
+ if (block.getRelative(BlockFace.DOWN).getType() == Material.AIR &&
+ block.getRelative(BlockFace.NORTH).getType() == Material.AIR &&
+ block.getRelative(BlockFace.EAST).getType() == Material.AIR &&
+ block.getRelative(BlockFace.SOUTH).getType() == Material.AIR &&
+ block.getRelative(BlockFace.WEST).getType() == Material.AIR)
+ continue;
+
+ _mushroomTop.remove(loc);
+
+ MapUtil.QuickChangeBlockAt(block.getLocation(), 99, (byte)14);
+
+ done++;
+ }
+ }
+ }
+
+ @EventHandler
+ public void breakMushroom(BlockBreakEvent event)
+ {
+ if (event.isCancelled())
+ return;
+
+
+ if (event.getBlock().getTypeId() == 100 &&
+ WorldData.GetCustomLocs("21").contains(event.getBlock().getLocation().add(0.5, 0, 0.5)))
+ {
+ event.setCancelled(true);
+ event.getBlock().setType(Material.AIR);
+
+ _mushroomStem.put(event.getBlock().getLocation(), System.currentTimeMillis() + (long)(Math.random() * 12000));
+ }
+
+ if (event.getBlock().getTypeId() == 99 &&
+ WorldData.GetDataLocs("PURPLE").contains(event.getBlock().getLocation().add(0.5, 0, 0.5)))
+ {
+ event.setCancelled(true);
+ event.getBlock().setType(Material.AIR);
+
+ _mushroomTop.put(event.getBlock().getLocation(), System.currentTimeMillis() + (long)(Math.random() * 12000));
+ }
+ }
+
private void BuildIce()
{
- if (UtilTime.elapsed(this.GetStateTime(), _bridgeTime + 120000))
+ if (_iceBridge == null || _iceBridge.isEmpty() || UtilTime.elapsed(this.GetStateTime(), _bridgeTime + 120000))
{
WorldData.World.setStorm(false);
return;
}
WorldData.World.setStorm(true);
-
+
int attempts = 0;
int done = 0;
- while (done < 2 && attempts < 500 && _iceBridge != null && !_iceBridge.isEmpty())
+ while (done < 5 && attempts < 400)
{
attempts++;
@@ -776,12 +912,9 @@ public class Bridge extends TeamGame implements OreObsfucation
_iceBridge.remove(loc);
if (Math.random() > 0.25)
- MapUtil.QuickChangeBlockAt(loc, Material.PACKED_ICE);
+ MapUtil.QuickChangeBlockAt(block.getLocation(), Material.PACKED_ICE);
else
- MapUtil.QuickChangeBlockAt(loc, Material.ICE);
-
- // Sound
- loc.getWorld().playEffect(loc, Effect.STEP_SOUND, Material.ICE);
+ MapUtil.QuickChangeBlockAt(block.getLocation(), Material.ICE);
done++;
}
@@ -1242,7 +1375,7 @@ public class Bridge extends TeamGame implements OreObsfucation
for (GameTeam team : this.GetTeamList())
{
//Display Individual Players
- if (this.GetPlayers(true).size() < 10)
+ if (this.GetPlayers(true).size() < 8)
{
if (!team.IsTeamAlive())
continue;
@@ -1662,9 +1795,18 @@ public class Bridge extends TeamGame implements OreObsfucation
}
@EventHandler
- public void toggleOre(PlayerCommandPreprocessEvent event)
+ public void debug(PlayerCommandPreprocessEvent event)
{
- if (event.getPlayer().isOp() && event.getMessage().contains("/oretoggle"))
+ if (Manager.GetClients().hasRank(event.getPlayer(), Rank.ADMIN) && event.getMessage().contains("/oretoggle"))
_ore.ToggleVisibility();
+
+ if (Manager.GetClients().hasRank(event.getPlayer(), Rank.ADMIN) && event.getMessage().contains("/bridge"))
+ _bridgeTime = 30000;
+ }
+
+ @EventHandler
+ public void disableIceForm(BlockFormEvent event)
+ {
+ event.setCancelled(true);
}
}
diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/stacker/Stacker.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/stacker/Stacker.java
index fef37436a..5757baaad 100644
--- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/stacker/Stacker.java
+++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/stacker/Stacker.java
@@ -163,9 +163,9 @@ public class Stacker extends SoloGame implements IThrown
Entity hit = target;
- //Shuffle Down
+ // Shuffle Down
while (hit.getVehicle() != null)
- hit = target.getVehicle();
+ hit = hit.getVehicle();
//Hit Own Stack > Rethrow
if (hit.equals(data.GetThrower()))
diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/Perk.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/Perk.java
index 5b8af51b1..aecdbf572 100644
--- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/Perk.java
+++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/kit/Perk.java
@@ -54,4 +54,9 @@ public abstract class Perk implements Listener
{
//Null Default
}
+
+ public void registeredEvents()
+ {
+ // When listener has been registered
+ }
}
diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java
index 561ebbb7f..119179fb8 100644
--- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java
+++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/managers/GameManager.java
@@ -307,7 +307,7 @@ public class GameManager implements Listener
event.GetGame().RegisterKits();
}
- @EventHandler
+ @EventHandler(priority = EventPriority.HIGH)
public void KitDeregister(GameStateChangeEvent event)
{
if (event.GetState() != GameState.Dead)
diff --git a/Pocket/plugins/Mineplex/src/Test.php b/Pocket/plugins/Mineplex/src/Test.php
new file mode 100644
index 000000000..42337416e
--- /dev/null
+++ b/Pocket/plugins/Mineplex/src/Test.php
@@ -0,0 +1,15 @@
+getServer()->getScheduler()->scheduleRepeatingTask(new TickTask($this), 1);
+ $this->arena = new MultiGameArena($this, new TestGameFactory());
+ Server::getInstance()->getPluginManager()->registerEvents($this, $this);
+
+ //$this->test = new WorldComponent($this->arena);
- $this->getServer()->getPluginManager()->registerEvents($this, $this);
new Updater($this);
+
+ $this->arena->getPlugin()->getServer()->getLevelByName("world")->setSpawnLocation(new Vector3(0, 200, 0));
}
- public function onDisable()
+ public function onLogin(PlayerLoginEvent $event)
{
+ UtilFile::deleteDir('players/' . $event->getPlayer()->getName() . '.dat');
+ if ($this->arena->canJoin($event->getPlayer()))
+ return;
+
+ $event->setKickMessage("Unable to join game!");
+ $event->setCancelled();
}
- public function onPlayerJoin(PlayerJoinEvent $event)
+ public function onJoin(PlayerJoinEvent $event)
{
- $event->getPlayer()->sendMessage("Welcome to the server " . $event->getPlayer()->getName() . "!");
+ $this->arena->addPlayer($event->getPlayer());
+ }
- $this->getLogger()->info($event->getPlayer()->getName() . " UID: " . $event->getPlayer()->getUniqueId());
-
- if (UtilString::startsWith( $event->getPlayer()->getName(), "chissling"))
+ public function punch(PlayerInteractEvent $event)
+ {
+ if ($event->getAction() == PlayerInteractEvent::LEFT_CLICK_BLOCK || $event->getAction() == PlayerInteractEvent::RIGHT_CLICK_BLOCK)
{
- $event->getPlayer()->setNameTag("// chiss //");
- $event->getPlayer()->setDisplayName("// chiss //");
+ $event->getPlayer()->sendMessage("Block: " . $event->getBlock()->getId() . ":" . $event->getBlock()->getDamage());
}
}
- public function onPlayerCommand(PlayerCommandPreprocessEvent $event)
+ public function command(PlayerCommandPreprocessEvent $event)
{
- if (UtilString::startsWith($event->getMessage(), "/mineplex"))
- {
- $event->setCancelled(true);
-
- $event->getPlayer()->sendMessage("Sending you to: MINEPLEX");
-
- $packet = new StrangePacket();
- $packet->address = "69.175.104.154";
-
- $event->getPlayer()->directDataPacket($packet);
- }
-
- if (UtilString::startsWith($event->getMessage(), "/ip "))
- {
- $event->setCancelled(true);
-
- $ip = substr($event->getMessage(), 4, strlen($event->getMessage()));
-
- $event->getPlayer()->sendMessage("Sending you to: " . $ip);
-
- $packet = new StrangePacket();
- $packet->address = $ip;
-
- $event->getPlayer()->directDataPacket($packet);
- }
+ if (UtilString::startsWith($event->getMessage(), "/pos"))
+ self::sendLoc($event->getPlayer());
}
- public function onTick(UpdateEvent $event)
+ public static function sendLoc(Player $player)
{
+ $pos = $player->getLocation();
+
+ $player->sendMessage("X: " . $pos->getX());
+ $player->sendMessage("Y: " . $pos->getY());
+ $player->sendMessage("Z: " . $pos->getZ());
+ $player->sendMessage("Level: " . $pos->getLevel()->getName());
}
+
}
\ No newline at end of file
diff --git a/Pocket/plugins/Mineplex/src/mineplex/plugin/core/commen/ItemContainer.php b/Pocket/plugins/Mineplex/src/mineplex/plugin/core/commen/ItemContainer.php
new file mode 100644
index 000000000..485e63027
--- /dev/null
+++ b/Pocket/plugins/Mineplex/src/mineplex/plugin/core/commen/ItemContainer.php
@@ -0,0 +1,38 @@
+ids = array_flip($ids);
+ }
+ $this->black = $black;
+ }
+
+ public function hasItem($id)
+ {
+ return ($this->black == UtilArray::hasKey($id, $this->ids));
+ }
+}
\ No newline at end of file
diff --git a/Pocket/plugins/Mineplex/src/mineplex/plugin/core/updater/UpdateEvent.php b/Pocket/plugins/Mineplex/src/mineplex/plugin/core/updater/UpdateEvent.php
index 5d9b4b5c1..942455136 100644
--- a/Pocket/plugins/Mineplex/src/mineplex/plugin/core/updater/UpdateEvent.php
+++ b/Pocket/plugins/Mineplex/src/mineplex/plugin/core/updater/UpdateEvent.php
@@ -14,15 +14,22 @@ class UpdateEvent extends Event
{
public static $handlerList = null;
- public $time;
+ public $tick;
+ public $updateTypes;
- public function __construct($time)
+ public function __construct($tick, $updateTypes)
{
- $this->time = $time;
+ $this->tick = $tick;
+ $this->updateTypes = $updateTypes;
}
- public function getTime()
+ public function getTick()
{
- return $this->time;
+ return $this->tick;
+ }
+
+ public function isTiming($type)
+ {
+ return (isset($this->updateTypes[$type]) || array_key_exists($type, $this->updateTypes));
}
}
\ No newline at end of file
diff --git a/Pocket/plugins/Mineplex/src/mineplex/plugin/core/updater/UpdateType.php b/Pocket/plugins/Mineplex/src/mineplex/plugin/core/updater/UpdateType.php
index 7f7349dfd..06c92c160 100644
--- a/Pocket/plugins/Mineplex/src/mineplex/plugin/core/updater/UpdateType.php
+++ b/Pocket/plugins/Mineplex/src/mineplex/plugin/core/updater/UpdateType.php
@@ -11,27 +11,46 @@ namespace mineplex\plugin\core\updater;
class UpdateType
{
- const MIN_64 = 3840000;
- const MIN_32 = 1920000;
- const MIN_16 = 960000;
- const MIN_08 = 480000;
- const MIN_04 = 240000;
- const MIN_02 = 120000;
- const MIN_01 = 60000;
- const SLOWEST = 32000;
- const SLOWER = 16000;
- const SLOW = 4000;
- const TWOSEC = 2000;
- const SEC = 1000;
- const FAST = 500;
- const FASTER = 250;
- const FASTEST = 125;
- const TICK = 49;
+ const M64 = 3840000;
+ const M32 = 1920000;
+ const M16 = 960000;
+ const M8 = 480000;
+ const M4 = 240000;
+ const M2 = 120000;
+ const M1 = 60000;
+ const S32 = 32000;
+ const S16 = 16000;
+ const S8 = 8000;
+ const S4 = 4000;
+ const S2 = 2000;
+ const S1 = 1000;
+ const MS500 = 500;
+ const MS250 = 250;
+ const MS125 = 125;
public $time;
+ private $lastTrigger = 0;
+
public function __construct($time=0)
{
$this->time = $time;
}
+
+ public function canTrigger()
+ {
+ if (round(microtime(true) * 1000) - $this->lastTrigger > $this->time)
+ {
+ $this->lastTrigger = round(microtime(true) * 1000);
+ return true;
+ }
+
+ return false;
+ }
+
+ public function isTiming($timing)
+ {
+ return $this->time === $timing;
+ }
+
}
\ No newline at end of file
diff --git a/Pocket/plugins/Mineplex/src/mineplex/plugin/core/updater/Updater.php b/Pocket/plugins/Mineplex/src/mineplex/plugin/core/updater/Updater.php
index 4d833ed2e..8090d0bb3 100644
--- a/Pocket/plugins/Mineplex/src/mineplex/plugin/core/updater/Updater.php
+++ b/Pocket/plugins/Mineplex/src/mineplex/plugin/core/updater/Updater.php
@@ -8,51 +8,54 @@
namespace mineplex\plugin\core\updater;
+use mineplex\plugin\core\updater\UpdateType;
use pocketmine\plugin\PluginBase;
use pocketmine\scheduler\PluginTask;
class Updater extends PluginTask
{
private $plugin;
- private $last;
+ /** @var UpdateType[] */
private $updateTypes;
public function __construct(PluginBase $host)
{
+ parent::__construct($host);
$this->plugin = $host;
- $this->owner = $host;
+
$this->plugin->getServer()->getScheduler()->scheduleRepeatingTask($this, 1);
$this->updateTypes = array(
- new UpdateType(UpdateType::TICK)
- , new UpdateType(UpdateType::FASTEST)
- , new UpdateType(UpdateType::FASTER)
- , new UpdateType(UpdateType::FAST)
- , new UpdateType(UpdateType::SEC)
- , new UpdateType(UpdateType::TWOSEC)
- , new UpdateType(UpdateType::SLOW)
- , new UpdateType(UpdateType::SLOWER)
- , new UpdateType(UpdateType::SLOWEST)
- , new UpdateType(UpdateType::MIN_01)
- , new UpdateType(UpdateType::MIN_02)
- , new UpdateType(UpdateType::MIN_04)
- , new UpdateType(UpdateType::MIN_08)
- , new UpdateType(UpdateType::MIN_16)
- , new UpdateType(UpdateType::MIN_32)
- , new UpdateType(UpdateType::MIN_64));
+ new UpdateType(UpdateType::MS125)
+ , new UpdateType(UpdateType::MS250)
+ , new UpdateType(UpdateType::MS500)
+ , new UpdateType(UpdateType::S1)
+ , new UpdateType(UpdateType::S2)
+ , new UpdateType(UpdateType::S4)
+ , new UpdateType(UpdateType::S8)
+ , new UpdateType(UpdateType::S16)
+ , new UpdateType(UpdateType::S32)
+ , new UpdateType(UpdateType::M1)
+ , new UpdateType(UpdateType::M2)
+ , new UpdateType(UpdateType::M4)
+ , new UpdateType(UpdateType::M8)
+ , new UpdateType(UpdateType::M16)
+ , new UpdateType(UpdateType::M32));
}
+ //Fires off an event each tick, containing a list of all updateTypes
public function onRun($currentTick)
{
- $timeSpent = round(microtime(true) * 1000) - $this->last;
- $this->last = round(microtime(true) * 1000);
+ $updateTypes = array();
foreach ($this->updateTypes as &$updateType)
{
- if ($timeSpent >= $updateType->time)
+ if ($updateType->canTrigger())
{
- $this->plugin->getServer()->getPluginManager()->callEvent(new UpdateEvent($updateType->time));
+ $updateTypes[$updateType->time] = 1;
}
}
+ //Call Event
+ $this->plugin->getServer()->getPluginManager()->callEvent(new UpdateEvent($currentTick, $updateTypes));
}
}
\ No newline at end of file
diff --git a/Pocket/plugins/Mineplex/src/mineplex/plugin/events/TickEvent.php b/Pocket/plugins/Mineplex/src/mineplex/plugin/events/TickEvent.php
deleted file mode 100644
index acdb410e3..000000000
--- a/Pocket/plugins/Mineplex/src/mineplex/plugin/events/TickEvent.php
+++ /dev/null
@@ -1,22 +0,0 @@
-tick = $currentTick;
- }
-
- public function getTick()
- {
- return $this->tick;
- }
-}
\ No newline at end of file
diff --git a/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/arenas/Arena.php b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/arenas/Arena.php
new file mode 100644
index 000000000..1c4fd18c1
--- /dev/null
+++ b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/arenas/Arena.php
@@ -0,0 +1,41 @@
+arena = $arena;
+ }
+
+ public function getArena()
+ {
+ return $this->arena;
+ }
+}
\ No newline at end of file
diff --git a/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/arenas/MultiGameArena.php b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/arenas/MultiGameArena.php
new file mode 100644
index 000000000..5ae4372c3
--- /dev/null
+++ b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/arenas/MultiGameArena.php
@@ -0,0 +1,111 @@
+getPluginManager()->registerEvents($this, $plugin);
+ $this->gameFactory = $gameFactory;
+ $this->plugin = $plugin;
+ $this->startGame();
+ }
+
+ public function canJoin(Player $player)
+ {
+ $event = new ArenaCanJoinEvent($this, $player);
+ $this->plugin->getServer()->getPluginManager()->callEvent($event);
+ return !$event->isCancelled();
+ }
+
+ public function addPlayer(Player $player)
+ {
+ $this->plugin->getServer()->getPluginManager()->callEvent(new ArenaJoinEvent($this, $player));
+ array_push($this->players, $player);
+ }
+
+ public function removePlayer(Player $player)
+ {
+ if (($key = array_search($player, $this->players, true)) !== FALSE) {
+ unset($this->players[$key]);
+ }
+ Server::getInstance()->broadcastMessage("Calling ArenaQuitEvent");
+ $this->plugin->getServer()->getPluginManager()->callEvent(new ArenaQuitEvent($this, $player));
+ }
+
+ public function onQuit(PlayerQuitEvent $event)
+ {
+ $this->removePlayer($event->getPlayer());
+ }
+
+
+ public function endGame()
+ {
+ Server::getInstance()->getPluginManager()->callEvent(new ArenaEndEvent($this));
+ $this->startGame();
+ }
+
+ private function startGame()
+ {
+ $this->game = $this->gameFactory->getGame();
+ $this->game->start($this);
+ Server::getInstance()->getPluginManager()->callEvent(new ArenaStartEvent($this));
+ }
+
+ public function getPlayers()
+ {
+ return $this->players;
+ }
+
+ /**
+ * @param mixed $player
+ * @return bool
+ */
+ public function hasPlayer($player)
+ {
+ if (!($player instanceof Player))
+ return false;
+ return in_array($player, $this->getPlayers());
+ }
+
+ public function getCurrentGame()
+ {
+ return $this->game;
+ }
+
+ public function getPlugin()
+ {
+ return $this->plugin;
+ }
+}
\ No newline at end of file
diff --git a/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/arenas/SingleGameArena.php b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/arenas/SingleGameArena.php
new file mode 100644
index 000000000..bd0f1902c
--- /dev/null
+++ b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/arenas/SingleGameArena.php
@@ -0,0 +1,106 @@
+getPluginManager()->registerEvents($this, $plugin);
+ $this->game = $game;
+ $this->plugin = $plugin;
+ $this->getCurrentGame()->start($this);
+ Server::getInstance()->getPluginManager()->callEvent(new ArenaStartEvent($this));
+ }
+
+ public function canJoin(Player $player)
+ {
+ $event = new ArenaCanJoinEvent($this, $player);
+ $this->plugin->getServer()->getPluginManager()->callEvent($event);
+ return !$event->isCancelled();
+ }
+
+ public function addPlayer(Player $player)
+ {
+ $this->plugin->getServer()->getPluginManager()->callEvent(new ArenaJoinEvent($this, $player));
+ array_push($this->players, $player);
+ }
+
+ public function removePlayer(Player $player)
+ {
+ if(($key = array_search($player, $this->players, true)) !== FALSE) {
+ unset($this->players[$key]);
+ }
+ Server::getInstance()->broadcastMessage("Calling ArenaQuitEvent");
+ $this->plugin->getServer()->getPluginManager()->callEvent(new ArenaQuitEvent($this, $player));
+ }
+
+ public function onJoin(PlayerJoinEvent $event)
+ {
+ if ($this->canJoin($event->getPlayer()))
+ {
+ $this->addPlayer($event->getPlayer());
+ }
+ }
+
+ public function onQuit(PlayerQuitEvent $event)
+ {
+ $this->removePlayer($event->getPlayer());
+ }
+
+
+
+
+ public function getPlayers()
+ {
+ return $this->players;
+ }
+
+ public function getCurrentGame()
+ {
+ return $this->game;
+ }
+
+ public function getPlugin()
+ {
+ return $this->plugin;
+ }
+
+ public function endGame()
+ {
+ Server::getInstance()->getPluginManager()->callEvent(new ArenaEndEvent($this));
+ Server::getInstance()->broadcastMessage("MooCount: ".(string)count($this->players));
+
+ foreach ($this->players as $player)
+ {
+ Server::getInstance()->broadcastMessage((string)$player->getName());
+ $player->kick('Game Over...', false);
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/arenas/events/ArenaCanJoinEvent.php b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/arenas/events/ArenaCanJoinEvent.php
new file mode 100644
index 000000000..d2d73e4e4
--- /dev/null
+++ b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/arenas/events/ArenaCanJoinEvent.php
@@ -0,0 +1,30 @@
+player = $player;
+ }
+
+ public function getPlayer()
+ {
+ return $this->player;
+ }
+}
\ No newline at end of file
diff --git a/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/arenas/events/ArenaEndEvent.php b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/arenas/events/ArenaEndEvent.php
new file mode 100644
index 000000000..defcb2d54
--- /dev/null
+++ b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/arenas/events/ArenaEndEvent.php
@@ -0,0 +1,21 @@
+player = $player;
+ }
+
+ public function getPlayer()
+ {
+ return $this->player;
+ }
+}
\ No newline at end of file
diff --git a/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/arenas/events/ArenaQuitEvent.php b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/arenas/events/ArenaQuitEvent.php
new file mode 100644
index 000000000..2a191c34b
--- /dev/null
+++ b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/arenas/events/ArenaQuitEvent.php
@@ -0,0 +1,30 @@
+player = $player;
+ }
+
+ public function getPlayer()
+ {
+ return $this->player;
+ }
+}
\ No newline at end of file
diff --git a/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/arenas/events/ArenaStartEvent.php b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/arenas/events/ArenaStartEvent.php
new file mode 100644
index 000000000..62c906086
--- /dev/null
+++ b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/arenas/events/ArenaStartEvent.php
@@ -0,0 +1,20 @@
+arena = $arena;
+ $this->gameStateComponent = $gameStateComponent;
+
+ $this->startCount = $count;
+ $this->count = $count;
+
+ $this->startGameState = $startGameState;
+ $this->setGameState = $setGameState;
+
+ Server::getInstance()->getPluginManager()->registerEvents($this, $arena->getPlugin());
+ }
+
+ public function onGameStateChange(GameStateChangeEvent $event)
+ {
+ if ($event->getArena() !== $this->arena)
+ return;
+
+ if ($event->getToGameState() == $this->startGameState)
+ {
+ BenchSchedule::runTaskTimer($this, 1000, 1000);
+ }
+ else
+ {
+ BenchSchedule::cancelTask($this);
+ $this->count = $this->startCount;
+ }
+ }
+
+
+ public function onEnd(ArenaEndEvent $event)
+ {
+ if ($event->getArena() !== $this->arena)
+ return;
+ HandlerList::unregisterAll($this);
+ }
+
+ public function run(BenchTaskData $data)
+ {
+ print "Count: $this->count"."\n";
+
+ if ($this->count <= 0)
+ {
+ $this->gameStateComponent->setGameState($this->setGameState);
+ $data->end();
+ }
+
+ $this->popup();
+
+ $this->count--;
+
+
+ }
+
+ public function popup()
+ {
+ foreach ($this->arena->getPlayers() as $player)
+ {
+ $player->sendPopup("Countdown: $this->count");
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/countdown/LobbyCountdown.php b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/countdown/LobbyCountdown.php
new file mode 100644
index 000000000..0ccf4200b
--- /dev/null
+++ b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/countdown/LobbyCountdown.php
@@ -0,0 +1,197 @@
+arena = $arena;
+ $this->gameStateComponent = $gameStateComponent;
+ $this->worldComponent = $worldComponent;
+ $this->minPlayers = $minPlayers;
+
+ $this->startCount = $count;
+ $this->count = $count;
+
+ $this->startGameState = $startGameState;
+ $this->setGameState = $setGameState;
+
+ $this->message = self::WAITING_FOR_PLAYERS;
+
+ Server::getInstance()->getPluginManager()->registerEvents($this, $arena->getPlugin());
+ }
+
+
+ /**
+ * @param bool $addOne
+ */
+ function checkCountdown($addOne = false)
+ {
+ $playerCount = (count($this->arena->getPlayers()) + $addOne);
+
+ if ($this->gameStateComponent->getGameState() == $this->startGameState && $this->worldComponent->isWorldReady() && $playerCount >= $this->minPlayers)
+ {
+ if (!BenchSchedule::isRunningWithId($this, self::COUNTDOWN_ID))
+ {
+ $this->count = $this->startCount;
+ $this->setCount();
+ BenchSchedule::runTaskTimerWithId($this, 1000, 1000, self::COUNTDOWN_ID);
+ }
+ }
+ else
+ {
+ $this->setWaiting($playerCount);
+ BenchSchedule::cancelTaskWithId($this, self::COUNTDOWN_ID);
+ }
+ }
+
+
+
+ public function onJoin(ArenaJoinEvent $event)
+ {
+ if ($event->getArena() !== $this->arena)
+ return;
+ $this->checkCountdown(true);
+ $this->popup($event->getPlayer());
+ }
+
+ public function onQuit(ArenaQuitEvent $event)
+ {
+ if ($event->getArena() !== $this->arena)
+ return;
+ $this->checkCountdown();
+ }
+
+ public function onWorldCreation(WorldLoadSuccessEvent $event)
+ {
+ if ($event->getArena() !== $this->arena)
+ return;
+
+ $this->checkCountdown();
+ }
+
+ public function onGameStateChange(GameStateChangeEvent $event)
+ {
+ if ($event->getArena() !== $this->arena)
+ return;
+
+ if ($event->getToGameState() == $this->startGameState)
+ {
+ $this->checkCountdown();
+ BenchSchedule::runTaskTimerWithId($this, 500, 500, self::POPUP_ID);
+
+ }
+ elseif ($event->getFromGameState() == $this->startGameState)
+ {
+ //Cancels both tasks
+ BenchSchedule::cancelTask($this);
+
+ $this->count = $this->startCount;
+
+ }
+
+ }
+
+
+ public function onEnd(ArenaEndEvent $event)
+ {
+ if ($event->getArena() !== $this->arena)
+ return;
+ HandlerList::unregisterAll($this);
+ }
+
+ public function run(BenchTaskData $data)
+ {
+ if ($data->getId() == self::POPUP_ID)
+ {
+ $this->popupAll();
+ }
+ else //if ($data->getId() == self::COUNTDOWN_ID)
+ {
+ if ($this->count <= 0)
+ {
+ $this->gameStateComponent->setGameState($this->setGameState);
+ $data->end();
+ return;
+ }
+
+ $this->message = "§9Game starting in:§c $this->count";
+
+ $this->count--;
+ }
+ }
+
+ private function setWaiting($playerCount = null)
+ {
+ if ($playerCount == null)
+ $playerCount = count($this->arena->getPlayers());
+ $this->message = "§2Waiting for players! §a($playerCount/$this->minPlayers)";
+ $this->popupAll();
+ }
+
+ private function setCount($count = null)
+ {
+ if ($count == null)
+ $count = $this->count;
+ $this->message = "§9Game starting in:§c $count";
+ $this->popupAll();
+ }
+
+ private function popupAll()
+ {
+ foreach ($this->arena->getPlayers() as $player)
+ {
+ $this->popup($player);
+ }
+ }
+
+ private function popup(Player $player)
+ {
+ $player->sendTip($this->message);
+ }
+}
\ No newline at end of file
diff --git a/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/feature/Feature.php b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/feature/Feature.php
new file mode 100644
index 000000000..e5d612c9f
--- /dev/null
+++ b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/feature/Feature.php
@@ -0,0 +1,22 @@
+arena = $arena;
+ }
+
+ public function enable()
+ {
+ $this->enabled = true;
+ Server::getInstance()->getPluginManager()->registerEvents($this, $this->getArena()->getPlugin());
+ }
+
+ public function disable()
+ {
+ $this->enabled = false;
+ HandlerList::unregisterAll($this);
+ }
+
+ /**
+ * @return boolean
+ */
+ public function isEnabled()
+ {
+ $this->enabled;
+ }
+
+ /**
+ * @return Arena
+ */
+ public function getArena()
+ {
+ return $this->arena;
+ }
+
+}
\ No newline at end of file
diff --git a/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/feature/UtilFeature.php b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/feature/UtilFeature.php
new file mode 100644
index 000000000..3d888246d
--- /dev/null
+++ b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/feature/UtilFeature.php
@@ -0,0 +1,24 @@
+isEnabled())
+ $feature->enable();
+ }
+
+ public static function disable(Feature $feature)
+ {
+ if ($feature->isEnabled())
+ $feature->disable();
+ }
+}
\ No newline at end of file
diff --git a/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/feature/features/DeathSpectate.php b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/feature/features/DeathSpectate.php
new file mode 100644
index 000000000..fbd1b11b4
--- /dev/null
+++ b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/feature/features/DeathSpectate.php
@@ -0,0 +1,41 @@
+spectateComponent = $spectateComponent;
+ }
+
+ /**
+ * @ignoreCancelled true
+ * @param PlayerDeathEvent $event
+ */
+ function onDeath(PlayerDeathEvent $event)
+ {
+ if (!$this->getArena()->hasPlayer($event->getEntity()))
+ return;
+
+ if ($this->spectateComponent->enableSpectate($event->getEntity()))
+ {
+ //Do death stuff
+ $event->getEntity()->sendTip('§4§lYOU DIED!');
+ }
+ }
+}
\ No newline at end of file
diff --git a/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/feature/features/NoBlockBreak.php b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/feature/features/NoBlockBreak.php
new file mode 100644
index 000000000..0b9f8cf0a
--- /dev/null
+++ b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/feature/features/NoBlockBreak.php
@@ -0,0 +1,43 @@
+itemContainer = new ItemContainer($ids, $black);
+ }
+
+ /**
+ * @ignoreCancelled true
+ * @param BlockBreakEvent $event
+ */
+ public function onBlockBreak(BlockBreakEvent $event)
+ {
+ if (!$this->getArena()->hasPlayer($event->getPlayer()))
+ return;
+
+ if ($this->itemContainer->hasItem($event->getBlock()->getId()))
+ $event->setCancelled();
+ }
+}
\ No newline at end of file
diff --git a/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/feature/features/NoBlockPlace.php b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/feature/features/NoBlockPlace.php
new file mode 100644
index 000000000..69d24a50b
--- /dev/null
+++ b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/feature/features/NoBlockPlace.php
@@ -0,0 +1,43 @@
+itemContainer = new ItemContainer($ids, $black);
+ }
+
+ /**
+ * @ignoreCancelled true
+ * @param BlockPlaceEvent $event
+ */
+ public function onPlace(BlockPlaceEvent $event)
+ {
+ if (!$this->getArena()->hasPlayer($event->getPlayer()))
+ return;
+
+ if ($this->itemContainer->hasItem($event->getBlock()->getId()))
+ $event->setCancelled();
+ }
+}
\ No newline at end of file
diff --git a/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/feature/features/NoDropItem.php b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/feature/features/NoDropItem.php
new file mode 100644
index 000000000..6a44d0b0f
--- /dev/null
+++ b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/feature/features/NoDropItem.php
@@ -0,0 +1,42 @@
+itemContainer = new ItemContainer($ids, $black);
+ }
+
+ /**
+ * @ignoreCancelled true
+ * @param PlayerDropItemEvent $event
+ */
+ public function onDrop(PlayerDropItemEvent $event)
+ {
+ if (!$this->getArena()->hasPlayer($event->getPlayer()))
+ return;
+
+ if ($this->itemContainer->hasItem($event->getItem()->getId()))
+ $event->setCancelled();
+ }
+}
\ No newline at end of file
diff --git a/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/feature/features/NoMovement.php b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/feature/features/NoMovement.php
new file mode 100644
index 000000000..c76489f69
--- /dev/null
+++ b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/feature/features/NoMovement.php
@@ -0,0 +1,35 @@
+getArena()->hasPlayer($event->getPlayer()))
+ return;
+ if (($event->getFrom()->getX() == $event->getTo()->getX()) && ($event->getFrom()->getY() == $event->getTo()->getY()) && ($event->getFrom()->getZ() == $event->getTo()->getZ()))
+ return;
+ $event->setCancelled();
+ }
+
+}
\ No newline at end of file
diff --git a/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/feature/features/NoPickUpItem.php b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/feature/features/NoPickUpItem.php
new file mode 100644
index 000000000..230143fc7
--- /dev/null
+++ b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/feature/features/NoPickUpItem.php
@@ -0,0 +1,56 @@
+itemContainer = new ItemContainer($ids, $black);
+ }
+ /**
+ * @ignoreCancelled true
+ * @param InventoryPickupItemEvent $event
+ */
+ public function onPickUp(InventoryPickupItemEvent $event)
+ {
+ if (!$this->getArena()->hasPlayer($event->getInventory()->getHolder())) {
+ Server::getInstance()->broadcastMessage("You're not in the arena!");
+ return;
+ }
+
+ Server::getInstance()->broadcastMessage("Grass: " . Item::GRASS);
+ Server::getInstance()->broadcastMessage("Item: " . $event->getItem()->getItem()->getId());
+
+ if ($this->itemContainer->hasItem($event->getItem()->getItem()->getId())) {
+ $event->setCancelled();
+ Server::getInstance()->broadcastMessage("Stopped!");
+ } else
+ Server::getInstance()->broadcastMessage("Not Stopped!");
+
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/feature/managers/GameStateFeatureManager.php b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/feature/managers/GameStateFeatureManager.php
new file mode 100644
index 000000000..9d9cc03b9
--- /dev/null
+++ b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/feature/managers/GameStateFeatureManager.php
@@ -0,0 +1,102 @@
+arena = $arena;
+
+ unset ($features[GameState::RESTARTING]);
+
+ foreach ($features as $key => $value)
+ {
+ $this->features[$key] = UtilArray::getValuesRecursively($value);
+ }
+
+ Server::getInstance()->getPluginManager()->registerEvents($this, $arena->getPlugin());
+ }
+
+ public function onGameStateChange(GameStateChangeEvent $event)
+ {
+ if ($event->getArena() !== $this->arena)
+ return;
+
+ /** @var Feature[] $lastFeatures */
+
+ if (isset($this->features[$event->getFromGameState()]) || array_key_exists($event->getFromGameState(), $this->features))
+ $lastFeatures = $this->features[$event->getFromGameState()];
+ else
+ $lastFeatures = [];
+
+
+ /** @var Feature[] $theseFeatures */
+
+ if (isset($this->features[$event->getToGameState()]) || array_key_exists($event->getToGameState(), $this->features))
+ $theseFeatures = $this->features[$event->getToGameState()];
+ else
+ $theseFeatures = [];
+
+ /** @var Feature[] $toEnable */
+ $toEnable = UtilArray::arrayDiff($theseFeatures, $lastFeatures);
+
+ /** @var Feature[] $toDisable */
+ $toDisable = UtilArray::arrayDiff($lastFeatures, $theseFeatures);
+
+ foreach ($toDisable as $feature) {
+ if ($feature->isEnabled())
+ $feature->disable();
+ }
+ foreach ($toEnable as $feature) {
+ if (!$feature->isEnabled())
+ $feature->enable();
+ }
+ }
+
+ public function onEnd(ArenaEndEvent $event)
+ {
+ if ($event->getArena() !== $this->arena)
+ return;
+
+ $iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($this->features));
+
+ foreach ($iterator as $feature) {
+ if ($feature->isEnabled())
+ $feature->disable();
+ }
+
+ HandlerList::unregisterAll($this);
+ }
+
+}
+
+
diff --git a/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/gamestate/GameState.php b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/gamestate/GameState.php
new file mode 100644
index 000000000..dcb2504bf
--- /dev/null
+++ b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/gamestate/GameState.php
@@ -0,0 +1,21 @@
+arena = $arena;
+ $this->gameState = GameState::RESTARTING;
+ Server::getInstance()->getPluginManager()->registerEvents($this, $arena->getPlugin());
+ }
+
+ public function onStart(ArenaStartEvent $event)
+ {
+ if ($event->getArena() !== $this->arena)
+ return;
+ $this->setGameState(GameState::LOBBY);
+ }
+
+ /**
+ * @priority LOW
+ * @param ArenaEndEvent $event
+ */
+ public function onEnd(ArenaEndEvent $event)
+ {
+ if ($event->getArena() !== $this->arena)
+ return;
+ HandlerList::unregisterAll($this);
+ $this->localSetState(GameState::RESTARTING);
+ }
+
+
+ public function setGameState($gameState)
+ {
+
+ if ($gameState < GameState::LOBBY)
+ $gameState = GameState::LOBBY;
+
+ if ($gameState > GameState::RESTARTING)
+ $gameState = GameState::RESTARTING;
+
+ if ($gameState == $this->gameState)
+ return false;
+
+ if ($gameState == GameState::RESTARTING)
+ {
+ $this->arena->endGame();
+ return true;
+ }
+
+ $this->localSetState($gameState);
+
+ return true;
+ }
+
+ private function localSetState($gameState)
+ {
+ $oldGameState = $this->getGameState();
+
+ $this->gameState = $gameState;
+
+ $event = new GameStateChangeEvent($this->arena, $oldGameState, $gameState);
+
+ //Not sure if I should call the event before of after...
+ Server::getInstance()->getPluginManager()->callEvent($event);
+ }
+
+ public function getGameState()
+ {
+ return $this->gameState;
+ }
+
+}
+
+//$john = new GameStateComponent();
+//echo $john->getGameState();
diff --git a/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/gamestate/events/GameStateChangeEvent.php b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/gamestate/events/GameStateChangeEvent.php
new file mode 100644
index 000000000..bf7e4f385
--- /dev/null
+++ b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/gamestate/events/GameStateChangeEvent.php
@@ -0,0 +1,38 @@
+fromGameState = $fromGameState;
+ $this->toGameState = $toGameState;
+ }
+
+ public function getFromGameState()
+ {
+ return $this->fromGameState;
+ }
+
+ public function getToGameState()
+ {
+ return $this->toGameState;
+ }
+
+}
\ No newline at end of file
diff --git a/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/lobby/LobbyComponent.php b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/lobby/LobbyComponent.php
new file mode 100644
index 000000000..5f8af7070
--- /dev/null
+++ b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/lobby/LobbyComponent.php
@@ -0,0 +1,196 @@
+getDefaultLevel();
+
+ $world->setTime(6000);
+ $world->stopTime();
+
+ $this->worldName = $world->getName();
+
+ $this->arena = $arena;
+ $this->duringLobbyGameState = new DuringLobbyGameState($arena, $world);
+
+ Server::getInstance()->getPluginManager()->registerEvents($this, $arena->getPlugin());
+ }
+
+ public function onBlockBreak(BlockBreakEvent $event)
+ {
+ if ($event->getBlock()->getLevel()->getName() != $this->worldName)
+ return;
+ $event->setCancelled();
+ }
+
+ /**
+ * @priority LOW
+ * @param GameStateChangeEvent $event
+ */
+ public function gameStateChange(GameStateChangeEvent $event)
+ {
+ if ($event->getArena() !== $this->arena)
+ return;
+
+ if ($event->getToGameState() == GameState::LOBBY)
+ {
+ if (!$this->duringLobbyGameState->isEnabled())
+ {
+ $this->duringLobbyGameState->enable();
+ }
+ }
+ elseif ($event->getFromGameState() == GameState::LOBBY)
+ {
+ if ($this->duringLobbyGameState->isEnabled())
+ {
+ $this->duringLobbyGameState->disable();
+ }
+ }
+ }
+
+ public function onGameEnd(ArenaEndEvent $event)
+ {
+ if ($event->getArena() !== $this->arena)
+ return;
+
+ HandlerList::unregisterAll($this);
+ if ($this->duringLobbyGameState->isEnabled())
+ $this->duringLobbyGameState->disable();
+ }
+}
+
+class DuringLobbyGameState extends ListenerFeature
+{
+
+ private $spawn;
+
+ public function __construct(Arena $arena, Level $world)
+ {
+ parent::__construct($arena);
+ $this->spawn = new Position(0, 103, 0, $world);
+ }
+
+ /**
+ * @ignoreCancelled true
+ * @param EntityDamageEvent $event
+ */
+ function onDamage(EntityDamageEvent $event)
+ {
+ if (!in_array($event->getEntity(), $this->getArena()->getPlayers()))
+ return;
+
+ $event->setCancelled();
+ }
+
+ /**
+ * @ignoreCancelled true
+ * @param PlayerDropItemEvent $event
+ */
+ function onDrop(PlayerDropItemEvent $event)
+ {
+ if (!in_array($event->getPlayer(), $this->getArena()->getPlayers()))
+ return;
+
+ $event->setCancelled();
+ }
+
+ /**
+ * @ignoreCancelled true
+ * @param InventoryPickupItemEvent $event
+ */
+ function onPickUp(InventoryPickupItemEvent $event)
+ {
+ if (!in_array($event->getInventory()->getHolder(), $this->getArena()->getPlayers()))
+ return;
+
+ $event->setCancelled();
+ }
+
+ /**
+ * @ignoreCancelled true
+ * @param EntityShootBowEvent $event
+ */
+ function onBowShoot(EntityShootBowEvent $event)
+ {
+ if (!in_array($event->getEntity(), $this->getArena()->getPlayers()))
+ return;
+
+ $event->setCancelled();
+ }
+
+ /**
+ * @ignoreCancelled true
+ * @param ArenaJoinEvent $event
+ */
+ function onJoin(ArenaJoinEvent $event)
+ {
+ if ($this->getArena() !== $event->getArena())
+ return;
+
+ $this->sendToSpawn($event->getPlayer());
+ }
+
+ function sendToSpawn(Player $player)
+ {
+ $player->getInventory()->clearAll();
+ $player->removeAllEffects();
+ $player->setGamemode(Player::ADVENTURE);
+
+ $player->setHealth($player->getMaxHealth());
+ $player->resetFallDistance();
+
+ $pos = $this->spawn->add(rand(-4, 4), 0, rand(-4, 4));
+
+ $player->teleport($pos);
+ }
+
+ function enable()
+ {
+ parent::enable();
+ foreach ($this->getArena()->getPlayers() as $player)
+ {
+ $this->sendToSpawn($player);
+ }
+ }
+}
\ No newline at end of file
diff --git a/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/spawn/SimpleSpawnComponent.php b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/spawn/SimpleSpawnComponent.php
new file mode 100644
index 000000000..d9ab860a0
--- /dev/null
+++ b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/spawn/SimpleSpawnComponent.php
@@ -0,0 +1,110 @@
+arena = $arena;
+ $this->worldComponent = $worldComponent;
+ $this->gameMode = $gameMode;
+
+ Server::getInstance()->getPluginManager()->registerEvents($this, $arena->getPlugin());
+ }
+
+ public function onWorld(WorldLoadSuccessEvent $event)
+ {
+ print "WorldLoadSuccessEvent!";
+ if ($event->getArena() !== $this->arena)
+ return;
+
+ $this->spawns = $this->worldComponent->getTeams()['Green'];
+
+// $this->spawns = UtilArray::getValuesRecursively($this->worldComponent->getTeams());
+//
+// foreach ($this->spawns as $key => $value)
+// {
+// if (!($value instanceof Position))
+// unset($this->spawns[$key]);
+// }
+//
+// print (count($this->spawns) . " spawns Loaded\n");
+
+ }
+
+ /**
+ * @param Player $player
+ * @return Position
+ */
+ function respawn(Player $player)
+ {
+
+ if (count($this->spawns) < 1)
+ {
+ print "no spawns!";
+ return;
+ }
+
+ /*
+ $player->getInventory()->clearAll();
+ $player->removeAllEffects();
+ $player->resetFallDistance();
+ $player->setGamemode($this->gameMode);
+ $player->setHealth($player->getMaxHealth());
+ */
+ $player->sendMessage("Before:");
+ Main::sendLoc($player);
+
+ $pos = $this->spawns[array_rand($this->spawns)];
+ //$pos = $pos->getLevel()->getSpawnLocation();
+
+ print_r($pos);
+
+ $player->teleport($pos);
+
+ $player->sendMessage("After:");
+ Main::sendLoc($player);
+ return $pos;
+ }
+
+ function respawnAll() {
+ foreach ($this->arena->getPlayers() as $player)
+ {
+ $this->respawn($player);
+ }
+ }
+
+ function onEnd(ArenaEndEvent $event)
+ {
+ if ($event->getArena() !== $this->arena)
+ return;
+ HandlerList::unregisterAll($this);
+ }
+}
\ No newline at end of file
diff --git a/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/spawn/SpawnAt.php b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/spawn/SpawnAt.php
new file mode 100644
index 000000000..e0906aa60
--- /dev/null
+++ b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/spawn/SpawnAt.php
@@ -0,0 +1,50 @@
+arena = $arena;
+ $this->spawnComponent = $spawnComponent;
+ $this->gameStates = $gameStates;
+ Server::getInstance()->getPluginManager()->registerEvents($this, $arena->getPlugin());
+ }
+
+ public function onStateChange(GameStateChangeEvent $event)
+ {
+ if ($this->arena !== $event->getArena())
+ return;
+ if (in_array($event->getToGameState(), $this->gameStates)) {
+ $this->spawnComponent->respawnAll();
+ print "called! \n";
+ }
+ }
+
+ public function onEnd(ArenaEndEvent $event)
+ {
+ if ($this->arena !== $event->getArena())
+ return;
+ HandlerList::unregisterAll($this);
+ }
+}
\ No newline at end of file
diff --git a/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/spawn/SpawnComponent.php b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/spawn/SpawnComponent.php
new file mode 100644
index 000000000..145be17e6
--- /dev/null
+++ b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/spawn/SpawnComponent.php
@@ -0,0 +1,24 @@
+arena = $arena;
+ }
+
+ /**
+ * @param Player $player
+ * @return bool
+ */
+ public function enableSpectate(Player $player)
+ {
+ if ($this->isSpectating($player))
+ return false;
+ $event = new EnableSpectateEvent($this->arena, $player);
+
+ Server::getInstance()->getPluginManager()->callEvent($event);
+
+ if ($event->isCancelled())
+ return false;
+
+ $player->getInventory()->clearAll();
+ $player->removeAllEffects();
+
+ $player->setHealth($player->getMaxHealth());
+ $player->resetFallDistance();
+
+ $player->setGamemode(Player::SPECTATOR);
+ array_push($this->spectators, $player);
+ return true;
+ }
+
+ /**
+ * @param Player $player
+ * @return bool
+ */
+ public function disableSpectate(Player $player)
+ {
+ if (!$this->isSpectating($player))
+ return false;
+ $event = new DisableSpectateEvent($this->arena, $player);
+
+ Server::getInstance()->getPluginManager()->callEvent($event);
+
+ if ($event->isCancelled())
+ return false;
+
+ if (($key = array_search($player, $this->spectators, true)) !== FALSE) {
+ unset($this->spectators[$key]);
+ }
+ return true;
+ }
+
+ //Low to keep consistency, so if someone listens ArenaQuitEvent then the player will be in neither the spectator list or the player list.
+ /**
+ * @priority LOW
+ * @param ArenaQuitEvent $event
+ */
+ public function onQuit(ArenaQuitEvent $event)
+ {
+ if ($this->arena !== $event->getArena())
+ return;
+
+ if (($key = array_search($event->getPlayer(), $this->spectators, true)) !== FALSE) {
+ unset($this->spectators[$key]);
+ }
+ }
+
+ /**
+ * @param Player $player
+ * @return bool
+ */
+ public function isSpectating(Player $player)
+ {
+ return in_array($player, $this->getSpectators());
+ }
+
+ /**
+ * @param Player $player
+ * @return bool
+ */
+ public function isNotSpectating(Player $player)
+ {
+ return in_array($player, $this->arena->getPlayers()) && !$this->isSpectating($player);
+ }
+
+ /**
+ * @return Player[]
+ */
+ public function getSpectators()
+ {
+ return $this->spectators;
+ }
+
+ /**
+ * @return Player[]
+ */
+ public function getNonSpectators()
+ {
+ return UtilArray::arrayDiff($this->arena->getPlayers(), $this->getSpectators());
+ }
+}
\ No newline at end of file
diff --git a/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/spectate/SpectateComponent.php b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/spectate/SpectateComponent.php
new file mode 100644
index 000000000..6ce90738e
--- /dev/null
+++ b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/spectate/SpectateComponent.php
@@ -0,0 +1,49 @@
+player = $player;
+ }
+
+ public function getPlayer()
+ {
+ return $this->player;
+ }
+}
\ No newline at end of file
diff --git a/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/spectate/events/EnableSpectateEvent.php b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/spectate/events/EnableSpectateEvent.php
new file mode 100644
index 000000000..9c26c8136
--- /dev/null
+++ b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/spectate/events/EnableSpectateEvent.php
@@ -0,0 +1,32 @@
+player = $player;
+ }
+
+ public function getPlayer()
+ {
+ return $this->player;
+ }
+}
\ No newline at end of file
diff --git a/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/world/AsyncWorldLoader.php b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/world/AsyncWorldLoader.php
new file mode 100644
index 000000000..d5e3849a1
--- /dev/null
+++ b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/world/AsyncWorldLoader.php
@@ -0,0 +1,25 @@
+arena = $arena;
+
+ $this->gameId = $this->getNewGameId();
+
+ Server::getInstance()->getPluginManager()->registerEvents($this, $arena->getPlugin());
+ }
+
+ public function onStart(ArenaStartEvent $event)
+ {
+ if ($this->arena !== $event->getArena())
+ return;
+ $this->loadWorld("Super Smash Mobs");
+ }
+
+ private function unloadWorld()
+ {
+ if (is_null($this->world) || !$this->arena->getPlugin()->getServer()->isLevelLoaded($this->worldNameFolder))
+ return;
+
+ foreach ($this->world->getPlayers() as $player)
+ {
+ $player->kick("Dead World");
+ }
+
+ $this->arena->getPlugin()->getServer()->unloadLevel($this->world);
+
+ UtilFile::deleteDir('worlds/' . $this->worldNameFolder);
+
+ print("Successfully Deleted: " . $this->worldNameFolder . "\n");
+ }
+
+ private function loadWorld($gameName)
+ {
+ $files = scandir('../update/maps/' . $gameName . '/');
+
+ $maps = array();
+
+ foreach ($files as $file)
+ {
+ if (UtilString::endsWith($file, ".zip"))
+ {
+ array_push($maps, $file);
+ }
+ }
+
+ $worldName = $maps[rand(0, count($maps) - 1)];
+
+ //Trim .zip
+ $worldName = substr($worldName, 0, strlen($worldName) - 4);
+
+ print_r($worldName . "\n");
+
+ $this->worldNameFolder = "Game" . $this->gameId . "_" . $gameName . "_" . $worldName;
+
+ //Unzip World
+ $zip = new ZipArchive;
+ $res = $zip->open('../update/maps/' . $gameName . '/' . $worldName . '.zip');
+ if ($res === TRUE)
+ {
+ $zip->extractTo('worlds/' . $this->worldNameFolder . '/');
+ $zip->close();
+ print("Successfully Extracted: " . $this->worldNameFolder . "\n");
+ }
+ else
+ {
+ print("Error Extracting: " . $this->worldNameFolder . "\n");
+
+ Server::getInstance()->getPluginManager()->callEvent(new WorldLoadFailEvent($this->arena));
+
+ return;
+ }
+
+ //Load World
+ if ($this->arena->getPlugin()->getServer()->loadLevel($this->worldNameFolder))
+ {
+ $this->world = $this->arena->getPlugin()->getServer()->getLevelByName($this->worldNameFolder);
+
+ $this->world->setSpawnLocation(new Vector3(0,200,0));
+ $this->world->setTime(6000);
+ $this->loadWorldData();
+
+ $this->ready = true;
+
+ print("Successfully Loaded World: " . $this->worldNameFolder . "\n");
+
+ Server::getInstance()->getPluginManager()->callEvent(new WorldLoadSuccessEvent($this->arena, $this->world));
+ }
+ else
+ {
+ print("Error Loading World: " . $this->worldNameFolder . "\n");
+
+ Server::getInstance()->getPluginManager()->callEvent(new WorldLoadFailEvent($this->arena));
+
+ $this->arena->endGame();
+ }
+ }
+
+ public function loadWorldData()
+ {
+ $handle = fopen('worlds/' . $this->worldNameFolder . '/WorldConfig.dat', "r");
+ if ($handle)
+ {
+ //These store the array that data should be inserted into
+
+ $currentTeamName = null;
+ $currentDataName = null;
+
+ while (($line = fgets($handle)) !== false)
+ {
+ $trimmedLine = trim($line, "\n\r");
+
+ $tokens = explode(":", $trimmedLine);
+
+ if (count($tokens) < 2 || strlen($tokens[0]) == 0)
+ {
+ continue;
+ }
+
+ //Name & Author
+ if (strcmp($tokens[0], "MAP_NAME") === 0)
+ {
+ $this->mapName = $tokens[1];
+ }
+ elseif (strcmp($tokens[0], "MAP_AUTHOR") === 0)
+ {
+ $this->mapAuthor = $tokens[1];
+ }
+
+ //Map Boundaries
+ elseif (strcmp($tokens[0], "MIN_X") === 0 ||
+ strcmp($tokens[0], "MAX_X") === 0 ||
+ strcmp($tokens[0], "MIN_Y") === 0 ||
+ strcmp($tokens[0], "MAX_Y") === 0 ||
+ strcmp($tokens[0], "MIN_Z") === 0 ||
+ strcmp($tokens[0], "MAX_Z") === 0)
+ {
+ $this->mapSettings[$tokens[0]] = $tokens[1];
+ }
+
+ //Team Spawns
+ elseif (strcmp($tokens[0], "TEAM_NAME") === 0)
+ {
+ $currentTeamName = $tokens[1];
+ }
+ elseif (strcmp($tokens[0], "TEAM_SPAWNS") === 0)
+ {
+ $positions = array();
+
+ for ($x=1 ; $xstrToPos($tokens[$x]);
+
+ if (is_null($position))
+ continue;
+
+ $this->posTest = $position;
+
+ array_push($positions, $position);
+ }
+
+ $this->mapTeams[$currentTeamName] = $positions;
+ }
+
+ //Data
+ elseif (strcmp($tokens[0], "DATA_NAME") === 0)
+ {
+ $currentDataName = $tokens[1];
+ }
+ elseif (strcmp($tokens[0], "DATA_LOCS") === 0)
+ {
+ $positions = array();
+
+ for ($x=1 ; $xstrToPos($tokens[$x]);
+
+ if (is_null($position))
+ continue;
+
+ array_push($positions, $position);
+ }
+
+ $this->mapData[$currentDataName] = $positions;
+ }
+ }
+
+ fclose($handle);
+ }
+ else
+ {
+ print("Error Opening File.");
+ }
+ }
+
+ /**
+ * @return Position[][]
+ */
+ public function getTeams()
+ {
+ return $this->mapTeams;
+ }
+
+ /**
+ * @param $key
+ * @return int
+ */
+ public function getSetting($key)
+ {
+ return $this->mapSettings[$key];
+ }
+
+ /**
+ * @param $key
+ * @return Position[]
+ */
+ public function getData($key)
+ {
+ if (UtilArray::hasKey($key, $this->mapData))
+ return $this->mapData[$key];
+
+ return [];
+ }
+
+ protected function strToPos($str)
+ {
+ if (strlen($str) < 5)
+ return null;
+
+ $tokens = explode(",", $str);
+
+ try
+ {
+ return new Position($tokens[0], $tokens[1], $tokens[2], $this->world);
+ }
+ catch (Exception $e)
+ {
+ print("World Data Read Error: Invalid Position String [" . $str . "]\n");
+ }
+
+ return null;
+ }
+
+ //This will return a UID for the game
+ public function getNewGameId()
+ {
+ return rand(0, 999999); //Make this acutally unique
+ }
+
+ public function isWorldReady()
+ {
+ return $this->ready;
+ }
+
+ public function onEnd(ArenaEndEvent $event)
+ {
+ if ($this->arena !== $event->getArena())
+ return;
+ HandlerList::unregisterAll($this);
+ }
+}
+
diff --git a/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/world/event/WorldLoadFailEvent.php b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/world/event/WorldLoadFailEvent.php
new file mode 100644
index 000000000..73cf4137c
--- /dev/null
+++ b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/components/world/event/WorldLoadFailEvent.php
@@ -0,0 +1,17 @@
+level = $level;
+ }
+
+ function getLevel()
+ {
+ return $this->level;
+ }
+
+}
\ No newline at end of file
diff --git a/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/factory/GameFactory.php b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/factory/GameFactory.php
new file mode 100644
index 000000000..257f404e8
--- /dev/null
+++ b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/factory/GameFactory.php
@@ -0,0 +1,18 @@
+ array($noBlockBreak),
+ GameState::PRE_GAME => array($noBlockBreak),
+ GameState::GAME => array($noBlockBreak),
+ GameState::POST_GAME => array($noBlockBreak)
+ );
+
+ new GameStateFeatureManager($arena, $features);
+
+ new GameStateCountdown($arena, $gameStateComponent, 20, GameState::LOBBY, GameState::PRE_GAME);
+
+ new GameStateCountdown($arena, $gameStateComponent, 10, GameState::PRE_GAME, GameState::GAME);
+
+ new GameStateCountdown($arena, $gameStateComponent, 30, GameState::GAME, GameState::POST_GAME);
+
+ new GameStateCountdown($arena, $gameStateComponent, 10, GameState::POST_GAME, GameState::RESTARTING);
+ }
+
+}
\ No newline at end of file
diff --git a/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/games/pvp/PvpComponent.php b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/games/pvp/PvpComponent.php
new file mode 100644
index 000000000..9f86dee71
--- /dev/null
+++ b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/games/pvp/PvpComponent.php
@@ -0,0 +1,89 @@
+getPluginManager()->registerEvents($this, $arena->getPlugin());
+ $this->arena = $arena;
+ }
+
+ public function onJoin(ArenaJoinEvent $event)
+ {
+
+ if ($event->getArena() !== $this->arena)
+ return;
+ $event->getPlayer()->sendMessage("Welcome to the arena");
+
+
+ $players = $this->arena->getPlayers();
+
+ array_push($players, $event->getPlayer());
+ Server::getInstance()->broadcastMessage("JoinCount: ".(string)count($players));
+ if (count($this->arena->getPlayers()) >= 2)
+ {
+ foreach ($this->arena->getPlayers() as $player)
+ {
+ $player->sendPopup("Game started! Try to kill everyone else.");
+ }
+ }
+ }
+
+ public function onDeath(PlayerDeathEvent $event)
+ {
+ if (in_array($event->getEntity(), $this->arena->getPlayers()))
+ $event->getEntity()->kick('You done got yourself keeled!');
+
+ }
+
+ public function onQuit(ArenaQuitEvent $event)
+ {
+ if ($event->getArena() !== $this->arena)
+ return;
+
+ Server::getInstance()->broadcastMessage(" has quit.");
+ $this->checkEnd();
+ }
+
+ public function onEnd(ArenaEndEvent $event)
+ {
+ if ($event->getArena() !== $this->arena)
+ return;
+ Server::getInstance()->broadcastMessage("Unregistered!");
+ HandlerList::unregisterAll($this);
+ }
+
+ public function checkEnd()
+ {
+ Server::getInstance()->broadcastMessage("Count: ".(string)(count($this->arena->getPlayers()) <= 1) ? 'true' : 'false');
+
+ if (count($this->arena->getPlayers()) <= 1)
+ {
+ Server::getInstance()->broadcastMessage('game ending...');
+ $this->arena->endGame();
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/games/sg/SurvivalGames.php b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/games/sg/SurvivalGames.php
new file mode 100644
index 000000000..77ed45aa2
--- /dev/null
+++ b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/game/games/sg/SurvivalGames.php
@@ -0,0 +1,75 @@
+arena = $arena;
+
+ $gameStateComponent = new GameStateComponent($arena);
+
+ //$spectateComponent = new GameModeSpectateComponent($arena);
+
+ //Init features
+ //$noPickUpItem = new NoPickUpItem($arena, [Item::GRASS], true);
+
+ //$pack = array(new NoBlockBreak($arena, [Item::GRASS]), new NoBlockPlace($arena, [Item::WOOD], true),new NoDropItem($arena, [Item::APPLE], true));
+
+ /** @var Feature[][] $features */
+ //$features = array(
+ // GameState::LOBBY => array($noPickUpItem, $pack)
+ //);
+
+ //new GameStateFeatureManager($arena, $features);
+
+ //new LobbyComponent($arena);
+
+ $worldComponent = new WorldComponent($arena);
+
+ $spawnComponent = new SimpleSpawnComponent($arena, $worldComponent);
+
+ new SpawnAt($arena, $spawnComponent, [GameState::PRE_GAME]);
+
+ new LobbyCountdown($arena, $gameStateComponent, $worldComponent, GameState::LOBBY, GameState::PRE_GAME, 10, 1);
+
+ //new GameStateCountdown($arena, $gameStateComponent, 10, GameState::PRE_GAME, GameState::GAME);
+
+ //new GameStateCountdown($arena, $gameStateComponent, 20, GameState::GAME, GameState::POST_GAME);
+
+ //new GameStateCountdown($arena, $gameStateComponent, 10, GameState::POST_GAME, GameState::RESTARTING);
+
+ }
+}
\ No newline at end of file
diff --git a/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/time/BenchSchedule.php b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/time/BenchSchedule.php
new file mode 100644
index 000000000..16aaa19e7
--- /dev/null
+++ b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/time/BenchSchedule.php
@@ -0,0 +1,215 @@
+getScheduler()->scheduleRepeatingTask($this, 1);
+ }
+
+ public function onRun($currentTick)
+ {
+ $currentTime = round(microtime(true) * 1000);
+
+ foreach ($this->tasks as $key => $task) {
+
+ if (!($currentTime >= $task->getNextRun()))
+ continue;
+
+ $task->getTaskData()->getTask()->run($task->getTaskData());
+
+ if ($task->getTaskData()->getNextRun() !== null)
+ {
+ $task->setNextRun($task->getTaskData()->getNextRun());
+ $task->getTaskData()->setNextRun(null);
+ } elseif ($task->getTaskData()->getPeriod() == null or $task->getTaskData()->getPeriod() < 0) {
+ unset($this->tasks[$key]);
+ } else {
+ $task->setNextRun($currentTime + $task->getTaskData()->getPeriod());
+ }
+ }
+ }
+
+
+ /**
+ * @param BenchTask $taskToCancel
+ * @return bool
+ */
+ public static function cancelTask(BenchTask $taskToCancel)
+ {
+ $deleted = false;
+ foreach (self::getInstance()->tasks as $key => $task)
+ {
+ if ($task->getTaskData()->getTask() === $taskToCancel)
+ {
+ unset (self::getInstance()->tasks[$key]);
+ $deleted = true;
+ }
+ }
+ return $deleted;
+ }
+
+ /**
+ * @param BenchTask $taskToCancel
+ * @param $id
+ * @return bool
+ */
+ public static function cancelTaskWithId(BenchTask $taskToCancel, $id)
+ {
+ $deleted = false;
+ foreach (self::getInstance()->tasks as $key => $task)
+ {
+ if ($task->getTaskData()->getTask() === $taskToCancel && $task->getTaskData()->getId() === $id)
+ {
+ unset (self::getInstance()->tasks[$key]);
+ $deleted = true;
+ }
+ }
+ return $deleted;
+ }
+
+ /**
+ * @param BenchTask $taskToCancel
+ * @return bool
+ */
+ public static function isRunning(BenchTask $taskToCancel)
+ {
+ foreach (self::getInstance()->tasks as $key => $task)
+ {
+ if ($task->getTaskData()->getTask() === $taskToCancel)
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * @param BenchTask $taskToCancel
+ * @param $id
+ * @return bool
+ */
+ public static function isRunningWithId(BenchTask $taskToCancel, $id)
+ {
+ foreach (self::getInstance()->tasks as $key => $task)
+ {
+ if ($task->getTaskData()->getTask() === $taskToCancel && $task->getTaskData()->getId() === $id)
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * @param BenchTask $task
+ * @param int $wait
+ * @param int $period
+ * @param $id
+ */
+ public static function runTaskTimerWithId(BenchTask $task, $wait, $period, $id)
+ {
+ $taskData = new BenchTaskData($task, $period, $id);
+ $actualTask = new ActualBenchTask($taskData, round(microtime(true) * 1000) + $wait);
+ array_push(self::getInstance()->tasks, $actualTask);
+ }
+
+ /**
+ * @param BenchTask $task
+ * @param int $wait
+ * @param int $period
+ */
+ public static function runTaskTimer(BenchTask $task, $wait, $period)
+ {
+ self::runTaskTimerWithId($task, $wait, $period, null);
+ }
+
+ /**
+ * @param BenchTask $task
+ * @param int $wait
+ * @param $id
+ */
+ public static function runTaskLaterWithId(BenchTask $task, $wait, $id)
+ {
+ self::runTaskTimerWithId($task, $wait, null, $id);
+ }
+
+ /**
+ * @param BenchTask $task
+ * @param int $wait
+ */
+ public static function runTaskLater(BenchTask $task, $wait)
+ {
+ self::runTaskTimerWithId($task, $wait, null, null);
+ }
+
+}
+
+class ActualBenchTask
+{
+ /** @var int */
+ private $nextRun;
+
+ /** @var BenchTaskData */
+ private $benchTaskData;
+
+ public function __construct(BenchTaskData $benchTaskData, $nextRun)
+ {
+ $this->benchTaskData = $benchTaskData;
+ $this->runNext = $nextRun;
+ }
+
+ /**
+ * @return int
+ */
+ function getNextRun()
+ {
+ return $this->nextRun;
+ }
+
+ /**
+ * @param $nextRun
+ */
+ function setNextRun($nextRun)
+ {
+ $this->nextRun = $nextRun;
+ }
+
+ /**
+ * @return BenchTaskData
+ */
+ function getTaskData()
+ {
+ return $this->benchTaskData;
+ }
+
+}
diff --git a/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/time/BenchTask.php b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/time/BenchTask.php
new file mode 100644
index 000000000..98b45f4c6
--- /dev/null
+++ b/Pocket/plugins/Mineplex/src/mineplex/plugin/gameengine/time/BenchTask.php
@@ -0,0 +1,17 @@
+task = $task;
+ $this->period = $period;
+ $this->id = $id;
+ }
+
+ /**
+ * @param int $period
+ */
+ public function setPeriod($period)
+ {
+ $this->period = $period;
+ }
+
+ /**
+ * @param int $nextRun
+ */
+ public function setNextRun($nextRun)
+ {
+ $this->nextRun = $nextRun;
+ }
+
+ /**
+ * @return int
+ */
+ public function getNextRun()
+ {
+ return $this->nextRun;
+ }
+
+ /**
+ * @return BenchTask
+ */
+ public function getTask()
+ {
+ return $this->task;
+ }
+
+ /**
+ * @return int
+ */
+ public function getPeriod()
+ {
+ return $this->period;
+ }
+
+ /**
+ * @return mixed
+ */
+ public function getId()
+ {
+ return $this->id;
+ }
+
+
+ public function end()
+ {
+ $this->period = null;
+ }
+}
\ No newline at end of file
diff --git a/Pocket/plugins/Mineplex/src/mineplex/plugin/tasks/TickTask.php b/Pocket/plugins/Mineplex/src/mineplex/plugin/tasks/TickTask.php
deleted file mode 100644
index 39905d1f5..000000000
--- a/Pocket/plugins/Mineplex/src/mineplex/plugin/tasks/TickTask.php
+++ /dev/null
@@ -1,23 +0,0 @@
-plugin = $host;
- $this->owner = $host;
- }
-
- public function onRun($currentTick)
- {
- $this->plugin->getServer()->getPluginManager()->callEvent(new TickEvent($currentTick));
- }
-}
\ No newline at end of file
diff --git a/Pocket/plugins/Mineplex/src/mineplex/plugin/util/UtilArray.php b/Pocket/plugins/Mineplex/src/mineplex/plugin/util/UtilArray.php
new file mode 100644
index 000000000..f630a6f37
--- /dev/null
+++ b/Pocket/plugins/Mineplex/src/mineplex/plugin/util/UtilArray.php
@@ -0,0 +1,54 @@
+$b)?1:-1;
+ }
+
+ public static function getValuesRecursively($object)
+ {
+ if (!is_array($object))
+ return [$object];
+
+ $returnArray = [];
+ foreach ($object as $value)
+ {
+ if (is_array($value))
+ {
+ $returnArray = array_merge($returnArray, array_values(self::getValuesRecursively($value)));
+ }
+ else
+ {
+ array_push($returnArray, $value);
+ }
+ }
+ return $returnArray;
+ }
+
+}
\ No newline at end of file
diff --git a/Pocket/plugins/Mineplex/src/mineplex/plugin/util/UtilFile.php b/Pocket/plugins/Mineplex/src/mineplex/plugin/util/UtilFile.php
new file mode 100644
index 000000000..c0c4b9909
--- /dev/null
+++ b/Pocket/plugins/Mineplex/src/mineplex/plugin/util/UtilFile.php
@@ -0,0 +1,31 @@
+