GameManager/src/Ad5001/GameManager/GameManager.php

144 lines
4.3 KiB
PHP
Raw Permalink Normal View History

2016-07-28 06:39:24 +00:00
<?php
namespace Ad5001\GameManager;
use pocketmine\Server;
use pocketmine\Player;
use pocketmine\level\Level;
class GameManager {
2016-07-31 07:27:54 +00:00
protected $main;
protected $server;
protected $games;
protected $levels;
protected $startedgames;
2016-07-28 06:39:24 +00:00
public function __construct(Main $main) {
$this->main = $main;
$this->server = $main->getServer();
2016-07-31 10:25:30 +00:00
$files = array_diff(scandir($main->getDataFolder() . "games"), [".", ".."]);
2016-07-28 06:39:24 +00:00
$this->games = [];
$this->levels = [];
$this->startedgames = [];
foreach ($files as $file) {
2016-08-05 08:36:40 +00:00
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));
2016-08-04 12:35:44 +00:00
$this->games[explode("\\", $classn)[count(explode("\\", $classn)) - 1]] = $classn;
@mkdir($this->main->getDataFolder() . "games/" . explode("\\", $classn)[count(explode("\\", $classn)) - 1]);
2016-07-31 19:46:09 +00:00
}
2016-07-28 06:39:24 +00:00
}
}
public function startGame(Level $level) {
if(isset($this->levels[$level->getName()]) and !isset($this->startedgames[$level->getName()])) {
$this->startedgames[$level->getName()] = true;
$this->levels[$level->getName()]->onGameStart();
return true;
}
return false;
}
2016-07-31 19:46:09 +00:00
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;
}
2016-07-28 06:39:24 +00:00
public function registerLevel(Level $level, string $game) {
if(!array_key_exists($level->getName(), $this->levels)) {
if(isset($this->games[$game])) {
2016-08-01 10:29:14 +00:00
$this->levels[$level->getName()] = new $this->games[$game]($game, $level);
2016-07-28 07:31:52 +00:00
} else {
2016-08-10 10:55:41 +00:00
$this->main->getLogger()->warning("No game found with name $game");
2016-07-28 06:39:24 +00:00
}
2016-08-03 17:02:12 +00:00
} else {
2016-08-10 10:55:41 +00:00
$this->main->getLogger()->warning("{$level->getName()} is already registered.");
2016-07-28 06:39:24 +00:00
}
}
2016-07-28 07:31:52 +00:00
2016-07-31 07:27:54 +00:00
public function getLevels() {
return $this->levels;
}
public function getGames() {
return $this->games;
}
public function getStartedGames() {
return $this->startedgames;
}
2016-07-28 07:31:52 +00:00
2016-07-31 07:27:54 +00:00
public function restoreBackup(Level $level) {
2016-08-03 17:02:12 +00:00
$this->rrmdir($this->server->getFilePath() . "worlds/" . $level->getFolderName());
@mkdir($this->server->getFilePath() . "worlds/{$level->getFolderName()}");
$this->copydir($this->server->getFilePath() . "worldsBackups/{$level->getName()}", $this->server->getFilePath() . "worlds/" . $level->getFolderName());
2016-07-28 07:31:52 +00:00
}
2016-07-31 07:27:54 +00:00
public function backup(Level $level) {
2016-08-01 10:29:14 +00:00
$this->rrmdir($this->server->getFilePath() . "worldsBackups/{$level->getName()}");
2016-08-03 17:02:12 +00:00
@mkdir($this->server->getFilePath() . "worldsBackup/{$level->getName()}");
$this->copydir($this->server->getFilePath() . "worlds/" . $level->getFolderName(), $this->server->getFilePath() . "worldsBackup/{$level->getName()}");
2016-07-31 07:27:54 +00:00
}
2016-07-28 07:31:52 +00:00
private function rrmdir($dir) { // This is from PHP.NET
if (is_dir($dir)) {
$objects = scandir($dir);
foreach ($objects as $object) {
if ($object != "." && $object != "..") {
2016-08-03 17:02:12 +00:00
if (filetype($dir."/".$object) == "dir") $this->rrmdir($dir."/".$object); else unlink($dir."/".$object);
2016-07-28 07:31:52 +00:00
}
}
reset($objects);
rmdir($dir);
}
}
2016-08-04 10:53:57 +00:00
private function copydir($source, $target) {
if (is_dir($source)) {
@mkdir($target);
2016-08-05 08:36:40 +00:00
@mkdir($target . "region");
2016-07-31 07:27:54 +00:00
$d = dir($source);
2016-07-28 07:31:52 +00:00
while ( FALSE !== ( $entry = $d->read() ) ) {
2016-07-31 07:27:54 +00:00
if ($entry == '.' || $entry == '..') {
2016-07-28 07:31:52 +00:00
continue;
}
$Entry = $source . '/' . $entry;
2016-07-31 07:27:54 +00:00
if (is_dir($Entry)) {
2016-08-03 17:02:12 +00:00
$this->copydir($Entry, $target . '/' . $entry);
2016-07-28 07:31:52 +00:00
continue;
}
@copy($Entry, $target . '/' . $entry);
2016-07-28 07:31:52 +00:00
}
$d->close();
} else {
2016-07-31 07:27:54 +00:00
copy($source, $target);
2016-07-28 07:31:52 +00:00
}
}
2016-07-28 06:39:24 +00:00
}