2016-06-10 05:19:40 +00:00
< ? php
# _ _ _ _ _____
# | | | | | | |/ ____|
# | | | | |__| | |
# | | | | __ | |
# | |__| | | | | |____
# \____/|_| |_|\_____|
# The most customisable UHC plugin for Minecraft PE !
namespace Ad5001\UHC ;
use pocketmine\command\CommandSender ;
use pocketmine\command\Command ;
use pocketmine\event\Listener ;
use pocketmine\Server ;
use pocketmine\event\player\PlayerDeathEvent ;
use pocketmine\event\player\PlayerChatEvent ;
use pocketmine\event\player\PlayerQuitEvent ;
use pocketmine\event\player\PlayerRespawnEvent ;
use pocketmine\event\entity\EntityRegainHealthEvent ;
2016-08-20 16:24:35 +00:00
use Ad5001\UHC\event\GameStopEvent ;
2016-06-10 14:00:18 +00:00
use pocketmine\level\Level ;
use pocketmine\plugin\Plugin ;
use pocketmine\math\Vector3 ;
2016-06-10 05:19:40 +00:00
use pocketmine\utils\TextFormat as C ;
use pocketmine\Player ;
use Ad5001\UHC\UHCWorld ;
use Ad5001\UHC\task\StopResTask ;
use Ad5001\UHC\Main ;
use Ad5001\UHC\event\GameStartEvent ;
class UHCGame implements Listener {
public function __construct ( Plugin $plugin , UHCWorld $world ) {
$this -> m = $plugin ;
$this -> world = $world ;
2016-08-20 07:24:06 +00:00
$plugin -> getServer () -> getPluginManager () -> registerEvents ( $this , $plugin );
2016-06-10 14:00:18 +00:00
$this -> players = $world -> getLevel () -> getPlayers ();
$event = new GameStartEvent ( $this , $world , $this -> players );
$this -> m -> getServer () -> getPluginManager () -> callEvent ( $event );
2016-06-10 05:19:40 +00:00
$this -> cancelled = false ;
$this -> kills = [];
if ( $event -> isCancelled ()) {
$this -> cancelled = true ;
} else {
$radius = $world -> radius ;
foreach ( $this -> players as $player ) {
2016-06-10 14:00:18 +00:00
$x = rand ( $radius + $world -> getLevel () -> getSpawnLocation () -> x , $world -> getLevel () -> getSpawnLocation () -> x - $radius );
$z = rand ( $radius + $world -> getLevel () -> getSpawnLocation () -> z , $world -> getLevel () -> getSpawnLocation () -> z - $radius );
2016-06-10 05:19:40 +00:00
$pos = new Vector3 ( $x , 128 , $z );
$player -> teleport ( $pos );
$effect = \pocketmine\entity\Effect :: getEffect ( 11 );
2016-06-10 14:00:18 +00:00
$effect -> setDuration ( 30 * 20 );
2016-06-10 05:19:40 +00:00
$effect -> setAmplifier ( 99 );
$effect -> setVisible ( false );
$player -> addEffect ( $effect );
2016-08-20 15:22:44 +00:00
$this -> m -> getServer () -> getScheduler () -> scheduleDelayedTask ( new StopResTask ( $this -> m , $this -> world -> getPlayers ()), 30 * 20 );
2016-06-10 05:19:40 +00:00
$player -> sendMessage ( Main :: PREFIX . C :: GREEN . " Game started ! Good luck { $player -> getName () } ! " );
}
}
}
public function onHeal ( EntityRegainHealthEvent $event ) {
2016-08-20 15:22:44 +00:00
if ( $event -> getEntity () instanceof Player and $event -> getRegainReason () === EntityRegainHealthEvent :: CAUSE_SATURATION and $event -> getEntity () -> getLevel () -> getName () === $this -> world -> getLevel () -> getName ()) { // if player is playing
2016-06-10 05:19:40 +00:00
$event -> setCancelled ();
}
}
2016-08-20 15:22:44 +00:00
public function onGameStart ( \Ad5001\UHC\event\GameStartEvent $event ) {}
public function onGameStop ( \Ad5001\UHC\event\GameStopEvent $event ) {}
2016-06-10 05:19:40 +00:00
public function onRespawn ( PlayerRespawnEvent $event ) {
if ( isset ( $this -> respawn [ $event -> getPlayer () -> getName ()]) and ! $this -> cancelled ) {
$player -> teleport ( $this -> world -> getLevel ());
$player -> setGamemode ( 3 );
unset ( $this -> respawn [ $event -> getPlayer () -> getName ()]);
}
}
public function onPlayerQuit ( PlayerQuitEvent $event ) {
if ( $event -> getPlayer () -> getLevel () -> getName () === $this -> world -> getLevel () -> getName ()) {
$this -> m -> quit [ $event -> getPlayer () -> getName ()] = " { $event -> getPlayer () -> x } / { $event -> getPlayer () -> y } / { $event -> getPlayer () -> z } / { $event -> getPlayer () -> getLevel () -> getName () } / " ;
}
}
public function onPlayerDeath ( PlayerDeathEvent $event ) {
if ( $event -> getPlayer () -> getLevel () -> getName () === $this -> world -> getName () and ! $this -> cancelled ) {
2016-08-20 16:24:35 +00:00
foreach ( $event -> getPlayer () -> getLevel () -> getPlayers () as $p ) {
2016-08-20 16:41:20 +00:00
$p -> sendMessage ( Main :: PREFIX . C :: YELLOW . $event -> getPlayer () -> getName () . " died. " . ( count ( $this -> world -> getLevel () -> getPlayers ) - 2 )) . " players left ! " );
2016-08-20 16:24:35 +00:00
}
2016-06-10 05:19:40 +00:00
$this -> respawn [ $event -> getPlayer () -> getName ()] = true ;
$pls = [];
foreach ( $this -> players as $pl ) {
array_push ( $pls , $pl );
}
$cause = $event -> getEntity () -> getLastDamageCause ();
if ( $cause instanceof \pocketmine\event\entity\EntityDamageByEntityEvent ){
$killer = $cause -> getDamager ();
if ( $killer instanceof Player ){
if ( isset ( $this -> kills [ $killer -> getName ()])) {
$this -> kills [ $killer -> getName ()] ++ ;
} else {
$this -> kills [ $killer -> getName ()] = 1 ;
}
} else {
if ( isset ( $this -> kills [ C :: GREEN . " P " . C :: BLUE . " v " . C :: RED . " E " ])) {
$this -> kills [ C :: GREEN . " P " . C :: BLUE . " v " . C :: RED . " E " ] ++ ;
} else {
$this -> kills [ C :: GREEN . " P " . C :: BLUE . " v " . C :: RED . " E " ] = 1 ;
}
}
} else {
if ( isset ( $this -> kills [ C :: GREEN . " P " . C :: BLUE . " v " . C :: RED . " E " ])) {
$this -> kills [ C :: GREEN . " P " . C :: BLUE . " v " . C :: RED . " E " ] ++ ;
} else {
$this -> kills [ C :: GREEN . " P " . C :: BLUE . " v " . C :: RED . " E " ] = 1 ;
}
}
if ( count ( $pls === 1 )) {
$this -> stop ( $pls [ 0 ]);
}
}
}
public function stop ( Player $winner ) {
if ( ! $this -> cancelled ) {
2016-08-20 16:24:35 +00:00
$this -> m -> getServer () -> getPluginManager () -> callEvent ( $event = new GameStopEvent ( $this , $this -> world , $winner ));
2016-06-10 05:19:40 +00:00
if ( ! $event -> isCancelled ()) {
foreach ( $this -> players as $player ) {
2016-08-20 16:41:20 +00:00
$player -> sendMessage ( Main :: PREFIX . C :: YELLOW . $winner -> getName () . " won the game ! Teleporting back to lobby... " );
2016-08-20 16:24:35 +00:00
$player -> teleport ( $this -> m -> getServer () -> getLevelByName ( $this -> m -> getConfig () -> get ( " LobbyWorld " )) -> getSafeSpawn ());
2016-06-10 05:19:40 +00:00
}
}
}
}
public function getPlayers () {
return $this -> world -> getPlayers ();
}
public function onPlayerChat ( PlayerChatEvent $event ) {
if ( $event -> getPlayer () -> getLevel () -> getName () === $this -> world -> getLevel () -> getName () and $event -> getPlayer () -> getGamemode () === 3 ) {
2016-06-10 14:00:18 +00:00
if ( $event -> getPlayer () -> isSpectator ()) {
foreach ( $this -> world -> getLevel () -> getPlayer () as $player ) {
$player -> sendMessage ( C :: GRAY . " [SPECTATOR] { $event -> getPlayer () -> getName () } > " . $event -> getMessage ());
}
$event -> setCancelled ( true );
}
2016-06-10 05:19:40 +00:00
}
}
2016-06-10 14:00:18 +00:00
/*
Will be useful for scenarios :
@ param player
*/
2016-06-10 05:19:40 +00:00
public function getKills ( Player $player ) {
if ( isset ( $this -> kills [ $player -> getName ()])) {
return $this -> kills [ $player -> getName ()];
} else {
return null ;
}
}
2016-08-20 05:15:03 +00:00
/*
Will be useful for scenarios too :
@ param player
*/
public function addKills ( Player $player , int $count ) {
if ( isset ( $this -> kills [ $player -> getName ()])) {
$this -> kills [ $player -> getName ()] += $count ;
} else {
$this -> kills [ $player -> getName ()] = $count ;
}
return true ;
}
2016-06-10 05:19:40 +00:00
}