Merge remote-tracking branch 'origin/master'

This commit is contained in:
Ben Sihota 2015-07-07 21:19:43 -07:00
commit ca880371a6
32 changed files with 1062 additions and 281 deletions

View File

@ -498,7 +498,11 @@ public abstract class Game implements Listener
UtilServer.getServer().getPluginManager().registerEvents(kit, Manager.getPlugin());
for (Perk perk : kit.GetPerks())
UtilServer.getServer().getPluginManager().registerEvents(perk, Manager.getPlugin());
{
UtilServer.getServer().getPluginManager()
.registerEvents(perk, Manager.getPlugin());
perk.registeredEvents();
}
}
}

View File

@ -54,4 +54,9 @@ public abstract class Perk implements Listener
{
//Null Default
}
public void registeredEvents()
{
// When listener has been registered
}
}

View File

@ -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)

View File

@ -1,28 +0,0 @@
MAP_NAME:Cookie Town
MAP_AUTHOR:Mineplex Build Team
MIN_X:-123
MAX_X:58
MIN_Z:-74
MAX_Z:91
MIN_Y:0
MAX_Y:26
TEAM_NAME:Blue
TEAM_SPAWNS:-2,4,-1:-2,4,0:-2,4,1:-2,4,2:-2,4,3:-2,4,4:-2,4,5:-2,4,6:-1,4,-1:-1,4,0:-1,4,1:-1,4,2:-1,4,3:-1,4,4:-1,4,5:-1,4,6:0,4,-1:0,4,0:0,4,1:0,4,2:0,4,3:0,4,4:0,4,5:0,4,6:1,4,-1:1,4,0:1,4,1:1,4,2:1,4,3:1,4,4:1,4,5:1,4,6:2,4,-1:2,4,0:2,4,1:2,4,2:2,4,3:2,4,4:2,4,5:2,4,6:3,4,-1:3,4,0:3,4,1:3,4,2:3,4,3:3,4,4:3,4,5:3,4,6:4,4,-1:4,4,0:4,4,1:4,4,2:4,4,3:4,4,4:4,4,5:4,4,6:5,4,-1:5,4,0:5,4,1:5,4,2:5,4,3:5,4,4:5,4,5:5,4,6:
TEAM_NAME:Red
TEAM_SPAWNS:-94,2,-10:-94,2,-9:-94,2,-8:-94,2,-7:-94,2,-6:-94,2,-5:-94,2,-4:-94,2,-3:-94,2,-2:-93,2,-10:-93,2,-9:-93,2,-8:-93,2,-7:-93,2,-6:-93,2,-5:-93,2,-4:-93,2,-3:-93,2,-2:-92,2,-10:-92,2,-9:-92,2,-8:-92,2,-7:-92,2,-6:-92,2,-5:-92,2,-4:-92,2,-3:-92,2,-2:
DATA_NAME:YELLOW
DATA_LOCS:-39,4,7:-39,4,8:-38,4,7:-38,4,8:-33,4,3:-33,4,4:-32,4,2:-32,4,3:-32,4,4:-14,4,-25:-13,4,-26:-13,4,-25:-12,4,-26:-12,4,-25:-11,4,-26:-11,4,-25:-10,4,-25:-8,4,55:-8,4,56:-8,4,57:-7,4,55:-7,4,56:-7,4,57:-7,4,58:-6,4,55:-6,4,56:-6,4,57:-6,4,58:-5,4,69:-5,4,70:-4,4,69:-4,4,70:-2,4,14:-2,4,15:-2,4,16:-1,4,14:-1,4,15:-1,4,16:0,4,14:0,4,15:0,4,16:6,4,-31:7,4,-31:8,4,-31:38,4,35:38,4,36:38,4,37:39,4,35:39,4,36:39,4,37:
DATA_NAME:BLACK
DATA_LOCS:-94,4,-1:-94,4,0:-94,4,1:-93,4,-1:-93,4,0:-93,4,1:-92,4,-1:-92,4,0:-92,4,1:
DATA_NAME:PINK
DATA_LOCS:-37,4,7:-37,4,8:-36,4,-16:-36,4,-15:-36,4,-14:-36,4,7:-36,4,8:-35,4,-16:-35,4,-15:-35,4,-14:-34,4,-16:-34,4,-15:-34,4,-14:-3,4,81:-3,4,82:-2,4,80:-2,4,81:-2,4,82:-2,4,83:-1,4,80:-1,4,81:-1,4,82:-1,4,83:0,4,43:1,4,43:2,4,43:3,4,43:3,4,47:3,4,48:4,4,43:4,4,47:4,4,48:6,4,-32:7,4,-32:7,4,-7:7,4,-6:8,4,-32:8,4,-7:8,4,-6:9,4,-8:9,4,-7:11,4,69:11,4,70:11,4,71:12,4,69:12,4,71:13,4,70:29,4,42:29,4,43:29,4,44:30,4,42:30,4,43:30,4,44:31,4,42:31,4,43:31,4,44:
DATA_NAME:RED
DATA_LOCS:-96,5,4:-93,5,5:-90,5,4:

