2017-03-04 16:44:42 +00:00
< ? php
# _ _ _ _ _ _____ _
# | | | | (_) | | /\ | | / ____| | |
# | |__| | _ __| | ___ / \ _ __ __| | | (___ ___ ___ | | __
# | __ | | | / _` | / _ \ / /\ \ | '_ \ / _` | \___ \ / _ \ / _ \ | |/ /
# | | | | | | | (_| | | __/ / ____ \ | | | | | (_| | ____) | | __/ | __/ | <
# |_| |_| |_| \__,_| \___| /_/ \_\ |_| |_| \__,_| |_____/ \___| \___| |_|\_\
#
#
# The original minigame, free, and better than ever !
# @author Ad5001
# @link ad5001.eu
namespace Ad5001\HideAndSeek ;
use pocketmine\command\CommandSender ;
use pocketmine\command\Command ;
use pocketmine\event\Listener ;
use pocketmine\plugin\PluginBase ;
2017-03-17 10:45:40 +00:00
use pocketmine\nbt\tag\ListTag ;
use pocketmine\nbt\tag\StringTag ;
2017-03-04 16:44:42 +00:00
use pocketmine\Server ;
use pocketmine\Player ;
2017-03-17 10:45:40 +00:00
use Ad5001\HideAndSeek\tasks\SignsTask ;
2017-03-04 16:44:42 +00:00
class Main extends PluginBase implements Listener {
const PREFIX = " §a§l§o[§r§l§2Hide§eAnd§6Seek§o§a] §r§f " ;
protected $db ;
protected $gamemanager ;
2017-03-17 10:45:40 +00:00
protected $setsignsession = [];
2017-03-04 16:44:42 +00:00
/*
Called when the plugin enables
*/
public function onEnable () {
$this -> saveDefaultConfig ();
$this -> getServer () -> getPluginManager () -> registerEvents ( $this , $this );
//Database setup
$this -> db = new DataBase ( $this -> getDatafolder () . " base.db " );
if ( $this -> db -> query ( " PRAGMA table_info(Games); " ) -> num_rows == 0 ) {
2017-03-05 12:43:55 +00:00
$this -> db -> exec ( <<< A
2017-03-04 16:44:42 +00:00
CREATE TABLE Games (
name VARCHAR ( 128 ) NOT NULL ,
spawnpoint VARCHAR ( 128 ) NOT NULL ,
seekerspawn VARCHAR ( 128 ) NOT NULL ,
max_players INT NOT NULL ,
waiting_time INT NOT NULL ,
seek_time INT NOT NULL ,
2017-03-05 12:43:55 +00:00
seekers_percentage INT NOT NULL ,
Id INT PRIMARY KEY
2017-03-04 16:44:42 +00:00
)
A
);
}
$this -> gamemanager = new GameManager ();
2017-03-17 10:45:40 +00:00
//$this->getServer()->getScheduler()->scheduleRepeatingTask(new SignsTask($this), 10);
2017-03-04 16:44:42 +00:00
}
/*
Called when one of the defined commands of the plugin has been called
@ param $sender \pocketmine\command\CommandSender
@ param $cmd \pocketmine\command\Command
@ param $label mixed
@ param $args array
return bool
*/
public function onCommand ( \pocketmine\command\CommandSender $sender , \pocketmine\command\Command $cmd , $label , array $args ) : bool {
switch ( $cmd -> getName ()) {
case " hideandseek " :
if ( isset ( $args [ 0 ])) {
2017-03-05 20:56:04 +00:00
$game = $this -> getGameManager () -> getGameByLevel ( $sender -> getLevel ());
2017-03-04 16:44:42 +00:00
switch ( strtolower ( $args [ 0 ])) {
case " creategame " :
case " addgame " :
if ( $sender -> getLevel () -> getName () == $this -> getLobbyWorld () -> getName ()) {
2017-03-05 12:43:55 +00:00
$sender -> sendMessage ( self :: PREFIX . " §cCould not create game ! You're in the lobby level. " );
2017-03-04 16:44:42 +00:00
return true ;
} elseif ( ! is_null ( $this -> getGameManager () -> getGameByLevel ( $sender -> getLevel ()))) {
2017-03-05 12:43:55 +00:00
$sender -> sendMessage ( self :: PREFIX . " §cThis level is already an hide and seek game. " );
2017-03-04 16:44:42 +00:00
return true ;
} else {
2017-03-05 12:43:55 +00:00
$this -> getGameManager () -> hey = new Game ( $sender -> getLevel ()); // Doesn't care 'bout the name set. It customùly sets it.
$sender -> sendMessage ( self :: PREFIX . " §cSuccefully created hide and seek game in level { $sender -> getLevel () -> getName () } . " );
2017-03-04 16:44:42 +00:00
return true ;
}
break ;
case " deletegame " :
case " delgame " :
if ( ! is_null ( $game )) {
2017-03-05 12:43:55 +00:00
unset ( $this -> getGameManager () -> { $sender -> getLevel () -> getName ()});
$sender -> sendMessage ( self :: PREFIX . " §cSuccefully deleted hide and seek game in level { $sender -> getLevel () -> getName () } . " );
2017-03-04 16:44:42 +00:00
return true ;
} else {
2017-03-05 12:43:55 +00:00
$sender -> sendMessage ( self :: PREFIX . " §cYou're not in an hide and seek game world. " );
2017-03-04 16:44:42 +00:00
}
break ;
case " setmaxplayers " :
case " smp " :
if ( ! is_null ( $game )) {
2017-03-17 11:20:02 +00:00
if ( isset ( $args [ 1 ]) && ( int ) $args [ 1 ] > 1 ) {
$game -> setMaxPlayers (( int ) $args [ 1 ]);
2017-03-05 12:43:55 +00:00
$sender -> sendMessage ( self :: PREFIX . " §cSuccefully set maximum amount of players of hide and seek game in level { $sender -> getLevel () -> getName () } to { $args [ 1 ] } . " );
2017-03-04 16:44:42 +00:00
} else {
2017-03-05 12:43:55 +00:00
$sender -> sendMessage ( " §cUsage: /hideandseek setmaxplayers <max amount> " );
2017-03-04 16:44:42 +00:00
}
return true ;
} else {
2017-03-05 12:43:55 +00:00
$sender -> sendMessage ( self :: PREFIX . " §cYou're not in an hide and seek game world. " );
2017-03-04 16:44:42 +00:00
}
break ;
case " setseekerspercentage " :
case " ssp " :
if ( ! is_null ( $game )) {
2017-03-17 10:45:40 +00:00
if ( isset ( $args [ 1 ]) && ( int ) $args [ 1 ] > 0 && ( int ) $args [ 1 ] < 100 ) {
$game -> setSeekersPercentage (( int ) $args [ 1 ]);
2017-03-17 11:20:02 +00:00
$sender -> sendMessage ( self :: PREFIX . " §cSuccefully set seekers percentage of hide and seek game in level { $sender -> getLevel () -> getName () } to { $args [ 1 ] } %. " );
2017-03-04 16:44:42 +00:00
} else {
2017-03-05 12:43:55 +00:00
$sender -> sendMessage ( " §cUsage: /hideandseek setseekerspercentage <percentage> " );
2017-03-04 16:44:42 +00:00
}
return true ;
} else {
2017-03-05 12:43:55 +00:00
$sender -> sendMessage ( self :: PREFIX . " §cYou're not in an hide and seek game world. " );
2017-03-04 16:44:42 +00:00
}
break ;
case " setwaitingtime " :
case " setwaittime " :
case " swt " :
if ( ! is_null ( $game )) {
2017-03-17 11:20:02 +00:00
if ( isset ( $args [ 1 ]) && ( int ) $args [ 1 ] > 0 ) {
2017-03-04 16:44:42 +00:00
$game -> setWaitTime ( $args [ 1 ]);
2017-03-05 12:43:55 +00:00
$sender -> sendMessage ( self :: PREFIX . " §cSuccefully set waiting time of hide and seek game in level { $sender -> getLevel () -> getName () } to { $args [ 1 ] } . " );
2017-03-04 16:44:42 +00:00
} else {
2017-03-05 12:43:55 +00:00
$sender -> sendMessage ( " §cUsage: /hideandseek setwaittime <seconds to wait> " );
2017-03-04 16:44:42 +00:00
}
return true ;
} else {
2017-03-05 12:43:55 +00:00
$sender -> sendMessage ( self :: PREFIX . " §cYou're not in an hide and seek game world. " );
2017-03-04 16:44:42 +00:00
}
break ;
case " setseektime " :
case " sst " :
if ( ! is_null ( $game )) {
2017-03-17 11:20:02 +00:00
if ( isset ( $args [ 1 ]) && ( int ) $args [ 1 ] > 0 ) {
2017-03-04 16:44:42 +00:00
$game -> setSeekTime ( $args [ 1 ]);
2017-03-05 12:43:55 +00:00
$sender -> sendMessage ( self :: PREFIX . " §cSuccefully set seeking time of hide and seek game in level { $sender -> getLevel () -> getName () } to { $args [ 1 ] } . " );
2017-03-04 16:44:42 +00:00
} else {
2017-03-05 12:43:55 +00:00
$sender -> sendMessage ( " §cUsage: /hideandseek setseektime <minutes of seeking> " );
2017-03-04 16:44:42 +00:00
}
return true ;
} else {
2017-03-05 12:43:55 +00:00
$sender -> sendMessage ( self :: PREFIX . " §cYou're not in an hide and seek game world. " );
2017-03-04 16:44:42 +00:00
}
break ;
case " setspawn " :
case " ss " :
$pos = new \pocketmine\math\Vector3 ( $sender -> x , $sender -> y , $sender -> z );
if ( ! is_null ( $game )) {
2017-03-05 12:43:55 +00:00
$game -> setSpawn ( $pos );
$sender -> sendMessage ( self :: PREFIX . " §cSuccefully set spawn of hide and seek game in level { $sender -> getLevel () -> getName () } to x: $pos->x , y: $pos->y , z: $pos->z . " );
2017-03-04 16:44:42 +00:00
return true ;
} else {
2017-03-05 12:43:55 +00:00
$sender -> sendMessage ( self :: PREFIX . " §cYou're not in an hide and seek game world. " );
2017-03-04 16:44:42 +00:00
}
break ;
case " setseekersspawn " :
case " sss " :
$pos = new \pocketmine\math\Vector3 ( $sender -> x , $sender -> y , $sender -> z );
if ( ! is_null ( $game )) {
2017-03-05 12:43:55 +00:00
$game -> setSeekersSpawn ( $pos );
$sender -> sendMessage ( self :: PREFIX . " §cSuccefully set seekers spawn of hide and seek game in level { $sender -> getLevel () -> getName () } to x: $pos->x , y: $pos->y , z: $pos->z . " );
2017-03-04 16:44:42 +00:00
return true ;
} else {
2017-03-05 12:43:55 +00:00
$sender -> sendMessage ( self :: PREFIX . " §cYou're not in an hide and seek game world. " );
2017-03-04 16:44:42 +00:00
}
break ;
2017-03-05 20:56:04 +00:00
case " editmode " : //TODO: Mode to edit the map (doesn't let players joining exept if they have a permission & enables block placing and breaking)
2017-03-05 17:51:46 +00:00
break ;
2017-03-05 20:56:04 +00:00
case " start " :
if ( ! is_null ( $game )) {
if ( count ( $game -> getPlayers ()) > 1 ) {
$game -> start ();
foreach ( array_merge ( $game -> getPlayers (), $game -> getSpectators ()) as $p ) {
2017-03-17 10:45:40 +00:00
$p -> sendMessage ( Main :: PREFIX . " §aGame started ! There is { $game -> getSeekersCount () } seekers and { $game -> getHidersLeft () } hiders. " );
if ( $p -> HideAndSeekRole == Game :: ROLE_SEEK ) {
$p -> teleport ( $game -> getSeekersSpawn ());
} elseif ( $p -> HideAndSeekRole == Game :: ROLE_HIDE ) {
2017-03-05 20:56:04 +00:00
$p -> teleport ( $game -> getSpawn ());
2017-03-17 10:45:40 +00:00
$p -> sendMessage ( " §lHider: You have 1 minute to hide yourself so seekers won't find you ! Don't get caught for " . $game -> getSeekTime () . " minutes to win ! " );
2017-03-05 20:56:04 +00:00
}
}
2017-03-05 21:01:59 +00:00
} else {
$sender -> sendMessage ( self :: PREFIX . " §cThere must be atleast 2 players in your game to force start it. " );
2017-03-05 20:56:04 +00:00
}
return true ;
} else {
$sender -> sendMessage ( self :: PREFIX . " §cYou're not in an hide and seek game world. " );
}
break ;
case " stop " :
if ( ! is_null ( $game )) {
$sender -> sendMessage ( self :: PREFIX . " §aStoping game.... " );
2017-03-06 19:01:02 +00:00
$game -> step = Game :: STEP_WIN ;
2017-03-05 20:56:04 +00:00
return true ;
} else {
$sender -> sendMessage ( self :: PREFIX . " §cYou're not in an hide and seek game world. " );
}
2017-03-17 10:45:40 +00:00
break ;
2017-03-17 11:20:02 +00:00
// case "setsign":
// if(!isset($args[1])) {
// $sender->sendMessage(self::PREFIX . "§cUsage: /hideandseek setsign <game level>");
// return true;
// }
// $game = $this->getGameManager()->getGameByName($args[1]);
// if($game == null) {
// $sender->sendMessage(self::PREFIX . "§cGame level $args[1] not found.");
// return true;
// }
// $this->setsignsession[$sender->getName()] = $args[1];
// $sender->sendMessage(self::PREFIX . "§aTap a sign to create the teleportation sign to game $args[1].");
// return true;
// break;
2017-03-05 12:43:55 +00:00
default :
$sender -> sendMessage ( str_ireplace ( PHP_EOL , PHP_EOL . self :: PREFIX , self :: PREFIX . " §cSub-command { $args [ 0 ] } not found !
Possible subcommands :
- creategame ( or addgame ) : Creates a hide and seek
- deletegame ( or delgame ) : Deletes the hide and seek
- setmaxplayers < number of players > ( or smp ) : Sets the maximum number of players
- setseekerspercentage < percentage > ( or ssp ) : Sets the percentage of players that will be seekers
- setwaittime < seconds to wait > ( or swt ) : Sets the waiting time of players when 75 percents of the maximum players joined and the game starts
- setseektime < minutes to seek > ( or sst ) : Sets the time seekers have to find all hiders before hiders wins
- setspawn ( or ss ) : Sets the spawn of the place players will wait , hide , and seek
- setseekersspawn ( or sss ) : Sets the place where players will be tped to while hiders are hiding
2017-03-05 20:56:04 +00:00
- start : Force start the game
- stop : Force stop the game
2017-03-05 12:43:55 +00:00
Please note that all those subcommands are relative to the world where you execute the command in . " ));
2017-03-05 17:51:46 +00:00
break ;
2017-03-04 16:44:42 +00:00
}
return true ;
} else {
return false ;
}
break ;
}
}
# _____ _____
# /\ | __ \ |_ _|
# / \ | |__) | | |
# / /\ \ | ___/ | |
# / ____ \ | | _| |_
# /_/ \_\ |_| |_____|
/*
Returns the db .
@ return \Ad5001\HideAndSeek\Database
*/
public function getDatabase () : Database {
return $this -> db ;
}
/*
Returns the game manager .
@ param
@ return GameManager
*/
public function getGameManager () : GameManager {
return $this -> gamemanager ;
}
/*
Returns the max players in a game .
@ return int
*/
public function getMaxPlayers () : int {
return ( int ) $this -> getConfig () -> get ( " Max players " );
}
/*
Returns the time to wait between 75 % of max players joined and the game start ( ending filling if needed )
@ return int
*/
public function getWaitTime () : int {
return ( int ) $this -> getConfig () -> get ( " Waiting time " );
}
/*
Returns the time that the seekers have to find all hiders ( used to balance with the max players )
@ return int
*/
public function getSeekTime () : int {
return ( int ) $this -> getConfig () -> get ( " Seeking time " );
}
/*
Returns the world players should be tped to when game ends
@ return \pocketmine\level\Level
*/
public function getLobbyWorld () : \pocketmine\level\Level {
return $this -> getServer () -> getLevelByName ( $this -> getConfig () -> get ( " Lobby world " )) ? ? $this -> getServer () -> getDefaultLevel ();
}
/*
Returns the percentage of the players that should be hunters .
@ return int
*/
public function getSeekersPercentage () : int {
return ( int ) $this -> getConfig () -> get ( " Seekers percentage " );
}
# ______ _
# | ____| | |
# | |__ __ __ ___ _ __ | |_ ___
# | __| \ \ / / / _ \ | '_ \ | __| / __|
# | |____ \ V / | __/ | | | | | |_ \__ \
# |______| \_/ \___| |_| |_| \__| |___/
#
#
/*
Check when a level loads to check if it ' s a game and then add it
@ param $event \pocketmine\event\level\LevelLoadEvent
*/
public function onLevelLoad ( \pocketmine\event\level\LevelLoadEvent $event ) {
2017-03-05 12:43:55 +00:00
$this -> getGameManager () -> refreshRegisterGames ( $this -> getDatabase ());
2017-03-04 16:44:42 +00:00
}
2017-03-17 10:45:40 +00:00
/*
Checks when a player interacts . Used to set signs and tp to the world that the sign reports to .
@ param $event \pocketmine\event\player\PlayerInteractEvent
*/
public function onInteract ( \pocketmine\event\player\PlayerInteractEvent $event ) {
$t = $event -> getBlock () -> getLevel () -> getTile ( $event -> getBlock ());
if ( $t instanceof \pocketmine\tile\Sign ) {
if ( isset ( $this -> setsignsession [ $event -> getPlayer () -> getName ()])) {
$game = $this -> getGameManager () -> getGameByName ( $this -> setsignsession [ $event -> getPlayer () -> getName ()]);
$name = $this -> setsignsession [ $event -> getPlayer () -> getName ()];
unset ( $this -> setsignsession [ $event -> getPlayer () -> getName ()]);
if ( ! ( $game instanceof Game )) {
$event -> getPlayer () -> sendMessage ( self :: PREFIX . " §cSelected game ( $name ) doesn't exists anymore. Did you deleted it ? " );
return true ;
}
safe_var_dump ( $t );
$t -> namedtag -> hideAndSeekSignData = new ListTag ( " hideAndSeekSignData " , [
" levelName " => new StringTag ( " levelName " , $game -> getName ())
]);
$t -> namedtag -> hideAndSeekSignData -> levelName = new StringTag ( " levelName " , $game -> getName ());
$event -> getPlayer () -> sendMessage ( self :: PREFIX . " Succefully set this sign to point to world $name . " );
}
}
}
}