2017-04-23 14:42:51 +00:00
< ? php
2017-05-10 15:03:04 +00:00
/**
2017-05-12 07:01:46 +00:00
* ____ __ __ ____
* / \ _ `\ /\ \__ /\ \__ /\ _` \
* \ \ \L\ \ __ \ \ , _\\ \ , _\ __ _ __ \ \ \L\_\ __ ___
* \ \ _ < ' /' __ `\\ \ \/ \ \ \/ /'__` \ / \ `'__\\ \ \L_L /'__` \ / ' _ ` \
* \ \ \L\ \ / \ __ / \ \ \_ \ \ \_ / \ __ / \ \ \ / \ \ \ / , \ / \ __ / / \ \ / \ \
2017-05-10 15:03:04 +00:00
* \ \____ / \ \____\ \ \__\ \ \__\\ \____\\ \_\ \ \____ / \ \____\\ \_\ \_\
* \ / ___ / \ / ____ / \ / __ / \ / __ / \ / ____ / \ / _ / \ / ___ / \ / ____ / \ / _ / \ / _ /
2017-05-11 11:29:22 +00:00
* Tomorrow ' s pocketmine generator .
2017-05-14 18:13:15 +00:00
* @ author Ad5001 < mail @ ad5001 . eu > , XenialDan < https :// github . com / thebigsmileXD >
2017-05-10 15:03:04 +00:00
* @ link https :// github . com / Ad5001 / BetterGen
2017-05-14 18:13:15 +00:00
* @ category World Generator
* @ api 3.0 . 0
* @ version 1.1
2017-04-23 14:42:51 +00:00
*/
namespace Ad5001\BetterGen ;
use Ad5001\BetterGen\biome\BetterForest ;
2017-05-11 12:07:26 +00:00
use Ad5001\BetterGen\generator\BetterNormal ;
2017-04-23 14:42:51 +00:00
use Ad5001\BetterGen\loot\LootTable ;
2017-05-12 07:01:46 +00:00
use Ad5001\BetterGen\structure\Temple ;
2017-04-23 14:42:51 +00:00
use pocketmine\block\Block ;
2017-05-11 11:29:22 +00:00
use pocketmine\command\Command ;
use pocketmine\command\CommandSender ;
2017-05-12 07:01:46 +00:00
use pocketmine\command\ConsoleCommandSender ;
2017-05-11 12:07:26 +00:00
use pocketmine\event\block\BlockBreakEvent ;
use pocketmine\event\level\ChunkPopulateEvent ;
2017-05-11 11:29:22 +00:00
use pocketmine\event\Listener ;
2017-05-11 12:07:26 +00:00
use pocketmine\event\player\PlayerInteractEvent ;
2017-04-23 14:42:51 +00:00
use pocketmine\level\generator\biome\Biome ;
use pocketmine\level\generator\Generator ;
use pocketmine\nbt\tag\CompoundTag ;
2017-05-11 12:07:26 +00:00
use pocketmine\nbt\tag\IntTag ;
2017-04-23 14:42:51 +00:00
use pocketmine\nbt\tag\ListTag ;
use pocketmine\nbt\tag\StringTag ;
2017-05-12 07:01:46 +00:00
use pocketmine\Player ;
2017-05-11 12:07:26 +00:00
use pocketmine\plugin\PluginBase ;
use pocketmine\tile\Chest ;
2017-04-23 14:42:51 +00:00
use pocketmine\tile\Tile ;
2017-05-11 12:07:26 +00:00
use pocketmine\utils\Config ;
2017-05-12 07:01:46 +00:00
use pocketmine\utils\Random ;
2017-04-23 14:42:51 +00:00
2017-05-11 11:29:22 +00:00
class Main extends PluginBase implements Listener {
2017-04-23 14:42:51 +00:00
const PREFIX = " §l§o§b[§r§l§2Better§aGen§o§b]§r§f " ;
const SAKURA_FOREST = 100 ; // Letting some place for future biomes.
2017-05-12 07:01:46 +00:00
2017-05-14 19:03:47 +00:00
/**
* Regisetrs a biome to betternormal
*
* @ param int $id
* @ param Biome $biome
* @ return void
2017-04-23 14:42:51 +00:00
*/
2017-05-12 07:01:46 +00:00
public static function registerBiome ( int $id , Biome $biome ) {
BetterNormal :: registerBiome ( $biome );
2017-04-23 14:42:51 +00:00
}
2017-05-12 07:01:46 +00:00
2017-05-14 19:03:47 +00:00
/**
* Called when the plugin enales
*
* @ return void
2017-04-23 14:42:51 +00:00
*/
2017-05-12 07:01:46 +00:00
public function onEnable () {
$this -> getServer () -> getPluginManager () -> registerEvents ( $this , $this );
Generator :: addGenerator ( BetterNormal :: class , " betternormal " );
if ( $this -> isOtherNS ()) $this -> getLogger () -> warning ( " Tesseract detected. Note that Tesseract is not up to date with the generation structure and some generation features may be limited or not working " );
@ mkdir ( $this -> getDataFolder ());
if ( ! file_exists ( LootTable :: getPluginFolder () . " processingLoots.json " ))
file_put_contents ( LootTable :: getPluginFolder () . " processingLoots.json " , " { } " );
2017-04-23 14:42:51 +00:00
}
2017-05-12 07:01:46 +00:00
2017-05-14 19:03:47 +00:00
/**
* Checks for tesseract like namespaces . Returns true if thats the case
*
* @ return boolean
2017-04-23 14:42:51 +00:00
*/
2017-05-12 07:01:46 +00:00
public static function isOtherNS () {
try {
return @ class_exists ( " pocketmine \\ level \\ generator \\ normal \\ object \\ OakTree " );
} catch ( \Exception $e ) {
return false ;
}
}
2017-05-14 19:03:47 +00:00
/**
* Called when a command executes
*
* @ param CommandSender $sender
* @ param Command $cmd
* @ param int $label
* @ param array $args
2017-05-12 07:01:46 +00:00
* @ return bool
*/
2017-05-11 11:29:22 +00:00
public function onCommand ( CommandSender $sender , Command $cmd , $label , array $args ) : bool {
2017-05-12 07:01:46 +00:00
switch ( $cmd -> getName ()) {
2017-05-13 15:03:26 +00:00
case " createworld " : // /createworld <name> [generator = betternormal] [seed = rand()] [options(json)]
2017-05-12 07:01:46 +00:00
switch ( count ( $args )) {
2017-04-23 14:42:51 +00:00
case 0 :
return false ;
break ;
case 1 : // /createworld <name>
2017-05-13 21:42:44 +00:00
$name = $args [ 0 ];
2017-04-23 14:42:51 +00:00
$generator = Generator :: getGenerator ( " betternormal " );
$generatorName = " betternormal " ;
$seed = $this -> generateRandomSeed ();
2017-05-12 07:01:46 +00:00
$options = [];
2017-04-23 14:42:51 +00:00
break ;
case 2 : // /createworld <name> [generator = betternormal]
2017-05-13 21:42:44 +00:00
$name = $args [ 0 ];
$generator = Generator :: getGenerator ( $args [ 1 ]);
if ( Generator :: getGeneratorName ( $generator ) !== strtolower ( $args [ 1 ])) {
2017-04-23 14:42:51 +00:00
$sender -> sendMessage ( self :: PREFIX . " §4Could not find generator { $args [ 1 ] } . Are you sure it is registered? " );
return true ;
}
2017-05-13 21:42:44 +00:00
$generatorName = strtolower ( $args [ 1 ]);
2017-04-23 14:42:51 +00:00
$seed = $this -> generateRandomSeed ();
2017-05-12 07:01:46 +00:00
$options = [];
2017-04-23 14:42:51 +00:00
break ;
case 3 : // /createworld <name> [generator = betternormal] [seed = rand()]
2017-05-13 21:42:44 +00:00
$name = $args [ 0 ];
$generator = Generator :: getGenerator ( $args [ 1 ]);
if ( Generator :: getGeneratorName ( $generator ) !== strtolower ( $args [ 1 ])) {
2017-04-23 14:42:51 +00:00
$sender -> sendMessage ( self :: PREFIX . " §4Could not find generator { $args [ 1 ] } . Are you sure it is registered? " );
return true ;
}
2017-05-13 21:42:44 +00:00
$generatorName = strtolower ( $args [ 1 ]);
2017-10-31 16:42:14 +00:00
$parts = str_split ( $args [ 2 ]);
2017-10-31 16:17:18 +00:00
foreach ( $parts as $key => $str ) {
if ( is_numeric ( $str ) == false && $str <> '-' ){
$parts [ $key ] = ord ( $str );
}
}
2017-10-31 16:42:14 +00:00
$seed = ( int ) implode ( " " , $parts );
2017-05-12 07:01:46 +00:00
$options = [];
2017-04-23 14:42:51 +00:00
break ;
default : // /createworld <name> [generator = betternormal] [seed = rand()] [options(json)]
2017-05-13 21:42:44 +00:00
$name = $args [ 0 ];
$generator = Generator :: getGenerator ( $args [ 1 ]);
if ( Generator :: getGeneratorName ( $generator ) !== strtolower ( $args [ 1 ])) {
2017-04-23 14:42:51 +00:00
$sender -> sendMessage ( self :: PREFIX . " §4Could not find generator { $args [ 1 ] } . Are you sure it is registered? " );
return true ;
}
2017-05-13 21:42:44 +00:00
$generatorName = strtolower ( $args [ 1 ]);
2017-05-12 07:01:46 +00:00
if ( $args [ 2 ] == " rand " ) $args [ 2 ] = $this -> generateRandomSeed ();
2017-10-31 16:42:14 +00:00
$parts = str_split ( $args [ 2 ]);
2017-10-31 16:17:18 +00:00
foreach ( $parts as $key => $str ) {
if ( is_numeric ( $str ) == false && $str <> '-' ){
$parts [ $key ] = ord ( $str );
}
}
2017-10-31 16:42:14 +00:00
$seed = ( int ) implode ( " " , $parts );
2017-05-13 21:42:44 +00:00
unset ( $args [ 0 ], $args [ 1 ], $args [ 2 ]);
$options = json_decode ( $args [ 3 ], true );
2017-05-12 07:01:46 +00:00
if ( ! is_array ( $options )) {
2017-04-23 14:42:51 +00:00
$sender -> sendMessage ( Main :: PREFIX . " §4Invalid JSON for options. " );
return true ;
}
break ;
}
2017-05-10 15:03:04 +00:00
$options [ " preset " ] = json_encode ( $options );
2017-05-12 07:01:46 +00:00
if (( int ) $seed == 0 /*String*/ ) {
2017-05-10 15:03:04 +00:00
$seed = $this -> generateRandomSeed ();
}
2017-04-23 14:42:51 +00:00
$this -> getServer () -> broadcastMessage ( Main :: PREFIX . " §aGenerating level $name with generator $generatorName and seed $seed .. " );
$this -> getServer () -> generateLevel ( $name , $seed , $generator , $options );
$this -> getServer () -> loadLevel ( $name );
return true ;
break ;
2017-05-13 15:03:26 +00:00
case " worldtp " :
2017-05-13 14:43:07 +00:00
if ( isset ( $args [ 0 ])) {
if ( is_null ( $this -> getServer () -> getLevelByName ( $args [ 0 ]))) {
$this -> getServer () -> loadLevel ( $args [ 0 ]);
if ( is_null ( $this -> getServer () -> getLevelByName ( $args [ 0 ]))) {
$sender -> sendMessage ( " Could not find level { $args [ 0 ] } . " );
return false ;
}
}
2017-06-18 13:22:39 +00:00
$sender -> teleport ( \pocketmine\level\Position :: fromObject ( $sender , $this -> getServer () -> getLevelByName ( $args [ 0 ])));
2017-05-13 14:43:07 +00:00
$sender -> sendMessage ( " §aTeleporting to { $args [ 0 ] } ... " );
return true ;
} else {
return false ;
}
break ;
2017-05-12 07:01:46 +00:00
case 'temple' : {
if ( $sender instanceof ConsoleCommandSender ) return false ;
/** @var Player $sender */
$temple = new Temple ();
2017-05-12 12:51:21 +00:00
$temple -> placeObject ( $sender -> getLevel (), $sender -> x , $sender -> y , $sender -> z , new Random ( microtime ()));
2017-05-12 07:01:46 +00:00
return true ;
}
2017-04-23 14:42:51 +00:00
}
2017-05-11 11:29:22 +00:00
return false ;
2017-04-23 14:42:51 +00:00
}
2017-05-12 07:01:46 +00:00
2017-05-14 19:03:47 +00:00
/**
* Generates a ( semi ) random seed .
2017-04-23 14:42:51 +00:00
* @ return int
*/
public function generateRandomSeed () : int {
2017-05-12 07:01:46 +00:00
return ( int ) round ( rand ( 0 , round ( time ()) / memory_get_usage ( true )) * ( int ) str_shuffle ( " 127469453645108 " ) / ( int ) str_shuffle ( " 12746945364 " ));
2017-04-23 14:42:51 +00:00
}
2017-05-12 07:01:46 +00:00
2017-05-14 19:03:47 +00:00
/**
* Registers a forest from a tree class
*
* @ param string $name
* @ param string $treeClass
* @ param array $infos
* @ return bool
2017-04-23 14:42:51 +00:00
*/
2017-05-12 07:01:46 +00:00
public function registerForest ( string $name , string $treeClass , array $infos ) : bool {
if ( !@ class_exists ( $treeClass ))
return false ;
if ( !@ is_subclass_of ( $treeClass , " pocketmine \\ level \\ generator \\ normal \\ object \\ Tree " ))
return false ;
2017-05-13 21:42:44 +00:00
if ( count ( $infos ) < 2 or ! is_float ( $infos [ 0 ]) or ! is_float ( $infos [ 1 ]))
2017-05-12 07:01:46 +00:00
return false ;
return BetterForest :: registerForest ( $name , $treeClass , $infos );
}
2017-05-14 19:03:47 +00:00
/**
* Checks when a chunk populates to populate chests back
*
* @ param ChunkPopulateEvent $event
* @ return void
2017-05-12 07:01:46 +00:00
*/
2017-04-23 14:42:51 +00:00
public function onChunkPopulate ( ChunkPopulateEvent $event ) {
$cfg = new Config ( LootTable :: getPluginFolder () . " processingLoots.json " , Config :: JSON );
2017-05-12 07:01:46 +00:00
foreach ( $cfg -> getAll () as $key => $value ) {
2017-04-23 14:42:51 +00:00
list ( $x , $y , $z ) = explode ( " ; " , $key );
2017-05-12 07:01:46 +00:00
if ( $value [ " saveAs " ] == " chest " && $event -> getLevel () -> getBlockIdAt ( $x , $y , $z ) == Block :: AIR ) {
2017-04-23 14:42:51 +00:00
$event -> getLevel () -> setBlockIdAt ( $x , $y , $z , Block :: CHEST );
} else {
$cfg -> remove ( $key );
$cfg -> save ();
}
}
}
2017-05-12 07:01:46 +00:00
2017-05-14 19:03:47 +00:00
/**
* Checks when a player touches an ungenerated chest to generate it .
*
* @ param PlayerInteractEvent $event
* @ return void
2017-04-23 14:42:51 +00:00
*/
public function onInteract ( PlayerInteractEvent $event ) {
$cfg = new Config ( LootTable :: getPluginFolder () . " processingLoots.json " , Config :: JSON );
2017-05-12 07:01:46 +00:00
if ( $event -> getBlock () -> getId () !== Block :: CHEST ) return ;
if ( ! $cfg -> exists ( $event -> getBlock () -> getX () . " ; " . $event -> getBlock () -> getY () . " ; " . $event -> getBlock () -> getZ ())) return ;
2017-04-23 14:42:51 +00:00
$nbt = new CompoundTag ( " " , [
2017-05-12 07:01:46 +00:00
new ListTag ( " Items " , []),
new StringTag ( " id " , Tile :: CHEST ),
new IntTag ( " x " , $event -> getBlock () -> x ),
new IntTag ( " y " , $event -> getBlock () -> y ),
new IntTag ( " z " , $event -> getBlock () -> z )
2017-04-23 14:42:51 +00:00
]);
2017-05-11 12:07:26 +00:00
/** @var Chest $chest */
$chest = Tile :: createTile ( Tile :: CHEST , $event -> getBlock () -> getLevel (), $nbt );
$chest -> setName ( " §k(Fake)§r Minecart chest " );
LootTable :: fillChest ( $chest -> getInventory (), $event -> getBlock ());
2017-04-23 14:42:51 +00:00
}
2017-05-01 10:03:56 +00:00
2017-05-14 19:03:47 +00:00
/**
* Checks when a players breaks an ungenerated chest to generate it .
*
* @ param BlockBreakEvent $event
* @ return void
*/
2017-04-23 14:42:51 +00:00
public function onBlockBreak ( BlockBreakEvent $event ) {
$cfg = new Config ( LootTable :: getPluginFolder () . " processingLoots.json " , Config :: JSON );
2017-05-12 07:01:46 +00:00
if ( $event -> getBlock () -> getId () !== Block :: CHEST ) return ;
if ( ! $cfg -> exists ( $event -> getBlock () -> getX () . " ; " . $event -> getBlock () -> getY () . " ; " . $event -> getBlock () -> getZ ())) return ;
2017-04-23 14:42:51 +00:00
$nbt = new CompoundTag ( " " , [
2017-05-11 12:07:26 +00:00
new ListTag ( " Items " , []),
new StringTag ( " id " , Tile :: CHEST ),
new IntTag ( " x " , $event -> getBlock () -> x ),
new IntTag ( " y " , $event -> getBlock () -> y ),
new IntTag ( " z " , $event -> getBlock () -> z )
2017-04-23 14:42:51 +00:00
]);
2017-05-11 12:07:26 +00:00
/** @var Chest $chest */
$chest = Tile :: createTile ( Tile :: CHEST , $event -> getBlock () -> getLevel (), $nbt );
$chest -> setName ( " §k(Fake)§r Minecart chest " );
LootTable :: fillChest ( $chest -> getInventory (), $event -> getBlock ());
2017-05-01 10:03:56 +00:00
}
2017-05-08 13:59:19 +00:00
}