View File

@ -7,17 +7,9 @@
*/
function myfunction($a,$b)
{
if ($a===$b)
{
return 0;
}
return ($a>$b)?1:-1;
}
$a1 = array();
$a2 = array($a1);
$a1=array(new stdClass(),"b"=>"green","c"=>"blue");
$a2=array("a"=>"blue","b"=>"black","e"=>"blue");
array_push($a1, $a2);
$result=array_udiff($a1,$a2,"myfunction");
print_r($result);
print_r($a1);

View File

@ -6,12 +6,18 @@ use mineplex\plugin\gameengine\arenas\MultiGameArena;
use mineplex\plugin\gameengine\game\components\world\WorldComponent;
use mineplex\plugin\gameengine\game\factory\TestGameFactory;
use mineplex\plugin\core\updater\Updater;
use mineplex\plugin\util\UtilFile;
use mineplex\plugin\util\UtilString;
use pocketmine\block\Block;
use pocketmine\event\Listener;
use pocketmine\event\player\PlayerCommandPreprocessEvent;
use pocketmine\event\player\PlayerDeathEvent;
use pocketmine\event\player\PlayerInteractEvent;
use pocketmine\event\player\PlayerJoinEvent;
use pocketmine\event\player\PlayerLoginEvent;
use pocketmine\level\Position;
use pocketmine\math\Vector3;
use pocketmine\Player;
use pocketmine\plugin\PluginBase;
use mineplex\plugin\gameengine\arenas\Arena;
use pocketmine\Server;
@ -30,10 +36,14 @@ class Main extends PluginBase implements Listener
//$this->test = new WorldComponent($this->arena);
new Updater($this);
$this->arena->getPlugin()->getServer()->getLevelByName("world")->setSpawnLocation(new Vector3(0, 200, 0));
}
public function onLogin(PlayerLoginEvent $event)
{
UtilFile::deleteDir('players/' . $event->getPlayer()->getName() . '.dat');
if ($this->arena->canJoin($event->getPlayer()))
return;
@ -41,13 +51,34 @@ class Main extends PluginBase implements Listener
$event->setCancelled();
}
public function onDeath(PlayerDeathEvent $event)
{
$event->getEntity()->setHealth($event->getEntity()->getMaxHealth());
}
public function onJoin(PlayerJoinEvent $event)
{
$this->arena->addPlayer($event->getPlayer());
}
public function punch(PlayerInteractEvent $event)
{
if ($event->getAction() == PlayerInteractEvent::LEFT_CLICK_BLOCK || $event->getAction() == PlayerInteractEvent::RIGHT_CLICK_BLOCK)
{
$event->getPlayer()->sendMessage("Block: " . $event->getBlock()->getId() . ":" . $event->getBlock()->getDamage());
}
}
public function command(PlayerCommandPreprocessEvent $event)
{
if (UtilString::startsWith($event->getMessage(), "/pos"))
self::sendLoc($event->getPlayer());
}
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());
}
}

View File

@ -0,0 +1,38 @@
<?php
/**
* Created by PhpStorm.
* User: Exerosis
* Date: 7/6/2015
* Time: 6:12 PM
*/
namespace mineplex\plugin\core\commen;
use mineplex\plugin\util\UtilArray;
class ItemContainer {
/** @var int[] */
private $ids = [];
/** @var bool */
private $black;
/**
* @param int[] $ids
* @param bool $black
*/
public function __construct(array $ids = null, $black = false)
{
if ($ids != null)
{
$this->ids = array_flip($ids);
}
$this->black = $black;
}
public function hasItem($id)
{
return ($this->black == UtilArray::hasKey($id, $this->ids));
}
}

View File

@ -25,6 +25,12 @@ interface Arena
*/
public function getPlayers();
/**
* @param mixed $player
* @return bool
*/
public function hasPlayer($player);
/**
* @return Plugin
*/

View File

@ -83,12 +83,22 @@ class MultiGameArena implements Arena, Listener
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;

View File

