From 665426e7cf2b16d8d3907bcb7ec245cdbeb90175 Mon Sep 17 00:00:00 2001 From: Ad5001 Date: Sun, 31 Jul 2016 22:46:09 +0300 Subject: [PATCH] Moving forward ! --- games/Example.php | 22 +++++++++++- src/Ad5001/GameManager/Game.php | 35 ++++++++++++------- src/Ad5001/GameManager/GameManager.php | 21 ++++++++--- src/Ad5001/GameManager/Main.php | 11 ++++-- .../GameManager/tasks/SignReloadTask.php | 6 ++-- 5 files changed, 72 insertions(+), 23 deletions(-) diff --git a/games/Example.php b/games/Example.php index 9d3bfc8..ec22694 100644 --- a/games/Example.php +++ b/games/Example.php @@ -5,6 +5,26 @@ use pocketmine\Player; class Example extends Game { public function onGameStart() { - $this->getLogger()->info("Game"); + $this->getLogger()->info("Game started"); + } + + + public function onGameStop() { + $this->getLogger()->info("Game stoped"); + } + + + public function getName() : string { + return "Example"; + } + + + public function getMinPlayers() : int { + return 1; + } + + + public function getMaxPlayers() : int { + return 5; } } \ No newline at end of file diff --git a/src/Ad5001/GameManager/Game.php b/src/Ad5001/GameManager/Game.php index 6dec1db..7318efc 100644 --- a/src/Ad5001/GameManager/Game.php +++ b/src/Ad5001/GameManager/Game.php @@ -24,7 +24,7 @@ abstract class Game { $this->name = $name; $this->main = $this->server->getPlugin("GameManager"); $this->gm = $this->main->getGameManager(); - $this->main->backup($level); + $this->gm->backup($level); } @@ -43,22 +43,33 @@ abstract class Game { } - public function onGameStart(); + abstract public function onGameStart(); - public function onGameStop(); + abstract public function onGameStop(); - public function stopGame() { - $this->main->getGameManager()->reloadLevel($this->level); + public function stop() { + $this->gm->stopGame($this->level); return true; } - public function onJoin(Player $player) {} + public function onJoin(Player $player) { + if($this->getLevel()->getPlayers() >= $this->getMinPlayers() and !$this->isStarted()) { + $this->gm->startGame($this->getLevel()); + } + if($this->getLevel()->getPlayers() <= $this->getMaxPlayers()) { + $player->teleport($this->getServer()->getDefaultLevel()->getDefaultSpawn()); + } + } - public function onQuit(Player $player) {} + public function onQuit(Player $player) { + if($this->getLevel()->getPlayers() <= $this->getMinPlayers()) { + $this->gm->stopGame($this->getLevel()); + } + } public function onInteract(\pocketmine\event\player\PlayerInteract $event) {} @@ -79,21 +90,19 @@ abstract class Game { public function saveDefaultConfig() { + @mkdir($this->main->getDataFolder() . "games/" . $this->name); file_put_contents($this->main->getDataFolder() . "games/$this->name", ""); } - public function getName() : string; + abstract public function getName() : string; - public function getMinPlayers() : int; + abstract public function getMinPlayers() : int; - public function getMaxPlayers() : int; - - - public function useEvent(\pocketmine\event\Event $event) : bool; + abstract public function getMaxPlayers() : int; public function getDataFolder() { diff --git a/src/Ad5001/GameManager/GameManager.php b/src/Ad5001/GameManager/GameManager.php index 5a6dde8..1589dcd 100644 --- a/src/Ad5001/GameManager/GameManager.php +++ b/src/Ad5001/GameManager/GameManager.php @@ -27,10 +27,12 @@ class GameManager { $this->levels = []; $this->startedgames = []; foreach ($files as $file) { - require($this->getDataFolder() . "/games/" . $file); - $classn = getClasses(file_get_contents($this->getDataFolder() . "/games/" . $file)); - $this->games[explode(".php", $file)[0]] = $classn; - @mkdir($this->main->getDataFolder() . "games/" . explode(".php", $file)[0]); + if(!is_dir($this->main->getDataFolder() . "/games/" . $file)) { + require($this->main->getDataFolder() . "/games/" . $file); + $classn = $this->main->getClasses(file_get_contents($this->main->getDataFolder() . "/games/" . $file)); + $this->games[explode(".php", $file)[0]] = $classn; + @mkdir($this->main->getDataFolder() . "games/" . explode(".php", $file)[0]); + } } } @@ -47,6 +49,17 @@ class GameManager { + public function stopGame(Level $level) { + if(isset($this->startedgames[$level->getName()])) { + unset($this->startedgames[$level->getName()]); + $this->levels[$level->getName()]->onGameStop(); + return true; + } + return false; + } + + + public function registerLevel(Level $level, string $game) { if(!array_key_exists($level->getName(), $this->levels)) { if(isset($this->games[$game])) { diff --git a/src/Ad5001/GameManager/Main.php b/src/Ad5001/GameManager/Main.php index c6057c4..8f4e22c 100644 --- a/src/Ad5001/GameManager/Main.php +++ b/src/Ad5001/GameManager/Main.php @@ -7,8 +7,10 @@ use pocketmine\event\player\PlayerInteractEvent; use pocketmine\plugin\PluginBase; use pocketmine\Server; use pocketmine\level\Level; +use pocketmine\block\Block; use pocketmine\Player; use Ad5001\GameManager\GameManager; +use Ad5001\GameManager\tasks\SignReloadTask; class Main extends PluginBase implements Listener { @@ -23,6 +25,7 @@ class Main extends PluginBase implements Listener { @mkdir($this->getServer()->getFilePath() . "worldsBackups/"); @mkdir($this->getDataFolder() . "games"); $this->manager = new GameManager($this); + $this->getServer()->getScheduler()->scheduleRepeatingTask(new SignReloadTask($this), 5); foreach(array_diff_key($this->getConfig()->getAll(), ["Game1" => "", "Game2" => "", "InGame3" => "", "InGame4" => "", "GameWait3" => "", "GameWait4" => ""]) as $worldname => $gamename) { if($this->getServer()->getLevelByName($worldname) instanceof Level) { $this->manager->registerLevel($this->getServer()->getLevelByName($worldname), $gamename); @@ -32,8 +35,10 @@ class Main extends PluginBase implements Listener { public function onInteract(PlayerInteractEvent $event) { - if($event->getBlock() instanceof \pocketmine\block\SignPost and $event->getBlock() instanceof \pocketmine\block\WallSign) { - $t = $event->getBlock()->getLevel()->getTile($block); + // echo "Interacted"; + if($event->getBlock()->getId() == Block::SIGN_POST and $event->getBlock()->getId() == Block::WALL_SIGN) { + $t = $event->getBlock()->getLevel()->getTile($event->getBlock()); + echo "Sign."; if(str_ireplace("{game}", $class->getName(), $this->getConfig()->get("Game1")) == $t->getText()[0]) { $lvlex = explode("{level}", $this->getConfig()->get("Game2")); $lvl = str_ireplace($lvlex[0], "", $t->getText()[1]); @@ -72,7 +77,7 @@ class Main extends PluginBase implements Listener { public function getClasses(string $file) { - $tokens = token_get_all($php_file); + $tokens = token_get_all($file); $class_token = false; foreach ($tokens as $token) { if (is_array($token)) { diff --git a/src/Ad5001/GameManager/tasks/SignReloadTask.php b/src/Ad5001/GameManager/tasks/SignReloadTask.php index fdc845f..020306f 100644 --- a/src/Ad5001/GameManager/tasks/SignReloadTask.php +++ b/src/Ad5001/GameManager/tasks/SignReloadTask.php @@ -1,5 +1,5 @@ server->getLevels() as $level) { foreach($level->getTiles() as $t) { if($t instanceof \pocketmine\tile\Sign) { foreach($this->gameManager->getLevels() as $name => $class) { + echo $class->getLevel()->getName(); if($t->getText()[0] == "[GAME]" and $class->getLevel()->getName() == $t->getText()[1]) { $texts = $t->getText(); foreach($texts as $key => $text) { - $texts[$key] = str_ireplace("{players}", count($class->getLevel()->getPlayers()), str_ireplace("{max}", $class->getMaxPlayers(), str_ireplace("{game}", $class->getName(), str_ireplace("{level}", $class->getLevel()->getName(), )))) + $texts[$key] = str_ireplace("{players}", count($class->getLevel()->getPlayers()), str_ireplace("{max}", $class->getMaxPlayers(), str_ireplace("{game}", $class->getName(), str_ireplace("{level}", $class->getLevel()->getName(), $text)))); } $t->setText($texts[0], $texts[1], $texts[2], $texts[3]); }