reloadConfig(); $this->getServer()->getPluginManager()->registerEvents($this, $this); @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" => $this->getConfig()->get("Game1"), "Game2" => $this->getConfig()->get("Game2"), "InGame3" => $this->getConfig()->get("InGame3"), "InGame4" => $this->getConfig()->get("InGame4"), "GameWait3" => $this->getConfig()->get("InGame4"), "GameWait4" => $this->getConfig()->get("InGame4")]) as $worldname => $gamename) { $lvl = $this->getLevelByName($worldname); // $this->getLogger()->info(get_class($lvl)); if($lvl instanceof Level) { // $this->getLogger()->info("Registering $worldname"); $this->manager->registerLevel($lvl, $gamename); } } } public function onLoad(){ $this->saveDefaultConfig(); } public function getGameManager() { return $this->manager; } public function onCommand(CommandSender $sender, Command $cmd, $label, array $args){ switch($cmd->getName()){ case "games": if(!isset($args[0])) { $games = []; foreach($this->manager->getGames() as $g) { array_push($games, explode("\\", $g)[count(explode("\\", $g)) - 1]); } $sender->sendMessage("§l§o[§r§lGameManager§o]§r Current existings games: " . implode(", ", $games) . ". \nUse /games to get all the levels of a game."); } elseif($args[0] == "join" or $args[0] == "j") { if(isset($args[1])) { if(isset($this->manager->getLevels()[$args[1]])) { $sender->sendMessage("§l§o§b[§r§a§l{$this->manager->getLevels()[$args[1]]->getName()}§o§b]§r Joining game {$this->manager->getLevels()[$args[1]]->getName()} in world {$this->manager->getLevels()[$args[1]]->getLevel()->getName()}"); $sender->teleport($this->manager->getLevels()[$args[1]]->getLevel()->getSafeSpawn()); } } } elseif($args[0] == "quickjoin" or $args[0] == "qj") { if(isset($args[1])) { if(isset($this->manager->getLevels()[$args[1]])) { foreach($this->manager->getLevels() as $levelname => $game) { if(strtolower($game->getName()) == strtolower($args[1]) and !$game->isStarted()) { $p = $this->getInGamePlayers($game->getLevel()); if($p < $game->getMaxPlayers()) { $sender->sendMessage("§l§o§b[§r§a§l{$game->getName()}§o§b]§r Joining game {$game->getName()} in world {$game->getLevel()->getName()}"); $sender->teleport($game->getLevel()->getSafeSpawn()); } } } } } } else { $sender->sendMessage("§l§o[§r§lGameManager§o]§r Current levels running $args[0]:"); foreach($this->manager->getLevels() as $levelname => $game) { if(strtolower($game->getName()) == strtolower($args[0])) { $p = $this->getInGamePlayers($game->getLevel()); $s = $this->getSpectators($game->getLevel()); $sender->sendMessage("§l§o[§r§lGameManager§o]§r§a " . $levelname . " Is started: " . $game->isStarted() . " Players: " . $p . " Spectators: " . $s); } } } return true; break; } if(isset($this->cmds[$cmd->getName()])) { $this->cmds[$cmd->getName()]->onCommand($sender, $cmd, $label, $args); } return false; } public function getInGamePlayers(Level $level) { $p = 0; foreach($level->getPlayers() as $pl) { if($this->getServer()->getPluginManager()->getPlugin("SpectatorPlus") !== null) { if(!$this->getServer()->getPluginManager()->getPlugin("SpectatorPlus")->isSpectator($pl)) { $p++; } } else { if(!$pl->isSpectator()) { $p++; } } } return count($p); } public function getSpectators(Level $level) { $s = 0; foreach($level->getPlayers() as $pl) { if($this->getServer()->getPluginManager()->getPlugin("SpectatorPlus") !== null) { if($this->getServer()->getPluginManager()->getPlugin("SpectatorPlus")->isSpectator($pl)) { $s++; } } else { if($pl->isSpectator()) { $s++; } } } } public function getClasses(string $file) { $tokens = token_get_all($file); $class_token = false; foreach ($tokens as $token) { if (is_array($token)) { if ($token[0] == T_CLASS) { $class_token = true; } else if ($class_token && $token[0] == T_STRING) { return $token[1]; } } } } public function getLevelByName(string $name) { foreach($this->getServer()->getLevels() as $level) { if($level->getName() == $name) { return $level; } } return null; } ############################ # # # Events for games # # # ############################ public function onInteract(PlayerInteractEvent $event) { // echo $event->getBlock()->getId() . "=/=" . Block::SIGN_POST ."=/=" . Block::WALL_SIGN; if($event->getBlock()->getId() == Block::SIGN_POST or $event->getBlock()->getId() == Block::WALL_SIGN) { $t = $event->getBlock()->getLevel()->getTile($event->getBlock()); // echo "Sign."; foreach($this->manager->getLevels() as $class) { 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]); $lvl = str_ireplace($lvlex[1], "", $lvl); if($class->getLevel()->getName() == $lvl) { if($this->manager->getLevels()[$lvl]->isStarted()) { $event->getPlayer()->teleport($class->getLevel()->getSafeSpawn()); $event->getPlayer()->setGamemode(3); } else { $event->getPlayer()->teleport($class->getLevel()->getSafeSpawn()); } } } } } if(isset($this->manager->getLevels()[$event->getPlayer()->getLevel()->getName()])) { $this->manager->getLevels()[$event->getPlayer()->getLevel()->getName()]->onInteract($event); } } public function onLevelLoad(\pocketmine\event\level\LevelLoadEvent $event) { if($this->getConfig()->get($event->getLevel()->getName()) !== null) { $this->manager->registerLevel($event->getLevel(), $this->getConfig()->get($event->getLevel()->getName())); } } public function onEntityLevelChange(EntityLevelChangeEvent $event) { if(isset($this->manager->getLevels()[$event->getOrigin()->getName()]) and $event->getEntity() instanceof Player) { $this->manager->getLevels()[$event->getOrigin()->getName()]->onQuit($event->getEntity()); } if(isset($this->manager->getLevels()[$event->getTarget()->getName()]) and $event->getEntity() instanceof Player) { $this->manager->getLevels()[$event->getTarget()->getName()]->onJoin($event->getEntity()); } } public function onPlayerChat(\pocketmine\event\player\PlayerChatEvent $event) { if(isset($this->manager->getLevels()[$event->getPlayer()->getLevel()->getName()])) { $this->manager->getLevels()[$event->getPlayer()->getLevel()->getName()]->onPlayerChat($event); $this->manager->getLevels()[$event->getPlayer()->getLevel()->getName()]->onChat($event); } } public function onPlayerCommandPreprocess(\pocketmine\event\player\PlayerCommandPreprocessEvent $event) { if(isset($this->manager->getLevels()[$event->getPlayer()->getLevel()->getName()])) { $this->manager->getLevels()[$event->getPlayer()->getLevel()->getName()]->onPlayerCommand($event); } } public function onPlayerDeath(\pocketmine\event\player\PlayerDeathEvent $event) { if(isset($this->manager->getLevels()[$event->getPlayer()->getLevel()->getName()])) { $this->manager->getLevels()[$event->getPlayer()->getLevel()->getName()]->onPlayerDeath($event); $this->manager->getLevels()[$event->getPlayer()->getLevel()->getName()]->onDeath($event); } } public function onPlayerDropItem(\pocketmine\event\player\PlayerDropItemEvent $event) { if(isset($this->manager->getLevels()[$event->getPlayer()->getLevel()->getName()])) { $this->manager->getLevels()[$event->getPlayer()->getLevel()->getName()]->onPlayerDropItem($event); $this->manager->getLevels()[$event->getPlayer()->getLevel()->getName()]->onDrop($event); } } public function onPlayerMove(\pocketmine\event\player\PlayerMoveEvent $event) { if(isset($this->manager->getLevels()[$event->getPlayer()->getLevel()->getName()])) { $this->manager->getLevels()[$event->getPlayer()->getLevel()->getName()]->onPlayerMove($event); $this->manager->getLevels()[$event->getPlayer()->getLevel()->getName()]->onMove($event); } } public function onPlayerItemConsume(\pocketmine\event\player\PlayerItemConsumeEvent $event) { if(isset($this->manager->getLevels()[$event->getPlayer()->getLevel()->getName()])) { $this->manager->getLevels()[$event->getPlayer()->getLevel()->getName()]->onPlayerItemConsume($event); $this->manager->getLevels()[$event->getPlayer()->getLevel()->getName()]->onItemConsume($event); } } public function onPlayerItemHeld(\pocketmine\event\player\PlayerItemHeldEvent $event) { if(isset($this->manager->getLevels()[$event->getPlayer()->getLevel()->getName()])) { $this->manager->getLevels()[$event->getPlayer()->getLevel()->getName()]->onPlayerItemHeld($event); $this->manager->getLevels()[$event->getPlayer()->getLevel()->getName()]->onItemHeld($event); } } public function onBlockBreak(\pocketmine\event\block\BlockBreakEvent $event) { if(isset($this->manager->getLevels()[$event->getPlayer()->getLevel()->getName()])) { $this->manager->getLevels()[$event->getPlayer()->getLevel()->getName()]->onBlockBreak($event); $this->manager->getLevels()[$event->getPlayer()->getLevel()->getName()]->onBreak($event); } } public function onBlockPlace(\pocketmine\event\block\BlockPlaceEvent $event) { if(isset($this->manager->getLevels()[$event->getPlayer()->getLevel()->getName()])) { $this->manager->getLevels()[$event->getPlayer()->getLevel()->getName()]->onBlockPlace($event); $this->manager->getLevels()[$event->getPlayer()->getLevel()->getName()]->onPlace($event); } } public function onEntityDamage(\pocketmine\event\entity\EntityDamageEvent $event) { if(isset($this->manager->getLevels()[$event->getEntity()->getLevel()->getName()])) { $this->manager->getLevels()[$event->getEntity()->getLevel()->getName()]->onEntityDamage($event); } } public function onProjectileLaunch(\pocketmine\event\entity\ProjectileLaunchEvent $event) { if(isset($this->manager->getLevels()[$event->getEntity()->getLevel()->getName()])) { $this->manager->getLevels()[$event->getEntity()->getLevel()->getName()]->onProjectileLaunch($event); } } public function onProjectileHit(\pocketmine\event\entity\ProjectileHitEvent $event) { if(isset($this->manager->getLevels()[$event->getEntity()->getLevel()->getName()])) { $this->manager->getLevels()[$event->getEntity()->getLevel()->getName()]->onProjectileHit($event); } } public function onDataPacketReceive(\pocketmine\event\server\DataPacketReceiveEvent $event) { if(isset($this->manager->getLevels()[$event->getPlayer()->getLevel()->getName()])) { $this->manager->getLevels()[$event->getPlayer()->getLevel()->getName()]->onDataPacketReceive($event); } } public function onDataPacketSend(\pocketmine\event\server\DataPacketSendEvent $event) { if(isset($this->manager->getLevels()[$event->getPlayer()->getLevel()->getName()])) { $this->manager->getLevels()[$event->getPlayer()->getLevel()->getName()]->onDataPacketSend($event); } } public function onServerCommand(\pocketmine\event\server\ServerCommandEvent $event) { foreach($this->manager->getLevels() as $lvl => $class) { $class->onServerCommand($event); } } public function onPlayerJoin(\pocketmine\event\player\PlayerJoinEvent $event) { if(isset($this->manager->getLevels()[$event->getPlayer()->getLevel()->getName()])) { $this->manager->getLevels()[$event->getPlayer()->getLevel()->getName()]->onJoin($event->getPlayer()); } } public function onPlayerQuit(\pocketmine\event\player\PlayerQuitEvent $event) { if(isset($this->manager->getLevels()[$event->getPlayer()->getLevel()->getName()])) { $this->manager->getLevels()[$event->getPlayer()->getLevel()->getName()]->onQuit($event->getPlayer()); } } }