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-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 ;
2016-08-23 06:40:00 +00:00
use Ad5001\UHC\event\GameStopEvent ;
2016-06-10 05:19:40 +00:00
class UHCGame implements Listener {
public function __construct ( Plugin $plugin , UHCWorld $world ) {
$this -> m = $plugin ;
$this -> world = $world ;
2016-08-21 13:48:29 +00:00
$world -> getLevel () -> setTime ( 0 );
2016-08-20 07:24:06 +00:00
$plugin -> getServer () -> getPluginManager () -> registerEvents ( $this , $plugin );
2016-08-23 06:40:00 +00:00
$event = new GameStartEvent ( $this , $world , $world -> getLevel () -> getPlayers ());
2016-06-10 14:00:18 +00:00
$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 ;
2016-08-23 06:40:00 +00:00
foreach ( $world -> getLevel () -> getPlayers () as $player ) {
2016-08-21 13:48:29 +00:00
$player -> getInventory () -> clearAll ();
$player -> setGamemode ( 0 );
for ( $e = 1 ; $e < 24 ; $e ++ ) { $player -> removeEffect ( $e );}
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 ) {
2016-08-21 13:48:29 +00:00
$event -> getPlayer () -> setGamemode ( 3 );
2016-06-10 05:19:40 +00:00
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-21 07:40:41 +00:00
$p -> sendMessage ( Main :: PREFIX . C :: YELLOW . $event -> getPlayer () -> getName () . " died. " . ( count ( $this -> world -> getLevel () -> getPlayers ()) - 1 ) . " 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 = [];
2016-08-23 06:40:00 +00:00
foreach ( $event -> getPlayer () -> getLevel () -> getPlayers () as $pl ) {
2016-06-10 05:19:40 +00:00
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 ;
}
}
2016-08-23 06:40:00 +00:00
if ( count ( $pls ) == 2 ) {
foreach ( $pls as $p ) {
if ( $p !== $event -> getPlayer ()) {
$this -> stop ( $p );
}
}
} elseif ( count ( $pls ) == 1 ) {
$this -> stop ( $event -> getPlayer ());
2016-06-10 05:19:40 +00:00
}
}
}
public function stop ( Player $winner ) {
2016-08-23 06:40:00 +00:00
$this -> m -> getServer () -> getPluginManager () -> callEvent ( $ev = new GameStopEvent ( $this , $this -> world , $winner ));
if ( ! $ev -> cancelled ) {
2016-08-24 07:47:43 +00:00
foreach ( $winner -> getLevel () -> getPlayers () as $player ) {
$player -> sendMessage ( Main :: PREFIX . C :: YELLOW . $winner -> getName () . " won the game ! Teleporting back to lobby... " );
$player -> teleport ( $this -> m -> getServer () -> getLevelByName ( $this -> m -> getConfig () -> get ( " LobbyWorld " )) -> getSafeSpawn ());
$this -> m -> UHCManager -> stopUHC ( $this -> world -> getLevel (), $winner );
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
}