@ -48,7 +48,7 @@ class LobbyCountdown implements Listener, BenchTask {
const COUNTDOWN_ID = "count";
public function __construct(Arena $arena, GameStateComponent $gameStateComponent, WorldComponent $worldComponent, $startGameState, $setGameState, $count, $minPlayers = 1)
public function __construct(Arena $arena, GameStateComponent $gameStateComponent, WorldComponent $worldComponent, $startGameState, $setGameState, $count, $minPlayers = 2)
{
$this->arena = $arena;
$this->gameStateComponent = $gameStateComponent;

View File

@ -12,9 +12,11 @@ namespace mineplex\plugin\gameengine\game\components\feature;
interface Feature {
public function enable();
public function disable();
/**
* @return boolean
*/
public function isEnabled();
}

View File

@ -0,0 +1,57 @@
<?php
/**
* Created by PhpStorm.
* User: Exerosis
* Date: 7/6/2015
* Time: 1:03 PM
*/
namespace mineplex\plugin\gameengine\game\components\feature;
use mineplex\plugin\gameengine\arenas\Arena;
use pocketmine\event\HandlerList;
use pocketmine\event\Listener;
use pocketmine\plugin\Plugin;
use pocketmine\Server;
class ListenerFeature implements Feature, Listener {
/** @var bool */
private $enabled = false;
private $arena;
function __construct(Arena $arena)
{
$this->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;
}
}

View File

@ -0,0 +1,24 @@
<?php
/**
* Created by PhpStorm.
* User: Exerosis
* Date: 7/6/2015
* Time: 12:55 PM
*/
namespace mineplex\plugin\gameengine\game\components\feature;
class UtilFeature {
public static function enable(Feature $feature)
{
if (!$feature->isEnabled())
$feature->enable();
}
public static function disable(Feature $feature)
{
if ($feature->isEnabled())
$feature->disable();
}
}

View File

@ -0,0 +1,41 @@
<?php
/**
* Created by PhpStorm.
* User: Exerosis
* Date: 7/6/2015
* Time: 2:38 AM
*/
namespace mineplex\plugin\gameengine\game\components\feature\features;
use mineplex\plugin\gameengine\arenas\Arena;
use mineplex\plugin\gameengine\game\components\feature\ListenerFeature;
use mineplex\plugin\gameengine\game\components\spectate\SpectateComponent;
use pocketmine\event\player\PlayerDeathEvent;
class DeathSpectate extends ListenerFeature {
private $spectateComponent;
function __construct(Arena $arena, SpectateComponent $spectateComponent)
{
parent::__construct($arena);
$this->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!');
}
}
}

View File

@ -8,26 +8,14 @@
namespace mineplex\plugin\gameengine\game\components\feature\features;
use mineplex\plugin\core\commen\ItemContainer;
use mineplex\plugin\gameengine\arenas\Arena;
use mineplex\plugin\gameengine\game\components\feature\Feature;
use mineplex\plugin\gameengine\game\components\feature\ListenerFeature;
use pocketmine\event\block\BlockBreakEvent;
use pocketmine\event\HandlerList;
use pocketmine\event\Listener;
use pocketmine\Server;
class NoBlockBreak implements Feature, Listener {
class NoBlockBreak extends ListenerFeature {
/** @var Arena */
private $arena;
/** @var int[] */
private $ids = [];
/** @var bool */
private $black;
/** @var bool */
private $enabled = false;
private $itemContainer;
/**
* @param Arena $arena
@ -36,47 +24,20 @@ class NoBlockBreak implements Feature, Listener {
*/
public function __construct(Arena $arena, array $ids = null, $black = false)
{
if ($ids != null) {
$this->ids = array_flip($ids);
foreach ($this->ids as $key => $value)
{
print "Key:" . $key;
}
}
print "\n" . "Black: " . (($black) ? 'true' : 'false') . "\n";
$this->black = $black;
print "\n" . "SetBlackList: " . (($this->black) ? 'true' : 'false') . "\n";
$this->arena = $arena;
parent::__construct($arena, $ids, $black);
$this->itemContainer = new ItemContainer($ids, $black);
}
/**
* @ignoreCancelled true
* @param BlockBreakEvent $event
*/
public function onBlockBreak(BlockBreakEvent $event)
{
if (!in_array($event->getPlayer(), $this->arena->getPlayers()))
if (!$this->getArena()->hasPlayer($event->getPlayer()))
return;
if ($this->black == (isset($this->ids[$event->getBlock()->getId()]) || array_key_exists($event->getBlock()->getId(), $this->ids)))
if ($this->itemContainer->hasItem($event->getBlock()->getId()))
$event->setCancelled();
}
public function enable()
{
Server::getInstance()->broadcastMessage("Enabled!");
$this->enabled = true;
Server::getInstance()->getPluginManager()->registerEvents($this, $this->arena->getPlugin());
}
public function disable()
{
Server::getInstance()->broadcastMessage("Disabled!");
$this->enabled = false;
HandlerList::unregisterAll($this);
}
public function isEnabled()
{
return $this->enabled;
}
}

View File

@ -0,0 +1,43 @@
<?php
/**
* Created by PhpStorm.
* User: TheMineBench
* Date: 7/1/2015
* Time: 10:20 PM
*/
namespace mineplex\plugin\gameengine\game\components\feature\features;
use mineplex\plugin\core\commen\ItemContainer;
use mineplex\plugin\gameengine\arenas\Arena;
use mineplex\plugin\gameengine\game\components\feature\ListenerFeature;
use pocketmine\event\block\BlockPlaceEvent;
class NoBlockPlace extends ListenerFeature {
private $itemContainer;
/**
* @param Arena $arena
* @param int[] $ids
* @param bool $black
*/
public function __construct(Arena $arena, array $ids = null, $black = false)
{
parent::__construct($arena, $ids, $black);
$this->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();
}
}

View File

@ -0,0 +1,42 @@
<?php
/**
* Created by PhpStorm.
* User: TheMineBench
* Date: 7/1/2015
* Time: 10:20 PM
*/
namespace mineplex\plugin\gameengine\game\components\feature\features;
use mineplex\plugin\gameengine\arenas\Arena;
use mineplex\plugin\gameengine\game\components\feature\ListenerFeature;
use mineplex\plugin\core\commen\ItemContainer;use pocketmine\event\player\PlayerDropItemEvent;
class NoDropItem extends ListenerFeature {
private $itemContainer;
/**
* @param Arena $arena
* @param int[] $ids
* @param bool $black
*/
public function __construct(Arena $arena, array $ids = null, $black = false)
{
parent::__construct($arena, $ids, $black);
$this->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();
}
}

View File

@ -9,55 +9,27 @@
namespace mineplex\plugin\gameengine\game\components\feature\features;
use mineplex\plugin\gameengine\arenas\Arena;
use mineplex\plugin\gameengine\game\components\feature\Feature;
use pocketmine\entity\Effect;
use pocketmine\event\block\BlockBreakEvent;
use pocketmine\event\HandlerList;
use pocketmine\event\Listener;
use pocketmine\Player;
use pocketmine\Server;
class NoMovement implements Feature, Listener {
private $arena;
private $enabled = false;
use mineplex\plugin\gameengine\game\components\feature\ListenerFeature;
use pocketmine\event\player\PlayerMoveEvent;
class NoMovement extends ListenerFeature {
public function __construct(Arena $arena)
{
$this->arena = $arena;
parent::__construct($arena);
}
public function onBlockBreak(BlockBreakEvent $event)
/**
* @ignoreCancelled true
* @param PlayerMoveEvent $event
*/
public function onMove(PlayerMoveEvent $event)
{
if (!in_array($event->getPlayer(), $this->arena->getPlayers()))
if (!$this->getArena()->hasPlayer($event->getPlayer()))
return;
$event->setCancelled(true);
if (($event->getFrom()->getX() == $event->getTo()->getX()) && ($event->getFrom()->getY() == $event->getTo()->getY()) && ($event->getFrom()->getZ() == $event->getTo()->getZ()))
return;
$event->setCancelled();
}
public function enable()
{
$this->enabled = true;
Server::getInstance()->getPluginManager()->registerEvents($this, $this->arena->getPlugin());
}
public function disable()
{
Server::getInstance()->broadcastMessage("Disabled!");
$this->enabled = false;
HandlerList::unregisterAll($this);
}
public function isEnabled()
{
return $this->enabled;
}
}

View File

@ -0,0 +1,56 @@
<?php
/**
* Created by PhpStorm.
* User: TheMineBench
* Date: 7/1/2015
* Time: 10:20 PM
*/
namespace mineplex\plugin\gameengine\game\components\feature\features;
use mineplex\plugin\gameengine\arenas\Arena;
use mineplex\plugin\gameengine\game\components\feature\ListenerFeature;
use mineplex\plugin\core\commen\ItemContainer;
use pocketmine\event\inventory\InventoryPickupItemEvent;
use pocketmine\item\Item;
use pocketmine\Server;
class NoPickUpItem extends ListenerFeature {
private $itemContainer;
/**
* @param Arena $arena
* @param int[] $ids
* @param bool $black
*/
public function __construct(Arena $arena, array $ids = null, $black = false)
{
parent::__construct($arena, $ids, $black);
$this->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!");
}
}

View File

@ -6,29 +6,31 @@
* Time: 12:44 AM
*/
namespace mineplex\plugin\gameengine\game\components\feature;
namespace mineplex\plugin\gameengine\game\components\feature\managers;
use mineplex\plugin\gameengine\arenas\Arena;
use mineplex\plugin\gameengine\arenas\events\ArenaEndEvent;
use mineplex\plugin\gameengine\game\components\gamestate\events\GameStateChangeEvent;
use mineplex\plugin\gameengine\game\components\gamestate\GameState;
use mineplex\plugin\util\UtilArray;
use pocketmine\event\HandlerList;
use pocketmine\event\Listener;
use pocketmine\Server;
use RecursiveArrayIterator;
use RecursiveIteratorIterator;
use mineplex\plugin\gameengine\game\components\feature\Feature;
class GameStateFeatureManager implements Listener {
private $arena;
/** @var feature[][] */
private $features;
/** @var Feature[][] */
private $features = [];
/**
* @param Arena $arena
* @param feature[][] $features
* @param Feature[] $features
*/
public function __construct(Arena $arena, array $features)
{
@ -36,7 +38,10 @@ class GameStateFeatureManager implements Listener {
unset ($features[GameState::RESTARTING]);
$this->features = $features;
foreach ($features as $key => $value)
{
$this->features[$key] = UtilArray::getValuesRecursively($value);
}
Server::getInstance()->getPluginManager()->registerEvents($this, $arena->getPlugin());
}
@ -62,10 +67,10 @@ class GameStateFeatureManager implements Listener {
$theseFeatures = [];
/** @var Feature[] $toEnable */
$toEnable = array_udiff($theseFeatures, $lastFeatures, array($this, 'comp'));
$toEnable = UtilArray::arrayDiff($theseFeatures, $lastFeatures);
/** @var Feature[] $toDisable */
$toDisable = array_udiff($lastFeatures, $theseFeatures, array($this, 'comp'));
$toDisable = UtilArray::arrayDiff($lastFeatures, $theseFeatures);
foreach ($toDisable as $feature) {
if ($feature->isEnabled())
@ -82,7 +87,6 @@ class GameStateFeatureManager implements Listener {
if ($event->getArena() !== $this->arena)
return;
$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($this->features));
foreach ($iterator as $feature) {
@ -93,47 +97,6 @@ class GameStateFeatureManager implements Listener {
HandlerList::unregisterAll($this);
}
function comp($a,$b)
{
if ($a===$b)
{
return 0;
}
return ($a>$b)?1:-1;
}
}

View File

@ -8,11 +8,10 @@
namespace mineplex\plugin\gameengine\game\components\lobby;
use mineplex\plugin\gameengine\arenas\Arena;
use mineplex\plugin\gameengine\arenas\events\ArenaEndEvent;
use mineplex\plugin\gameengine\arenas\events\ArenaJoinEvent;
use mineplex\plugin\gameengine\game\components\feature\Feature;
use mineplex\plugin\gameengine\game\components\feature\ListenerFeature;
use mineplex\plugin\gameengine\game\components\gamestate\events\GameStateChangeEvent;
use mineplex\plugin\gameengine\game\components\gamestate\GameState;
use pocketmine\event\block\BlockBreakEvent;
@ -30,7 +29,6 @@ use pocketmine\Server;
class LobbyComponent implements Listener
{
/** @var Arena */
private $arena;
@ -66,22 +64,29 @@ class LobbyComponent implements Listener
$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()) {
if ($event->getToGameState() == GameState::LOBBY)
{
if (!$this->duringLobbyGameState->isEnabled())
{
$this->duringLobbyGameState->enable();
}
} elseif ($event->getFromGameState() == GameState::LOBBY) {
if ($this->duringLobbyGameState->isEnabled()) {
}
elseif ($event->getFromGameState() == GameState::LOBBY)
{
if ($this->duringLobbyGameState->isEnabled())
{
$this->duringLobbyGameState->disable();
}
}
}
public function onGameEnd(ArenaEndEvent $event)
@ -95,57 +100,72 @@ class LobbyComponent implements Listener
}
}
class DuringLobbyGameState implements Feature, Listener
class DuringLobbyGameState extends ListenerFeature
{
private $arena;
private $spawn;
/** @var bool */
private $enabled = false;
public function __construct(Arena $arena, Level $world)
{
$this->arena = $arena;
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->arena->getPlayers()))
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->arena->getPlayers()))
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->arena->getPlayers()))
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->arena->getPlayers()))
if (!in_array($event->getEntity(), $this->getArena()->getPlayers()))
return;
$event->setCancelled();
}
/**
* @ignoreCancelled true
* @param ArenaJoinEvent $event
*/
function onJoin(ArenaJoinEvent $event)
{
if ($this->arena !== $event->getArena())
if ($this->getArena() !== $event->getArena())
return;
$this->sendToSpawn($event->getPlayer());
@ -155,6 +175,7 @@ class DuringLobbyGameState implements Feature, Listener
{
$player->getInventory()->clearAll();
$player->removeAllEffects();
$player->setGamemode(Player::ADVENTURE);
$player->setHealth($player->getMaxHealth());
$player->resetFallDistance();
@ -164,24 +185,12 @@ class DuringLobbyGameState implements Feature, Listener
$player->teleport($pos);
}
function isEnabled()
{
return $this->enabled;
}
function enable()
{
foreach ($this->arena->getPlayers() as $player) {
parent::enable();
foreach ($this->getArena()->getPlayers() as $player)
{
$this->sendToSpawn($player);
}
$this->enabled = true;
Server::getInstance()->getPluginManager()->registerEvents($this, $this->arena->getPlugin());
}
function disable()
{
$this->enabled = false;
HandlerList::unregisterAll($this);
}
}

View File

@ -0,0 +1,110 @@
<?php
/**
* Created by PhpStorm.
* User: Exerosis
* Date: 7/6/2015
* Time: 10:32 PM
*/
namespace mineplex\plugin\gameengine\game\components\spawn;
use mineplex\plugin\gameengine\arenas\Arena;
use mineplex\plugin\gameengine\arenas\events\ArenaEndEvent;
use mineplex\plugin\gameengine\game\components\world\event\WorldLoadSuccessEvent;
use mineplex\plugin\gameengine\game\components\world\WorldComponent;
use mineplex\plugin\Main;
use mineplex\plugin\util\UtilArray;
use pocketmine\event\HandlerList;
use pocketmine\event\Listener;
use pocketmine\level\Position;
use pocketmine\Player;
use pocketmine\Server;
class SimpleSpawnComponent implements SpawnComponent, Listener {
private $arena;
private $worldComponent;
private $gameMode;
/** @var Position[] */
private $spawns = [];
function __construct(Arena $arena, WorldComponent $worldComponent, $gameMode = Player::SURVIVAL)
{
$this->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);
}
}

