2017-02-03 17:16:15 +00:00
< ? php
/*
_____ _ _____ _
| ___ | __ _ ___ | | _ | _ _ | _ __ __ _ __ __ ___ | |
| | _ / _ ` | / __| | __| | | | '__| / _` | \ \ / / / _ \ | |
| _ | | ( _ | | \__ \ | | _ | | | | | ( _ | | \ V / | __ / | |
| _ | \__ , _ | | ___ / \__ | | _ | | _ | \__ , _ | \_ / \___ | | _ |
Travel in MCPE faster and easier than you ever tought !
@ author Ad5001
@ link http :// github . com / Ad5001 / FastTravel
*/
namespace Ad5001\FastTravel ;
use pocketmine\item\Item ;
use pocketmine\item\ItemBlock ;
use pocketmine\block\Block ;
use pocketmine\event\Listener ;
use pocketmine\plugin\PluginBase ;
use pocketmine\Server ;
2017-02-04 15:18:43 +00:00
use pocketmine\entity\Entity ;
2017-02-03 17:16:15 +00:00
use pocketmine\Player ;
use pocketmine\event\player\PlayerToggleSneakEvent ;
use pocketmine\event\player\PlayerMoveEvent ;
class Main extends PluginBase implements Listener {
protected $elevator ;
2017-02-04 15:18:43 +00:00
protected $boost ;
protected $jump ;
2017-02-03 20:18:48 +00:00
public $cancelUpAfterDown = [];
2017-02-03 17:16:15 +00:00
public function onEnable (){
$this -> getServer () -> getPluginManager () -> registerEvents ( $this , $this );
// Loading from config
$this -> elevator = Item :: fromString ( $this -> getConfig () -> get ( " ElevatorBlock " ));
if ( ! ( $this -> elevator instanceof ItemBlock )) {
$this -> getLogger () -> warning ( " Invalid block provided as elevator. " );
$this -> elevator = Item :: get ( 139 );
}
2017-02-04 15:18:43 +00:00
$this -> boost = Item :: fromString ( $this -> getConfig () -> get ( " BoostBlock " ));
2017-02-03 17:16:15 +00:00
if ( ! ( $this -> elevator instanceof ItemBlock )) {
2017-02-04 15:18:43 +00:00
$this -> getLogger () -> warning ( " Invalid block provided as boost block. " );
2017-02-03 17:16:15 +00:00
$this -> elevator = Item :: get ( 79 );
}
2017-02-04 15:18:43 +00:00
$this -> jump = Item :: fromString ( $this -> getConfig () -> get ( " JumpBlock " ));
if ( ! ( $this -> elevator instanceof ItemBlock )) {
$this -> getLogger () -> warning ( " Invalid block provided as jump block. " );
$this -> elevator = Item :: get ( 170 );
}
2017-02-03 17:16:15 +00:00
$this -> getServer () -> getScheduler () -> scheduleRepeatingTask ( new tasks\FastingTask ( $this ), 5 );
}
public function onLoad (){
$this -> saveDefaultConfig ();
}
/*
Tests when a player sneaks
@ param $event \pocketmine\event\player\PlayerToggleSneakEvent
@ return void
*/
public function onPlayerSneak ( PlayerToggleSneakEvent $event ) {
2017-02-03 20:18:48 +00:00
$b = $event -> getPlayer () -> getLevel () -> getBlock ( new \pocketmine\math\Vector3 ( round ( $event -> getPlayer () -> x ), floor ( $event -> getPlayer () -> y - 1 ), round ( $event -> getPlayer () -> z )));
2017-02-03 17:16:15 +00:00
if ( $b -> getId () == $this -> elevator -> getId () && $b -> getDamage () == $this -> elevator -> getDamage () && $event -> isSneaking ()) { // Checking if the player is sneaking on the block set as elevator.
2017-02-03 20:18:48 +00:00
$bl = $this -> getBlockUnder ( $b );
2017-02-03 17:16:15 +00:00
if ( ! is_null ( $bl ) && ! $this -> hasFreeSpace ( $bl )) {
while ( ! is_null ( $bl ) && ! $this -> hasFreeSpace ( $bl )) {
2017-02-03 20:18:48 +00:00
$bl = $this -> getBlockUnder ( $bl );
2017-02-03 17:16:15 +00:00
}
}
if ( ! is_null ( $bl )) { // A elevator under exists
2017-02-03 20:18:48 +00:00
$event -> getPlayer () -> teleport ( new \pocketmine\math\Vector3 ( $bl -> x , $bl -> y + 1.5 , $bl -> z ));
$this -> setCooldown ( $event -> getPlayer ());
2017-02-03 17:16:15 +00:00
$event -> getPlayer () -> getLevel () -> addSound ( new \pocketmine\level\sound\EndermanTeleportSound ( $event -> getPlayer ()));
}
}
}
/*
Check when a player jumps
@ param $event \pocketmine\event\player\PlayerMoveEvent
@ return void
*/
public function onPlayerMove ( PlayerMoveEvent $event ) {
2017-02-03 20:18:48 +00:00
$b = $event -> getPlayer () -> getLevel () -> getBlock ( new \pocketmine\math\Vector3 ( round ( $event -> getFrom () -> x ), floor ( $event -> getFrom () -> y - 1 ), round ( $event -> getFrom () -> z )));
2017-02-03 17:16:15 +00:00
if ( $b -> getId () == $this -> elevator -> getId () && $b -> getDamage () == $this -> elevator -> getDamage () && $event -> getTo () -> y > $event -> getFrom () -> y ) { // Checking if the player is sneaking on the block set as elevator.
2017-02-04 15:18:43 +00:00
// $this->getLogger()->debug($event->getFrom() . "/" . $event->getTo());
2017-02-03 20:18:48 +00:00
$bl = $this -> getBlockAbove ( $b );
2017-02-03 17:16:15 +00:00
if ( ! is_null ( $bl ) && ! $this -> hasFreeSpace ( $bl )) {
while ( ! is_null ( $bl ) && ! $this -> hasFreeSpace ( $bl )) {
2017-02-03 20:18:48 +00:00
$bl = $this -> getBlockAbove ( $bl );
2017-02-03 17:16:15 +00:00
}
}
2017-02-03 20:18:48 +00:00
if ( ! is_null ( $bl ) && ! isset ( $this -> cancelUpAfterDown [ $event -> getPlayer () -> getName ()])) { // A elevator above exists
// $this->getLogger()->debug("Up" . $bl->y);
$event -> setTo ( new \pocketmine\level\Location ( $bl -> x , $bl -> y + 1.5 , $bl -> z ));
$this -> setCooldown ( $event -> getPlayer ());
2017-02-03 17:16:15 +00:00
$event -> getPlayer () -> getLevel () -> addSound ( new \pocketmine\level\sound\EndermanTeleportSound ( $event -> getPlayer ()));
}
}
}
/*
_ ____ ___
/ \ | _ \ | _ _ |
/ _ \ | | _ ) | | |
/ ___ \ | __ / | |
/ _ / \_\ | _ | | ___ |
*/
/*
Get blocks under the block provided that have the same id and damage .
@ param $block pocketmine\block\Block
@ return pocketmine\block\Block | null
*/
public function getBlockUnder ( \pocketmine\block\Block $b ) {
for ( $i = $b -> y - 2 /* TP atleast under two blocks of the current one*/ ; $i > 0 ; $i -- ) {
$block = $b -> getLevel () -> getBlock ( new \pocketmine\math\Vector3 ( $b -> x , $i , $b -> z ));
2017-02-03 20:18:48 +00:00
if ( $block -> getId () == $b -> getId () && $block -> getDamage () == $block -> getDamage ()) return $block ;
2017-02-03 17:16:15 +00:00
}
return null ;
}
/*
Get the first block above the block provided that have the same id and damage .
@ param $block pocketmine\block\Block
@ return pocketmine\block\Block | null
*/
public function getBlockAbove ( \pocketmine\block\Block $b ) {
for ( $i = $b -> y + 2 /* TP atleast above two blocks of the current one*/ ; $i < 128 ; $i ++ ) {
$block = $b -> getLevel () -> getBlock ( new \pocketmine\math\Vector3 ( $b -> x , $i , $b -> z ));
2017-02-03 20:18:48 +00:00
if ( $block -> getId () == $b -> getId () && $block -> getDamage () == $block -> getDamage ()) return $block ;
2017-02-03 17:16:15 +00:00
}
return null ;
}
/*
Check if the space above a the provided block has transparent block so the player won 't die of suffocation'
@ param $block pocketmine\block\Block
@ return bool
*/
public function hasFreeSpace ( \pocketmine\block\Block $b ) : bool {
$b1 = $b -> getLevel () -> getBlock ( new \pocketmine\math\Vector3 ( $b -> x , $b -> y + 1 , $b -> z ));
$b2 = $b -> getLevel () -> getBlock ( new \pocketmine\math\Vector3 ( $b -> x , $b -> y + 2 , $b -> z ));
return $b1 -> isTransparent () && $b2 -> isTransparent ();
}
/*
Return a clone of the elevator block
@ return \pocketmine\block\Block
*/
public function getElevatorBlock () : \pocketmine\block\Block {
2017-02-04 15:18:43 +00:00
return clone $this -> elevator -> getBlock ();
}
/*
Return a clone of the boosting block
@ return \pocketmine\block\Block
*/
public function getBoostBlock () : \pocketmine\block\Block {
return clone $this -> boost -> getBlock ();
2017-02-03 17:16:15 +00:00
}
/*
2017-02-04 15:18:43 +00:00
Return a clone of the jumpig block block
2017-02-03 17:16:15 +00:00
@ return \pocketmine\block\Block
*/
2017-02-04 15:18:43 +00:00
public function getJumpBlock () : \pocketmine\block\Block {
return clone $this -> jump -> getBlock ();
2017-02-03 17:16:15 +00:00
}
2017-02-03 20:18:48 +00:00
/*
Sets a cooldown of using the up & down blocks to a player
@ param $player Player
@ return void
*/
public function setCooldown ( Player $player ) {
$this -> cancelUpAfterDown [ $player -> getName ()] = true ;
$this -> getServer () -> getScheduler () -> scheduleDelayedTask ( new tasks\UpCooldownTask ( $this , $player ), 20 );
}
2017-02-03 17:16:15 +00:00
}