Teams
Signed-off-by: Aaron Brock <TheMineBench@gmail.com>
This commit is contained in:
parent
7377094e86
commit
d5a144f377
@ -6,6 +6,9 @@ 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\gameengine\time\BenchSchedule;
|
||||
use mineplex\plugin\gameengine\time\BenchTask;
|
||||
use mineplex\plugin\gameengine\time\BenchTaskData;
|
||||
use mineplex\plugin\util\UtilFile;
|
||||
use mineplex\plugin\util\UtilString;
|
||||
use pocketmine\block\Block;
|
||||
@ -23,19 +26,16 @@ use pocketmine\plugin\PluginBase;
|
||||
use mineplex\plugin\gameengine\arenas\Arena;
|
||||
use pocketmine\Server;
|
||||
|
||||
class Main extends PluginBase implements Listener
|
||||
class Main extends PluginBase implements Listener, BenchTask
|
||||
{
|
||||
/** @var Arena */
|
||||
private $arena;
|
||||
private $test;
|
||||
|
||||
public function onEnable()
|
||||
{
|
||||
$this->arena = new MultiGameArena($this, new TestGameFactory());
|
||||
Server::getInstance()->getPluginManager()->registerEvents($this, $this);
|
||||
|
||||
//$this->test = new WorldComponent($this->arena);
|
||||
|
||||
new Updater($this);
|
||||
|
||||
$this->arena->getPlugin()->getServer()->getLevelByName("world")->setSpawnLocation(new Vector3(0, 200, 0));
|
||||
@ -44,8 +44,6 @@ class Main extends PluginBase implements Listener
|
||||
|
||||
public function onLogin(PlayerLoginEvent $event)
|
||||
{
|
||||
//UtilFile::deleteDir('players/' . $event->getPlayer()->getName() . '.dat');
|
||||
|
||||
if ($this->arena->canJoin($event->getPlayer()))
|
||||
return;
|
||||
|
||||
@ -53,34 +51,42 @@ class Main extends PluginBase implements Listener
|
||||
$event->setCancelled();
|
||||
}
|
||||
|
||||
//This is a hack to allow people to teleport a player when the join... I know it's scurry D:
|
||||
public function onJoin(PlayerJoinEvent $event)
|
||||
{
|
||||
$this->arena->addPlayer($event->getPlayer());
|
||||
BenchSchedule::runTaskLaterWithId($this, 0, $event->getPlayer());
|
||||
}
|
||||
|
||||
public function punch(PlayerInteractEvent $event)
|
||||
function run(BenchTaskData $task)
|
||||
{
|
||||
if ($event->getAction() == PlayerInteractEvent::LEFT_CLICK_BLOCK || $event->getAction() == PlayerInteractEvent::RIGHT_CLICK_BLOCK)
|
||||
{
|
||||
$event->getPlayer()->sendMessage("Block: " . $event->getBlock()->getId() . ":" . $event->getBlock()->getDamage());
|
||||
}
|
||||
if (!($task->getId() instanceof Player))
|
||||
return;
|
||||
|
||||
/** @var Player $player */
|
||||
$player = $task->getId();
|
||||
|
||||
if (!$player->isConnected())
|
||||
return;
|
||||
|
||||
$this->arena->addPlayer($player);
|
||||
}
|
||||
|
||||
|
||||
public function command(PlayerCommandPreprocessEvent $event)
|
||||
{
|
||||
if (UtilString::startsWith($event->getMessage(), "/pos"))
|
||||
self::sendLoc($event->getPlayer());
|
||||
}
|
||||
|
||||
public static function sendLoc(Player $player)
|
||||
public static function sendLoc(Player $player, Position $pos = null)
|
||||
{
|
||||
if ($pos == null)
|
||||
$pos = $player->getLocation();
|
||||
|
||||
$player->sendMessage("X: " . $pos->getX());
|
||||
$player->sendMessage("Y: " . $pos->getY());
|
||||
$player->sendMessage("Z: " . $pos->getZ());
|
||||
$player->sendMessage("Level: " . $pos->getLevel()->getName());
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -90,7 +90,7 @@ class GameStateCountdown implements Listener, BenchTask {
|
||||
{
|
||||
foreach ($this->arena->getPlayers() as $player)
|
||||
{
|
||||
$player->sendPopup("Countdown: $this->count");
|
||||
$player->sendTip("Countdown: $this->count");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -29,6 +29,7 @@ class LobbyCountdown implements Listener, BenchTask {
|
||||
private $startCount;
|
||||
private $count;
|
||||
private $gameStateComponent;
|
||||
/** @var WorldComponent */
|
||||
private $worldComponent;
|
||||
private $arena;
|
||||
private $startGameState;
|
||||
@ -41,7 +42,7 @@ class LobbyCountdown implements Listener, BenchTask {
|
||||
const COUNTDOWN_ID = "count";
|
||||
|
||||
|
||||
public function __construct(Arena $arena, GameStateComponent $gameStateComponent, WorldComponent $worldComponent = null, $startGameState, $setGameState, $count, $minPlayers = 2)
|
||||
public function __construct(Arena $arena, GameStateComponent $gameStateComponent, $worldComponent = null, $startGameState, $setGameState, $count, $minPlayers = 2)
|
||||
{
|
||||
$this->arena = $arena;
|
||||
$this->gameStateComponent = $gameStateComponent;
|
||||
@ -184,6 +185,6 @@ class LobbyCountdown implements Listener, BenchTask {
|
||||
|
||||
private function popup(Player $player)
|
||||
{
|
||||
$player->sendPopup($this->message);
|
||||
$player->sendTip($this->message);
|
||||
}
|
||||
}
|
@ -28,7 +28,6 @@ class FreezePlayers extends ListenerFeature {
|
||||
|
||||
function onMove(PlayerMoveEvent $event)
|
||||
{
|
||||
|
||||
if (!$this->hasPlayer($event->getPlayer()))
|
||||
return;
|
||||
|
||||
@ -41,13 +40,17 @@ class FreezePlayers extends ListenerFeature {
|
||||
parent::enable();
|
||||
|
||||
$effect = new Effect(Effect::SLOWNESS, "Waiting till game start...", 0, 0, 0, true);
|
||||
$effect->setVisible(false)->setAmplifier(9)->setDuration(PHP_INT_MAX);
|
||||
//TODO fix the 429496729
|
||||
$effect->setVisible(false)->setAmplifier(9)->setDuration(429496729);
|
||||
|
||||
print "Player Count: " . count($this->getPlayers()) . "\n";
|
||||
|
||||
foreach ($this->getPlayers() as $player)
|
||||
{
|
||||
print "Adding effect!\n";
|
||||
$player->addEffect($effect);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public function disable()
|
||||
@ -56,7 +59,7 @@ class FreezePlayers extends ListenerFeature {
|
||||
print "Player Count: " . count($this->getPlayers()) . "\n";
|
||||
foreach ($this->getPlayers() as $player)
|
||||
{
|
||||
print "Adding effect! \n";
|
||||
print "Remove effect! \n";
|
||||
$player->removeEffect(Effect::SLOWNESS);
|
||||
}
|
||||
}
|
||||
|
@ -19,13 +19,10 @@ class JoinSpectate extends ListenerFeature {
|
||||
|
||||
private $spectateComponent;
|
||||
|
||||
private $id;
|
||||
|
||||
function __construct(Arena $arena, SpectateComponent $spectateComponent)
|
||||
{
|
||||
parent::__construct($arena);
|
||||
$this->spectateComponent = $spectateComponent;
|
||||
$this->id = rand(0, 99999);
|
||||
}
|
||||
|
||||
function onJoin(ArenaJoinEvent $event)
|
||||
@ -36,14 +33,11 @@ class JoinSpectate extends ListenerFeature {
|
||||
}
|
||||
public function enable()
|
||||
{
|
||||
Server::getInstance()->broadcastMessage("JoinSpectate enable! : $this->id");
|
||||
parent::enable();
|
||||
print "JoinSpectate enable? " . ($this->isEnabled() ? 'true' : 'false') . "\n";
|
||||
}
|
||||
|
||||
public function disable()
|
||||
{
|
||||
Server::getInstance()->broadcastMessage("JoinSpectate disable!");
|
||||
parent::disable();
|
||||
}
|
||||
|
||||
|
@ -25,6 +25,7 @@ class NoDamage extends ListenerFeature {
|
||||
{
|
||||
if (!$this->getArena()->hasPlayer($event->getEntity()))
|
||||
return;
|
||||
|
||||
//Server::getInstance()->broadcastMessage("Stopped!");
|
||||
$event->setCancelled();
|
||||
}
|
||||
|
@ -0,0 +1,56 @@
|
||||
<?php
|
||||
/**
|
||||
* Created by PhpStorm.
|
||||
* User: Exerosis
|
||||
* Date: 7/12/2015
|
||||
* Time: 12:41 AM
|
||||
*/
|
||||
namespace mineplex\plugin\gameengine\game\components\feature\features;
|
||||
|
||||
|
||||
use mineplex\plugin\gameengine\arenas\Arena;
|
||||
use mineplex\plugin\gameengine\arenas\events\ArenaJoinEvent;
|
||||
use mineplex\plugin\gameengine\game\components\feature\ListenerFeature;
|
||||
use mineplex\plugin\gameengine\game\components\spectate\events\EnableSpectateEvent;
|
||||
use mineplex\plugin\gameengine\game\components\spectate\SpectateComponent;
|
||||
use mineplex\plugin\gameengine\game\components\world\WorldComponent;
|
||||
use mineplex\plugin\util\UtilTeleport;
|
||||
use pocketmine\block\Thin;
|
||||
|
||||
class SpectateInGameWorld extends ListenerFeature {
|
||||
|
||||
private $worldComponent;
|
||||
|
||||
/**
|
||||
* @param Arena $arena
|
||||
* @param WorldComponent $worldComponent
|
||||
* @param SpectateComponent $spectateComponent just here to make sure that there is a SpectateComponent
|
||||
*/
|
||||
function __construct(Arena $arena, WorldComponent $worldComponent, SpectateComponent $spectateComponent)
|
||||
{
|
||||
parent::__construct($arena);
|
||||
$this->worldComponent = $worldComponent;
|
||||
|
||||
}
|
||||
|
||||
function onJoin(EnableSpectateEvent $event)
|
||||
{
|
||||
if ($this->getArena() !== $event->getArena() || !$this->worldComponent->isWorldReady())
|
||||
return;
|
||||
|
||||
if ($event->getPlayer()->getPosition()->getLevel() == $this->worldComponent->getWorld())
|
||||
return;
|
||||
|
||||
UtilTeleport::teleport($event->getPlayer(), $this->worldComponent->getWorld()->getSpawnLocation());
|
||||
}
|
||||
public function enable()
|
||||
{
|
||||
parent::enable();
|
||||
}
|
||||
|
||||
public function disable()
|
||||
{
|
||||
parent::disable();
|
||||
}
|
||||
|
||||
}
|
@ -15,6 +15,8 @@ use mineplex\plugin\gameengine\game\components\feature\ListenerFeature;
|
||||
use mineplex\plugin\gameengine\game\components\feature\UtilFeature;
|
||||
use mineplex\plugin\gameengine\game\components\gamestate\events\GameStateChangeEvent;
|
||||
use mineplex\plugin\gameengine\game\components\gamestate\GameState;
|
||||
use mineplex\plugin\gameengine\time\BenchTaskData;
|
||||
use mineplex\plugin\Main;
|
||||
use mineplex\plugin\util\UtilTeleport;
|
||||
use pocketmine\event\block\BlockBreakEvent;
|
||||
use pocketmine\event\entity\EntityDamageEvent;
|
||||
@ -40,6 +42,7 @@ class LobbyComponent implements Listener
|
||||
|
||||
private $duringLobbyGameState;
|
||||
|
||||
private $spawn;
|
||||
/**
|
||||
* @param Arena $arena
|
||||
* @param Level $world
|
||||
@ -51,16 +54,18 @@ class LobbyComponent implements Listener
|
||||
|
||||
$world->setTime(6000);
|
||||
$world->stopTime();
|
||||
$world->setSpawnLocation(new Vector3(0, 103, 0));
|
||||
|
||||
$this->world = $world;
|
||||
|
||||
$this->spawn = new Position(0, 103, 0, $world);
|
||||
|
||||
$this->arena = $arena;
|
||||
$this->duringLobbyGameState = new DuringLobbyGameState($this);
|
||||
|
||||
Server::getInstance()->getPluginManager()->registerEvents($this, $arena->getPlugin());
|
||||
}
|
||||
|
||||
|
||||
function sendToSpawn(Player $player)
|
||||
{
|
||||
$player->getInventory()->clearAll();
|
||||
@ -70,9 +75,12 @@ class LobbyComponent implements Listener
|
||||
$player->setHealth($player->getMaxHealth());
|
||||
$player->resetFallDistance();
|
||||
|
||||
$pos = $this->world->getSpawnLocation()->add(rand(-4, 4), 0, rand(-4, 4));
|
||||
//Main::sendLoc($player, $this->world->getSpawnLocation());
|
||||
|
||||
$pos = $this->spawn->add(rand(-4, 4), 0, rand(-4, 4));
|
||||
|
||||
UtilTeleport::teleport($player, new Position($pos->getX(), $pos->getY(), $pos->getZ(), $this->world));
|
||||
//Main::sendLoc($player);
|
||||
}
|
||||
|
||||
|
||||
@ -85,7 +93,7 @@ class LobbyComponent implements Listener
|
||||
|
||||
function onDamage(EntityDamageEvent $event)
|
||||
{
|
||||
if (!$event->getEntity()->getLevel() == $this->world)
|
||||
if ($event->getEntity()->getLevel() !== $this->world)
|
||||
return;
|
||||
$event->setCancelled();
|
||||
}
|
||||
|
@ -11,6 +11,7 @@ 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\spectate\SpectateComponent;
|
||||
use mineplex\plugin\gameengine\game\components\world\event\WorldLoadSuccessEvent;
|
||||
use mineplex\plugin\gameengine\game\components\world\WorldComponent;
|
||||
use mineplex\plugin\Main;
|
||||
@ -27,15 +28,17 @@ class SimpleSpawnComponent implements SpawnComponent, Listener {
|
||||
private $arena;
|
||||
private $worldComponent;
|
||||
private $gameMode;
|
||||
|
||||
private $spectateComponent;
|
||||
/** @var Position[] */
|
||||
private $spawns = [];
|
||||
|
||||
function __construct(Arena $arena, WorldComponent $worldComponent, $gameMode = Player::SURVIVAL)
|
||||
function __construct(Arena $arena, WorldComponent $worldComponent, SpectateComponent $spectateComponent = null, $gameMode = Player::SURVIVAL)
|
||||
{
|
||||
|
||||
$this->arena = $arena;
|
||||
$this->worldComponent = $worldComponent;
|
||||
$this->gameMode = $gameMode;
|
||||
$this->spectateComponent = $spectateComponent;
|
||||
|
||||
Server::getInstance()->getPluginManager()->registerEvents($this, $arena->getPlugin());
|
||||
}
|
||||
@ -67,12 +70,6 @@ class SimpleSpawnComponent implements SpawnComponent, Listener {
|
||||
function respawn(Player $player)
|
||||
{
|
||||
|
||||
if (count($this->spawns) < 1)
|
||||
{
|
||||
print "no spawns!";
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
$player->getInventory()->clearAll();
|
||||
$player->removeAllEffects();
|
||||
@ -80,21 +77,53 @@ class SimpleSpawnComponent implements SpawnComponent, Listener {
|
||||
$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);
|
||||
$pos = $this->getSpawn();
|
||||
UtilTeleport::teleport($player, $pos);
|
||||
//$player->teleport($pos);
|
||||
|
||||
$player->sendMessage("After:");
|
||||
Main::sendLoc($player);
|
||||
return $pos;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return null|Position
|
||||
*/
|
||||
function getSpawn()
|
||||
{
|
||||
if (count($this->spawns) < 1)
|
||||
{
|
||||
print "no spawns!";
|
||||
return null;
|
||||
}
|
||||
/** @var Position $best */
|
||||
$best = null;
|
||||
$bestDist = 0;
|
||||
|
||||
foreach ($this->spawns as $spawn)
|
||||
{
|
||||
|
||||
$closestPlayer = -1;
|
||||
|
||||
foreach ($this->getPlayers() as $player)
|
||||
{
|
||||
if ($player->getPosition()->getLevel() != $spawn->getLevel())
|
||||
continue;
|
||||
//distanceSquared is a cheaper method, and as long as its consistent it will be fine
|
||||
$playerDist = $spawn->distanceSquared($player->getPosition());
|
||||
if ($playerDist < $closestPlayer || $closestPlayer < 0)
|
||||
{
|
||||
$closestPlayer = $playerDist;
|
||||
}
|
||||
}
|
||||
if ($best == null || $closestPlayer > $bestDist)
|
||||
{
|
||||
$best = $spawn;
|
||||
$bestDist = $closestPlayer;
|
||||
}
|
||||
|
||||
}
|
||||
return $best;
|
||||
}
|
||||
|
||||
function respawnAll() {
|
||||
foreach ($this->arena->getPlayers() as $player)
|
||||
{
|
||||
@ -108,4 +137,13 @@ class SimpleSpawnComponent implements SpawnComponent, Listener {
|
||||
return;
|
||||
HandlerList::unregisterAll($this);
|
||||
}
|
||||
|
||||
function getPlayers()
|
||||
{
|
||||
if ($this->spectateComponent != null)
|
||||
return $this->spectateComponent->getNonSpectators();
|
||||
else
|
||||
return $this->arena->getPlayers();
|
||||
}
|
||||
|
||||
}
|
@ -8,13 +8,13 @@
|
||||
|
||||
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;
|
||||
|
@ -0,0 +1,78 @@
|
||||
<?php
|
||||
/**
|
||||
* Created by PhpStorm.
|
||||
* User: Exerosis
|
||||
* Date: 7/13/2015
|
||||
* Time: 5:55 AM
|
||||
*/
|
||||
|
||||
namespace mineplex\plugin\gameengine\game\components\team;
|
||||
|
||||
|
||||
use mineplex\plugin\util\UtilArray;
|
||||
use pocketmine\Player;
|
||||
|
||||
class SimpleTeam implements Team {
|
||||
|
||||
/** @var Player[] */
|
||||
private $players = [];
|
||||
|
||||
private $name;
|
||||
private $color;
|
||||
|
||||
/**
|
||||
* @param string $name
|
||||
* @param string $color
|
||||
*/
|
||||
function __construct($name, $color)
|
||||
{
|
||||
$this->name = $name;
|
||||
$this->color = $color;
|
||||
}
|
||||
|
||||
function addPlayer_forUseByManagerOnly(Player $player)
|
||||
{
|
||||
$this->players[$player->getName()] = $player;
|
||||
$player->sendMessage("$this->color You are now on the team $this->name!");
|
||||
}
|
||||
|
||||
function removePlayer_forUseByManagerOnly(Player $player)
|
||||
{
|
||||
if ($this->hasPlayer($player))
|
||||
unset ($this->players[$player->getName()]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Player[]
|
||||
*/
|
||||
function getPlayers()
|
||||
{
|
||||
return $this->players;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Player $player
|
||||
* @return bool
|
||||
*/
|
||||
function hasPlayer(Player $player)
|
||||
{
|
||||
return UtilArray::hasKey($player->getName(), $this->players);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
function getName()
|
||||
{
|
||||
$this->name;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
function getColor()
|
||||
{
|
||||
$this->color;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,95 @@
|
||||
<?php
|
||||
/**
|
||||
* Created by PhpStorm.
|
||||
* User: Exerosis
|
||||
* Date: 7/13/2015
|
||||
* Time: 5:04 AM
|
||||
*/
|
||||
|
||||
namespace mineplex\plugin\gameengine\game\components\team;
|
||||
|
||||
|
||||
use mineplex\plugin\gameengine\arenas\Arena;
|
||||
use mineplex\plugin\util\UtilArray;
|
||||
use pocketmine\Player;
|
||||
use InvalidArgumentException;
|
||||
|
||||
class SimpleTeamManager implements TeamManager {
|
||||
|
||||
private $arena;
|
||||
|
||||
/** @var Team[] */
|
||||
private $teams = [];
|
||||
|
||||
/**
|
||||
* @param Arena $arena
|
||||
* @param Team[] $teams
|
||||
*/
|
||||
function __construct(Arena $arena, array $teams = [])
|
||||
{
|
||||
$this->arena = $arena;
|
||||
foreach ($teams as $team)
|
||||
{
|
||||
$this->addTeam($team);
|
||||
}
|
||||
}
|
||||
|
||||
function addTeam(Team $team)
|
||||
{
|
||||
$this->teams[$team->getName()] = $team;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param String $name
|
||||
* @return Team|null
|
||||
*/
|
||||
function getTeam($name)
|
||||
{
|
||||
if (UtilArray::hasKey($name, $this->teams))
|
||||
{
|
||||
return $this->teams[$name];
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Team[]
|
||||
*/
|
||||
function getTeams()
|
||||
{
|
||||
return $this->teams;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Player $player
|
||||
* @return Team|null
|
||||
*/
|
||||
function getPlayersTeam(Player $player)
|
||||
{
|
||||
foreach ($this->getTeams() as $team)
|
||||
{
|
||||
if ($team->hasPlayer($player))
|
||||
return $team;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
function setPlayersTeam(Player $player, Team $team)
|
||||
{
|
||||
$oldTeam = $this->getPlayersTeam($player);
|
||||
if ($oldTeam != null)
|
||||
{
|
||||
$oldTeam->removePlayer_forUseByManagerOnly($player);
|
||||
}
|
||||
|
||||
//Meh, why not?
|
||||
if (!in_array($team, $this->teams))
|
||||
{
|
||||
throw new InvalidArgumentException('The team giving is not known by this manager!');
|
||||
}
|
||||
|
||||
$team->addPlayer_forUseByManagerOnly($player);
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,41 @@
|
||||
<?php
|
||||
/**
|
||||
* Created by PhpStorm.
|
||||
* User: Exerosis
|
||||
* Date: 7/13/2015
|
||||
* Time: 3:56 AM
|
||||
*/
|
||||
|
||||
namespace mineplex\plugin\gameengine\game\components\team;
|
||||
|
||||
|
||||
use pocketmine\Player;
|
||||
|
||||
interface Team {
|
||||
|
||||
function addPlayer_forUseByManagerOnly(Player $player);
|
||||
|
||||
function removePlayer_forUseByManagerOnly(Player $player);
|
||||
|
||||
/**
|
||||
* @return Player[]
|
||||
*/
|
||||
function getPlayers();
|
||||
|
||||
/**
|
||||
* @param Player $player
|
||||
* @return bool
|
||||
*/
|
||||
function hasPlayer(Player $player);
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
function getName();
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
function getColor();
|
||||
|
||||
}
|
@ -0,0 +1,61 @@
|
||||
<?php
|
||||
/**
|
||||
* Created by PhpStorm.
|
||||
* User: Exerosis
|
||||
* Date: 7/13/2015
|
||||
* Time: 6:21 AM
|
||||
*/
|
||||
|
||||
namespace mineplex\plugin\gameengine\game\components\team;
|
||||
|
||||
|
||||
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 pocketmine\event\HandlerList;
|
||||
use pocketmine\event\Listener;
|
||||
use pocketmine\Server;
|
||||
|
||||
class TeamDealer implements Listener {
|
||||
|
||||
private $arena;
|
||||
private $teamManager;
|
||||
|
||||
|
||||
function __construct(Arena $arena, TeamManager $teamManager)
|
||||
{
|
||||
$this->arena = $arena;
|
||||
$this->teamManager = $teamManager;
|
||||
Server::getInstance()->getPluginManager()->registerEvents($this, $arena->getPlugin());
|
||||
}
|
||||
|
||||
public function gameState(GameStateChangeEvent $event)
|
||||
{
|
||||
if ($event->getArena() != $this->arena)
|
||||
return;
|
||||
|
||||
if ($event->getToGameState() == GameState::PRE_GAME)
|
||||
$this->deal();
|
||||
|
||||
}
|
||||
|
||||
function deal()
|
||||
{
|
||||
$teams = array_values($this->teamManager->getTeams());
|
||||
$counter = 0;
|
||||
foreach ($this->arena->getPlayers() as $player)
|
||||
{
|
||||
Server::getInstance()->broadcastMessage($counter % count($teams));
|
||||
$this->teamManager->setPlayersTeam($player, $teams[$counter % count($teams)]);
|
||||
$counter++;
|
||||
}
|
||||
}
|
||||
|
||||
function gameEnd(ArenaEndEvent $event)
|
||||
{
|
||||
if ($event->getArena() != $this->arena)
|
||||
return;
|
||||
HandlerList::unregisterAll($this);
|
||||
}
|
||||
}
|
@ -0,0 +1,35 @@
|
||||
<?php
|
||||
/**
|
||||
* Created by PhpStorm.
|
||||
* User: Exerosis
|
||||
* Date: 7/13/2015
|
||||
* Time: 4:41 AM
|
||||
*/
|
||||
|
||||
namespace mineplex\plugin\gameengine\game\components\team;
|
||||
|
||||
|
||||
use pocketmine\Player;
|
||||
|
||||
interface TeamManager {
|
||||
|
||||
/**
|
||||
* @param String $name
|
||||
* @return Team|null
|
||||
*/
|
||||
function getTeam($name);
|
||||
|
||||
/**
|
||||
* @return Team[]
|
||||
*/
|
||||
function getTeams();
|
||||
|
||||
/**
|
||||
* @param Player $player
|
||||
* @return Team|null
|
||||
*/
|
||||
function getPlayersTeam(Player $player);
|
||||
|
||||
function setPlayersTeam(Player $player, Team $team);
|
||||
|
||||
}
|
@ -0,0 +1,42 @@
|
||||
<?php
|
||||
/**
|
||||
* Created by PhpStorm.
|
||||
* User: Exerosis
|
||||
* Date: 7/12/2015
|
||||
* Time: 9:25 PM
|
||||
*/
|
||||
|
||||
namespace mineplex\plugin\gameengine\game\components\world;
|
||||
|
||||
|
||||
use mineplex\plugin\gameengine\arenas\Arena;
|
||||
use mineplex\plugin\gameengine\game\components\world\event\WorldLoadSuccessEvent;
|
||||
|
||||
//This is a simple fix for Chiss' allergies to Night time
|
||||
class TimeComponent {
|
||||
|
||||
private $arena;
|
||||
private $worldComponent;
|
||||
private $time;
|
||||
|
||||
/**
|
||||
* @param Arena $arena
|
||||
* @param WorldComponent $worldComponent
|
||||
* @param int $time
|
||||
*/
|
||||
function __construct(Arena $arena, WorldComponent $worldComponent, $time = 6000)
|
||||
{
|
||||
$this->arena = $arena;
|
||||
$this->worldComponent = $worldComponent;
|
||||
$this->time = $time;
|
||||
}
|
||||
|
||||
public function onWorld(WorldLoadSuccessEvent $event)
|
||||
{
|
||||
if ($event->getArena() !== $this->arena)
|
||||
return;
|
||||
$event->getLevel()->setTime($this->time);
|
||||
$event->getLevel()->stopTime();
|
||||
}
|
||||
|
||||
}
|
@ -13,6 +13,9 @@ 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\gameengine\time\BenchSchedule;
|
||||
use mineplex\plugin\gameengine\time\BenchTask;
|
||||
use mineplex\plugin\gameengine\time\BenchTaskData;
|
||||
use mineplex\plugin\util\UtilArray;
|
||||
use mineplex\plugin\util\UtilString;
|
||||
use mineplex\plugin\util\UtilFile;
|
||||
@ -26,7 +29,7 @@ use pocketmine\Server;
|
||||
use ZipArchive;
|
||||
use Exception;
|
||||
|
||||
class WorldComponent implements Listener
|
||||
class WorldComponent implements Listener, BenchTask
|
||||
{
|
||||
private $arena;
|
||||
|
||||
@ -34,7 +37,7 @@ class WorldComponent implements Listener
|
||||
private $worldNameFolder;
|
||||
|
||||
/** @var \pocketmine\level\Level */
|
||||
private $world;
|
||||
private $world = null;
|
||||
|
||||
private $mapName;
|
||||
private $mapAuthor;
|
||||
@ -58,7 +61,7 @@ class WorldComponent implements Listener
|
||||
{
|
||||
if ($this->arena !== $event->getArena())
|
||||
return;
|
||||
$this->loadWorld("Super Smash Mobs");
|
||||
$this->loadWorld("Survival Games");
|
||||
}
|
||||
|
||||
private function unloadWorld()
|
||||
@ -305,6 +308,17 @@ class WorldComponent implements Listener
|
||||
if ($this->arena !== $event->getArena())
|
||||
return;
|
||||
HandlerList::unregisterAll($this);
|
||||
BenchSchedule::runTaskLater($this, (1000 * 10));
|
||||
}
|
||||
|
||||
public function run(BenchTaskData $bench)
|
||||
{
|
||||
$this->unloadWorld();
|
||||
}
|
||||
|
||||
public function getWorld()
|
||||
{
|
||||
return $this->world;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -18,6 +18,7 @@ use mineplex\plugin\gameengine\game\components\feature\features\NoBlockPlace;
|
||||
use mineplex\plugin\gameengine\game\components\feature\features\NoDamage;
|
||||
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\features\SpectateInGameWorld;
|
||||
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;
|
||||
@ -25,11 +26,16 @@ 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\team\SimpleTeam;
|
||||
use mineplex\plugin\gameengine\game\components\team\SimpleTeamManager;
|
||||
use mineplex\plugin\gameengine\game\components\team\TeamDealer;
|
||||
use mineplex\plugin\gameengine\game\components\world\TimeComponent;
|
||||
use mineplex\plugin\gameengine\game\components\world\WorldComponent;
|
||||
use mineplex\plugin\gameengine\game\Game;
|
||||
use mineplex\plugin\gameengine\game\components\countdown\LobbyCountdown;
|
||||
use mineplex\plugin\gameengine\game\components\feature\Feature;
|
||||
use mineplex\plugin\gameengine\game\components\victorytype\LMSVictoryType;
|
||||
|
||||
class SurvivalGames implements Game {
|
||||
|
||||
function start(Arena $arena)
|
||||
@ -40,11 +46,21 @@ class SurvivalGames implements Game {
|
||||
|
||||
$worldComponent = new WorldComponent($arena);
|
||||
|
||||
|
||||
|
||||
$teamManager = new SimpleTeamManager($arena, [new SimpleTeam('Bench', '§6'), new SimpleTeam('Not Bench', '§b')]);
|
||||
new TeamDealer($arena, $teamManager);
|
||||
|
||||
|
||||
|
||||
new LobbyComponent($arena);
|
||||
|
||||
new TimeComponent($arena, $worldComponent);
|
||||
|
||||
//Features start----
|
||||
$noDamage = new NoDamage($arena);
|
||||
$joinSpectate = new JoinSpectate($arena, $spectateComponent);
|
||||
|
||||
$joinSpectate = [new JoinSpectate($arena, $spectateComponent), new SpectateInGameWorld($arena, $worldComponent, $spectateComponent)];
|
||||
|
||||
$stopEveryThing = array(new NoBlockBreak($arena), new NoBlockPlace($arena),new NoDropItem($arena), new NoPickUpItem($arena));
|
||||
|
||||
@ -68,11 +84,11 @@ class SurvivalGames implements Game {
|
||||
|
||||
new LobbyCountdown( $arena, $gameStateComponent, $worldComponent, GameState::LOBBY, GameState::PRE_GAME, 10, 2);
|
||||
|
||||
//new GameStateCountdown($arena, $gameStateComponent, 5, GameState::LOBBY, GameState::PRE_GAME);
|
||||
|
||||
|
||||
new GameStateCountdown($arena, $gameStateComponent, 20, GameState::PRE_GAME, GameState::GAME);
|
||||
|
||||
//new GameStateCountdown($arena, $gameStateComponent, 5, GameState::GAME, GameState::POST_GAME);
|
||||
|
||||
new LMSVictoryType( $arena, $spectateComponent, $gameStateComponent);
|
||||
|
||||
new GameStateCountdown($arena, $gameStateComponent, 5, GameState::POST_GAME, GameState::RESTARTING);
|
||||
|
@ -20,16 +20,21 @@ use pocketmine\network\protocol\UpdateBlockPacket;
|
||||
|
||||
class UtilTeleport {
|
||||
|
||||
public static function teleport(Player $player, Position $position) {
|
||||
|
||||
/**
|
||||
* @param Player $player
|
||||
* @param Vector3|Position $pos
|
||||
*/
|
||||
public static function teleport(Player $player, Vector3 $pos)
|
||||
{
|
||||
if ($pos instanceof Position)
|
||||
{
|
||||
$current = $player->getPosition();
|
||||
|
||||
//
|
||||
// This CRAZY HACK is to remove Tile entities that seem to linger
|
||||
// whenever you teleport!
|
||||
//
|
||||
|
||||
if ($current->getLevel() != $position->getLevel()) {
|
||||
if ($current->getLevel() != $pos->getLevel()) {
|
||||
$player->noDamageTicks = 20;
|
||||
foreach ($current->getLevel()->getTiles() as $tile) {
|
||||
$pk = new UpdateBlockPacket();
|
||||
@ -41,7 +46,8 @@ class UtilTeleport {
|
||||
$player->dataPacket($pk);
|
||||
}
|
||||
}
|
||||
$player->teleport($position); // Start the teleport
|
||||
return true;
|
||||
}
|
||||
|
||||
$player->teleport($pos);
|
||||
}
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
#Properties Config file
|
||||
#Sat Jul 11 00:36:33 ACT 2015
|
||||
motd=Minecraft: PE Server
|
||||
#Mon Jul 13 05:54:15 ACT 2015
|
||||
motd=Box
|
||||
server-port=19132
|
||||
memory-limit=-1
|
||||
white-list=off
|
||||
@ -13,7 +13,7 @@ spawn-mobs=off
|
||||
gamemode=0
|
||||
force-gamemode=off
|
||||
hardcore=off
|
||||
pvp=off
|
||||
pvp=on
|
||||
difficulty=1
|
||||
generator-settings=
|
||||
level-name=world
|
||||
|
Loading…
Reference in New Issue
Block a user