View File

@ -0,0 +1,50 @@
<?php
/**
* Created by PhpStorm.
* User: Exerosis
* Date: 7/6/2015
* Time: 10:47 PM
*/
namespace mineplex\plugin\gameengine\game\components\spawn;
use mineplex\plugin\gameengine\arenas\Arena;
use mineplex\plugin\gameengine\arenas\events\ArenaEndEvent;
use mineplex\plugin\gameengine\game\components\gamestate\events\GameStateChangeEvent;
use pocketmine\event\HandlerList;
use pocketmine\event\Listener;
use pocketmine\Server;
class SpawnAt implements Listener {
private $spawnComponent;
private $arena;
private $gameStates;
function __construct(Arena $arena, SpawnComponent $spawnComponent, array $gameStates)
{
$this->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);
}
}

View File

@ -0,0 +1,24 @@
<?php
/**
* Created by PhpStorm.
* User: Exerosis
* Date: 7/6/2015
* Time: 2:06 PM
*/
namespace mineplex\plugin\gameengine\game\components\spawn;
use pocketmine\level\Position;
use pocketmine\Player;
interface SpawnComponent {
/**
* @param Player $player
* @return Position
*/
function respawn(Player $player);
function respawnAll();
}

View File

@ -0,0 +1,127 @@
<?php
/**
* Created by PhpStorm.
* User: Exerosis
* Date: 7/6/2015
* Time: 12:53 AM
*/
namespace mineplex\plugin\gameengine\game\components\spectate;
use mineplex\plugin\gameengine\arenas\Arena;
use mineplex\plugin\gameengine\arenas\events\ArenaQuitEvent;
use mineplex\plugin\gameengine\game\components\spectate\events\DisableSpectateEvent;
use mineplex\plugin\gameengine\game\components\spectate\events\EnableSpectateEvent;
use mineplex\plugin\util\UtilArray;
use pocketmine\event\Listener;
use pocketmine\Player;
use pocketmine\Server;
class GameModeSpectateComponent implements SpectateComponent, Listener {
/** @var Player[] */
private $spectators = [];
private $arena;
public function __construct(Arena $arena)
{
$this->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());
}
}

