2016-07-28 06:39:24 +00:00
< ? php
namespace Ad5001\GameManager ;
use pocketmine\command\CommandSender ;
use pocketmine\command\Command ;
use pocketmine\event\Listener ;
2016-07-31 09:17:15 +00:00
use pocketmine\event\player\PlayerInteractEvent ;
2016-07-28 06:39:24 +00:00
use pocketmine\plugin\PluginBase ;
use pocketmine\Server ;
2016-07-31 10:25:30 +00:00
use pocketmine\level\Level ;
2016-07-31 19:46:09 +00:00
use pocketmine\block\Block ;
2016-08-02 07:25:31 +00:00
use pocketmine\event\entity\EntityLevelChangeEvent ;
2016-07-28 06:39:24 +00:00
use pocketmine\Player ;
2016-07-31 19:46:09 +00:00
use Ad5001\GameManager\tasks\SignReloadTask ;
2016-07-28 06:39:24 +00:00
2016-07-31 09:17:15 +00:00
class Main extends PluginBase implements Listener {
2016-07-28 06:39:24 +00:00
2016-07-31 07:27:54 +00:00
protected $manager ;
2016-07-28 06:39:24 +00:00
public function onEnable (){
$this -> reloadConfig ();
$this -> getServer () -> getPluginManager () -> registerEvents ( $this , $this );
2016-07-31 07:27:54 +00:00
@ mkdir ( $this -> getServer () -> getFilePath () . " worldsBackups/ " );
2016-07-31 10:25:30 +00:00
@ mkdir ( $this -> getDataFolder () . " games " );
2016-07-28 06:39:24 +00:00
$this -> manager = new GameManager ( $this );
2016-07-31 19:46:09 +00:00
$this -> getServer () -> getScheduler () -> scheduleRepeatingTask ( new SignReloadTask ( $this ), 5 );
2016-08-03 17:02:12 +00:00
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 );
2016-07-31 10:25:30 +00:00
}
}
2016-07-31 09:17:15 +00:00
}
2016-07-28 06:39:24 +00:00
public function onLoad (){
$this -> saveDefaultConfig ();
}
2016-07-31 07:27:54 +00:00
public function getGameManager () {
return $this -> manager ;
}
2016-07-28 06:39:24 +00:00
public function onCommand ( CommandSender $sender , Command $cmd , $label , array $args ){
switch ( $cmd -> getName ()){
2016-08-04 12:35:44 +00:00
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 ) . " . \n Use /games <game_name> to get all the levels of a game. " );
2016-08-08 09:21:52 +00:00
} 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 ());
}
}
}
}
}
2016-08-04 12:35:44 +00:00
} 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 ])) {
2016-08-05 12:31:34 +00:00
$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 );
2016-08-04 12:35:44 +00:00
}
}
}
return true ;
2016-07-28 06:39:24 +00:00
break ;
}
2016-08-04 12:35:44 +00:00
if ( isset ( $this -> cmds [ $cmd -> getName ()])) {
$this -> cmds [ $cmd -> getName ()] -> onCommand ( $sender , $cmd , $label , $args );
}
2016-07-28 06:39:24 +00:00
return false ;
}
2016-08-05 12:31:34 +00:00
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 )) {
2016-08-08 09:21:52 +00:00
$p ++ ;
2016-08-05 12:31:34 +00:00
}
} else {
if ( ! $pl -> isSpectator ()) {
2016-08-08 09:21:52 +00:00
$p ++ ;
2016-08-05 12:31:34 +00:00
}
}
}
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 )) {
2016-08-08 09:21:52 +00:00
$s ++ ;
2016-08-05 12:31:34 +00:00
}
} else {
if ( $pl -> isSpectator ()) {
2016-08-08 09:21:52 +00:00
$s ++ ;
2016-08-05 12:31:34 +00:00
}
}
}
}
2016-07-28 06:39:24 +00:00
public function getClasses ( string $file ) {
2016-07-31 19:46:09 +00:00
$tokens = token_get_all ( $file );
2016-07-28 06:39:24 +00:00
$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 ];
}
}
}
}
2016-08-02 07:25:31 +00:00
2016-08-03 17:02:12 +00:00
public function getLevelByName ( string $name ) {
foreach ( $this -> getServer () -> getLevels () as $level ) {
if ( $level -> getName () == $name ) {
return $level ;
}
}
return null ;
}
2016-08-02 07:25:31 +00:00
############################
# #
# 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 );
2016-08-05 12:31:34 +00:00
if ( $class -> getLevel () -> getName () == $lvl ) {
if ( $this -> manager -> getLevels ()[ $lvl ] -> isStarted ()) {
$event -> getPlayer () -> teleport ( $class -> getLevel () -> getSafeSpawn ());
2016-08-02 07:25:31 +00:00
$event -> getPlayer () -> setGamemode ( 3 );
} else {
2016-08-05 12:31:34 +00:00
$event -> getPlayer () -> teleport ( $class -> getLevel () -> getSafeSpawn ());
2016-08-02 07:25:31 +00:00
}
}
}
}
}
if ( isset ( $this -> manager -> getLevels ()[ $event -> getPlayer () -> getLevel () -> getName ()])) {
$this -> manager -> getLevels ()[ $event -> getPlayer () -> getLevel () -> getName ()] -> onInteract ( $event );
}
}
2016-08-03 17:02:12 +00:00
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 ()));
}
}
2016-08-02 07:25:31 +00:00
public function onEntityLevelChange ( EntityLevelChangeEvent $event ) {
if ( isset ( $this -> manager -> getLevels ()[ $event -> getOrigin () -> getName ()]) and $event -> getEntity () instanceof Player ) {
2016-08-03 17:02:12 +00:00
$this -> manager -> getLevels ()[ $event -> getOrigin () -> getName ()] -> onQuit ( $event -> getEntity ());
2016-08-02 07:25:31 +00:00
}
if ( isset ( $this -> manager -> getLevels ()[ $event -> getTarget () -> getName ()]) and $event -> getEntity () instanceof Player ) {
2016-08-03 17:02:12 +00:00
$this -> manager -> getLevels ()[ $event -> getTarget () -> getName ()] -> onJoin ( $event -> getEntity ());
2016-08-02 07:25:31 +00:00
}
}
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 );
}
}
2016-08-03 09:22:06 +00:00
public function onBlockBreak ( \pocketmine\event\block\BlockBreakEvent $event ) {
2016-08-02 07:25:31 +00:00
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 );
}
}
2016-08-03 09:22:06 +00:00
public function onBlockPlace ( \pocketmine\event\block\BlockPlaceEvent $event ) {
2016-08-02 07:25:31 +00:00
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 );
}
}
2016-08-10 10:55:41 +00:00
public function onProjectileLaunch ( \pocketmine\event\entity\ProjectileLaunchEvent $event ) {
2016-08-08 09:21:52 +00:00
if ( isset ( $this -> manager -> getLevels ()[ $event -> getEntity () -> getLevel () -> getName ()])) {
2016-08-10 10:55:41 +00:00
$this -> manager -> getLevels ()[ $event -> getEntity () -> getLevel () -> getName ()] -> onProjectileLaunch ( $event );
2016-08-08 09:21:52 +00:00
}
}
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 );
}
}
2016-08-02 07:25:31 +00:00
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 );
}
}
2016-08-03 17:02:12 +00:00
public function onServerCommand ( \pocketmine\event\server\ServerCommandEvent $event ) {
2016-08-02 07:25:31 +00:00
foreach ( $this -> manager -> getLevels () as $lvl => $class ) {
$class -> onServerCommand ( $event );
}
}
2016-08-03 09:22:06 +00:00
public function onPlayerJoin ( \pocketmine\event\player\PlayerJoinEvent $event ) {
if ( isset ( $this -> manager -> getLevels ()[ $event -> getPlayer () -> getLevel () -> getName ()])) {
2016-08-04 10:53:57 +00:00
$this -> manager -> getLevels ()[ $event -> getPlayer () -> getLevel () -> getName ()] -> onJoin ( $event -> getPlayer ());
2016-08-03 09:22:06 +00:00
}
}
public function onPlayerQuit ( \pocketmine\event\player\PlayerQuitEvent $event ) {
if ( isset ( $this -> manager -> getLevels ()[ $event -> getPlayer () -> getLevel () -> getName ()])) {
2016-08-03 17:02:12 +00:00
$this -> manager -> getLevels ()[ $event -> getPlayer () -> getLevel () -> getName ()] -> onQuit ( $event -> getPlayer ());
2016-08-03 09:22:06 +00:00
}
}
2016-07-28 06:39:24 +00:00
}