View File

@ -0,0 +1,49 @@
<?php
/**
* Created by PhpStorm.
* User: Exerosis
* Date: 7/5/2015
* Time: 11:52 PM
*/
namespace mineplex\plugin\gameengine\game\components\spectate;
use pocketmine\Player;
interface SpectateComponent {
/**
* @param Player $player
* @return bool
*/
public function enableSpectate(Player $player);
/**
* @param Player $player
* @return bool
*/
public function disableSpectate(Player $player);
/**
* @param Player $player
* @return bool
*/
public function isSpectating(Player $player);
/**
* @param Player $player
* @return bool
*/
public function isNotSpectating(Player $player);
/**
* @return Player[]
*/
public function getSpectators();
/**
* @return Player[]
*/
public function getNonSpectators();
}

View File

@ -0,0 +1,32 @@
<?php
/**
* Created by PhpStorm.
* User: Exerosis
* Date: 7/6/2015
* Time: 1:27 AM
*/
namespace mineplex\plugin\gameengine\game\components\spectate\events;
use mineplex\plugin\gameengine\arenas\ArenaEvent;
use mineplex\plugin\gameengine\arenas\Arena;
use pocketmine\event\Cancellable;
use pocketmine\Player;
class DisableSpectateEvent extends ArenaEvent implements Cancellable {
public static $handlerList = null;
private $player;
public function __construct(Arena $arena, Player $player)
{
parent::__construct($arena);
$this->player = $player;
}
public function getPlayer()
{
return $this->player;
}
}

View File

@ -0,0 +1,32 @@
<?php
/**
* Created by PhpStorm.
* User: Exerosis
* Date: 7/6/2015
* Time: 1:27 AM
*/
namespace mineplex\plugin\gameengine\game\components\spectate\events;
use mineplex\plugin\gameengine\arenas\ArenaEvent;
use mineplex\plugin\gameengine\arenas\Arena;
use pocketmine\event\Cancellable;
use pocketmine\Player;
class EnableSpectateEvent extends ArenaEvent implements Cancellable {
public static $handlerList = null;
private $player;
public function __construct(Arena $arena, Player $player)
{
parent::__construct($arena);
$this->player = $player;
}
public function getPlayer()
{
return $this->player;
}
}

View File

@ -9,9 +9,14 @@
namespace mineplex\plugin\gameengine\game\components\world;
use mineplex\plugin\gameengine\arenas\Arena;
use mineplex\plugin\gameengine\arenas\events\ArenaEndEvent;
use mineplex\plugin\gameengine\arenas\events\ArenaStartEvent;
use mineplex\plugin\gameengine\game\components\world\event\WorldLoadFailEvent;
use mineplex\plugin\gameengine\game\components\world\event\WorldLoadSuccessEvent;
use mineplex\plugin\util\UtilArray;
use mineplex\plugin\util\UtilString;
use mineplex\plugin\util\UtilFile;
use pocketmine\event\HandlerList;
use pocketmine\event\Listener;
use pocketmine\level\Position;
use pocketmine\math\Vector3;
@ -25,8 +30,9 @@ class WorldComponent implements Listener
private $arena;
private $gameId;
private $gameFolder;
private $worldNameFolder;
/** @var \pocketmine\level\Level */
private $world;
private $mapName;
@ -45,30 +51,31 @@ class WorldComponent implements Listener
$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");
}
// This is just some wierd testiong. Ignore it :P
// public function onJoin(PlayerJoinEvent $event)
// {
// $this->player = $event->getPlayer();
// }
//
// public function onEvent(UpdateEvent $event)
// {
// if (is_null($this->player))
// return;
//
// if ($event->isTiming(UpdateType::S8))
// {
// $this->player->teleport($this->posTest);
//
// print("Teleporting " . $this->player->getName() . " to...\n");
//
// $this->player = null;
// }
// }
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)
{
@ -91,20 +98,20 @@ class WorldComponent implements Listener
print_r($worldName . "\n");
$this->gameFolder = "Game" . $this->gameId . "_" . $gameName . "_" . $worldName;
$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->gameFolder . '/');
$zip->extractTo('worlds/' . $this->worldNameFolder . '/');
$zip->close();
print("Successfully Extracted: " . $this->gameFolder . "\n");
print("Successfully Extracted: " . $this->worldNameFolder . "\n");
}
else
{
print("Error Extracting: " . $this->gameFolder . "\n");
print("Error Extracting: " . $this->worldNameFolder . "\n");
Server::getInstance()->getPluginManager()->callEvent(new WorldLoadFailEvent($this->arena));
@ -112,23 +119,23 @@ class WorldComponent implements Listener
}
//Load World
if ($this->arena->getPlugin()->getServer()->loadLevel($this->gameFolder))
if ($this->arena->getPlugin()->getServer()->loadLevel($this->worldNameFolder))
{
$this->world = $this->arena->getPlugin()->getServer()->getLevelByName($this->gameFolder);
$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->gameFolder . "\n");
print("Successfully Loaded World: " . $this->worldNameFolder . "\n");
Server::getInstance()->getPluginManager()->callEvent(new WorldLoadSuccessEvent($this->arena, $this->world));
}
else
{
print("Error Loading World: " . $this->gameFolder . "\n");
print("Error Loading World: " . $this->worldNameFolder . "\n");
Server::getInstance()->getPluginManager()->callEvent(new WorldLoadFailEvent($this->arena));
@ -138,7 +145,7 @@ class WorldComponent implements Listener
public function loadWorldData()
{
$handle = fopen("WorldConfig.dat", "r");
$handle = fopen('worlds/' . $this->worldNameFolder . '/WorldConfig.dat', "r");
if ($handle)
{
//These store the array that data should be inserted into
@ -148,7 +155,9 @@ class WorldComponent implements Listener
while (($line = fgets($handle)) !== false)
{
$tokens = explode(":", $line);
$trimmedLine = trim($line, "\n\r");
$tokens = explode(":", $trimmedLine);
if (count($tokens) < 2 || strlen($tokens[0]) == 0)
{
@ -231,27 +240,35 @@ class WorldComponent implements Listener
}
}
/**
* @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];
}
public function getPosition()
{
return $this->getTeams()[0][0];
return [];
}
protected function strToPos($str)
{
if (strlen($str) < 5)
@ -281,5 +298,12 @@ class WorldComponent implements Listener
{
return $this->ready;
}
public function onEnd(ArenaEndEvent $event)
{
if ($this->arena !== $event->getArena())
return;
HandlerList::unregisterAll($this);
}
}

View File

@ -10,46 +10,66 @@ namespace mineplex\plugin\gameengine\game\games\sg;
use mineplex\plugin\gameengine\game\components\countdown\GameStateCountdown;
use mineplex\plugin\gameengine\game\components\countdown\LobbyCountdown;
use mineplex\plugin\gameengine\game\components\feature\features\DeathSpectate;
use mineplex\plugin\gameengine\game\components\feature\features\NoBlockBreak;
use mineplex\plugin\gameengine\game\components\feature\GameStateFeatureManager;
use mineplex\plugin\gameengine\game\components\feature\features\NoBlockPlace;
use mineplex\plugin\gameengine\game\components\feature\features\NoDropItem;
use mineplex\plugin\gameengine\game\components\feature\features\NoPickUpItem;
use mineplex\plugin\gameengine\game\components\feature\managers\GameStateFeatureManager;
use mineplex\plugin\gameengine\game\components\gamestate\GameState;
use mineplex\plugin\gameengine\game\components\gamestate\GameStateComponent;
use mineplex\plugin\gameengine\game\components\lobby\LobbyComponent;
use mineplex\plugin\gameengine\game\components\spawn\SimpleSpawnComponent;
use mineplex\plugin\gameengine\game\components\spawn\SpawnAt;
use mineplex\plugin\gameengine\game\components\spectate\GameModeSpectateComponent;
use mineplex\plugin\gameengine\game\components\world\WorldComponent;
use mineplex\plugin\gameengine\game\Game;
use mineplex\plugin\gameengine\arenas\Arena;
use mineplex\plugin\gameengine\game\components\feature\Feature;
use mineplex\plugin\gameengine\time\BenchSchedule;
use mineplex\plugin\gameengine\time\BenchTask;
use mineplex\plugin\gameengine\time\BenchTaskData;
use pocketmine\item\Item;
class SurvivalGames implements Game {
/** @var Arena */
private $arena;
function start(Arena $arena)
{
$this->arena = $arena;
$gameStateComponent = new GameStateComponent($arena);
$noBlockBreak = new NoBlockBreak($arena);
$someBlockBreak = new NoBlockBreak($arena, array(Item::GRASS));
//$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($noBlockBreak),
GameState::PRE_GAME => array($noBlockBreak),
GameState::GAME => array($someBlockBreak),
GameState::POST_GAME => array($noBlockBreak)
);
new LobbyComponent($arena);
//$features = array(
// GameState::LOBBY => array($noPickUpItem, $pack)
//);
//new GameStateFeatureManager($arena, $features);
//new LobbyComponent($arena);
$worldComponent = new WorldComponent($arena);
new LobbyCountdown($arena, $gameStateComponent, $worldComponent, GameState::LOBBY, GameState::PRE_GAME, 50);
$spawnComponent = new SimpleSpawnComponent($arena, $worldComponent);
new GameStateCountdown($arena, $gameStateComponent, 10, GameState::PRE_GAME, GameState::GAME);
new SpawnAt($arena, $spawnComponent, [GameState::PRE_GAME]);
new GameStateCountdown($arena, $gameStateComponent, 30, GameState::GAME, GameState::POST_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);
new GameStateCountdown($arena, $gameStateComponent, 10, GameState::POST_GAME, GameState::RESTARTING);
}
}

View File

@ -0,0 +1,54 @@
<?php
/**
* Created by PhpStorm.
* User: Exerosis
* Date: 7/6/2015
* Time: 1:07 AM
*/
namespace mineplex\plugin\util;
class UtilArray {
public static function hasKey($key, array $array)
{
return (isset($array[$key]) || array_key_exists($key, $array));
}
public static function arrayDiff(array $array, array $subtract)
{
return array_udiff($array, $subtract, ['mineplex\plugin\util\UtilArray', 'comp']);
}
static function comp($a,$b)
{
if ($a===$b)
{
return 0;
}
return ($a>$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;
}
}

View File

@ -0,0 +1,31 @@
<?php
namespace mineplex\plugin\util;
class UtilFile
{
public static function deleteDir($dirPath)
{
if (! is_dir($dirPath))
{
throw new InvalidArgumentException("$dirPath must be a directory");
}
if (substr($dirPath, strlen($dirPath) - 1, 1) != '/')
{
$dirPath .= '/';
}
$files = glob($dirPath . '*', GLOB_MARK);
foreach ($files as $file)
{
if (is_dir($file))
{
self::deleteDir($file);
}
else
{
unlink($file);
}
}
rmdir($dirPath);
}
}