GenisysPro  for Minecraft PE/Windows 10 v1.1.x
Feature-rich server software for Minecraft PE and Windows 10 Edition
Server Class Reference

Public Member Functions

 getName ()
 
 isRunning ()
 
 getUptime ()
 
 getPocketMineVersion ()
 
 getFormattedVersion ($prefix="")
 
 getGitCommit ()
 
 getShortGitCommit ()
 
 getCodename ()
 
 getVersion ()
 
 getApiVersion ()
 
 getiTXApiVersion ()
 
 getGeniApiVersion ()
 
 getFilePath ()
 
 getDataPath ()
 
 getPluginPath ()
 
 getMaxPlayers ()
 
 getPort ()
 
 getViewDistance ()
 
 getAllowedViewDistance (int $distance)
 
 getIp ()
 
 getServerUniqueId ()
 
 getAutoSave ()
 
 setAutoSave ($value)
 
 getLevelType ()
 
 getGenerateStructures ()
 
 getGamemode ()
 
 getForceGamemode ()
 
 getDifficulty ()
 
 hasWhitelist ()
 
 getSpawnRadius ()
 
 getAllowFlight ()
 
 isHardcore ()
 
 getDefaultGamemode ()
 
 getMotd ()
 
 getLoader ()
 
 getLogger ()
 
 getEntityMetadata ()
 
 getPlayerMetadata ()
 
 getLevelMetadata ()
 
 getPluginManager ()
 
 getCraftingManager ()
 
 getResourceManager ()
 
 getResourcePackManager ()
 
 getScheduler ()
 
 getTick ()
 
 getTicksPerSecond ()
 
 getTicksPerSecondAverage ()
 
 getTickUsage ()
 
 getTickUsageAverage ()
 
 getCommandMap ()
 
 getOnlinePlayers ()
 
 addRecipe (Recipe $recipe)
 
 shouldSavePlayerData ()
 
 getOfflinePlayer ($name)
 
 getOfflinePlayerData ($name)
 
 saveOfflinePlayerData ($name, CompoundTag $nbtTag, $async=false)
 
 getPlayer (string $name)
 
 getPlayerExact (string $name)
 
 matchPlayer ($partialName)
 
 removePlayer (Player $player)
 
 getLevels ()
 
 getDefaultLevel ()
 
 setDefaultLevel ($level)
 
 isLevelLoaded ($name)
 
 getLevel ($levelId)
 
 getLevelByName ($name)
 
 getExpectedExperience ($level)
 
 unloadLevel (Level $level, $forceUnload=false)
 
 loadLevel ($name)
 
 isLevelGenerated ($name)
 
 findEntity (int $entityId, Level $expectedLevel=null)
 
 getConfigString ($variable, $defaultValue="")
 
 getProperty ($variable, $defaultValue=null)
 
 setConfigString ($variable, $value)
 
 getConfigInt ($variable, $defaultValue=0)
 
 setConfigInt ($variable, $value)
 
 getConfigBoolean ($variable, $defaultValue=false)
 
 setConfigBool ($variable, $value)
 
 getPluginCommand ($name)
 
 getNameBans ()
 
 getIPBans ()
 
 getCIDBans ()
 
 addOp ($name)
 
 removeOp ($name)
 
 addWhitelist ($name)
 
 removeWhitelist ($name)
 
 isWhitelisted ($name)
 
 isOp ($name)
 
 getWhitelisted ()
 
 getOps ()
 
 reloadWhitelist ()
 
 getCommandAliases ()
 
 getCrashPath ()
 
 about ()
 
 loadAdvancedConfig ()
 
 getDServerMaxPlayers ()
 
 getDServerOnlinePlayers ()
 
 isDServerEnabled ()
 
 updateDServerInfo ()
 
 getBuild ()
 
 getGameVersion ()
 
 __construct (\ClassLoader $autoloader, \ThreadedLogger $logger, $filePath, $dataPath, $pluginPath, $defaultLang="unknown")
 
 broadcastPacket (array $players, DataPacket $packet)
 
 batchPackets (array $players, array $packets, $forceSync=false)
 
 broadcastPacketsCallback ($data, array $identifiers)
 
 enablePlugins (int $type)
 
 enablePlugin (Plugin $plugin)
 
 disablePlugins ()
 
 checkConsole ()
 
 dispatchCommand (CommandSender $sender, $commandLine)
 
 reload ()
 
 shutdown (bool $restart=false, string $msg="")
 
 forceShutdown ()
 
 getQueryInformation ()
 
 start ()
 
 handleSignal ($signo)
 
 exceptionHandler (\Throwable $e, $trace=null)
 
 crashDump ()
 
 __debugInfo ()
 
 onPlayerLogin (Player $player)
 
 addPlayer ($identifier, Player $player)
 
 addOnlinePlayer (Player $player)
 
 removeOnlinePlayer (Player $player)
 
 updatePlayerListData (UUID $uuid, $entityId, $name, $skinId, $skinData, array $players=null)
 
 removePlayerListData (UUID $uuid, array $players=null)
 
 sendFullPlayerListData (Player $p)
 
 doAutoSave ()
 
 sendUsage ($type=SendUsageTask::TYPE_STATUS)
 
 getLanguage ()
 
 isLanguageForced ()
 
 getNetwork ()
 
 getMemoryManager ()
 
 handlePacket ($address, $port, $payload)
 
 getAdvancedProperty ($variable, $defaultValue=null, Config $cfg=null)
 
 updateQuery ()
 

Static Public Member Functions

static getGamemodeString ($mode)
 
static getGamemodeFromString ($str)
 
static getDifficultyFromString ($str)
 
static getInstance ()
 
static microSleep (int $microseconds)
 

Data Fields

const BROADCAST_CHANNEL_ADMINISTRATIVE = "pocketmine.broadcast.admin"
 
const BROADCAST_CHANNEL_USERS = "pocketmine.broadcast.user"
 
const PLAYER_MSG_TYPE_MESSAGE = 0
 
const PLAYER_MSG_TYPE_TIP = 1
 
const PLAYER_MSG_TYPE_POPUP = 2
 
 $networkCompressionLevel = 7
 
 $advancedConfig = null
 
 $weatherEnabled = true
 
 $foodEnabled = true
 
 $expEnabled = true
 
 $keepInventory = false
 
 $netherEnabled = false
 
 $netherName = "nether"
 
 $netherLevel = null
 
 $weatherRandomDurationMin = 6000
 
 $weatherRandomDurationMax = 12000
 
 $lightningTime = 200
 
 $lightningFire = false
 
 $version
 
 $allowSnowGolem
 
 $allowIronGolem
 
 $autoClearInv = true
 
 $dserverConfig = []
 
 $dserverPlayers = 0
 
 $dserverAllPlayers = 0
 
 $redstoneEnabled = false
 
 $allowFrequencyPulse = true
 
 $anvilEnabled = false
 
 $pulseFrequency = 20
 
 $playerMsgType = self::PLAYER_MSG_TYPE_MESSAGE
 
 $playerLoginMsg = ""
 
 $playerLogoutMsg = ""
 
 $keepExperience = false
 
 $limitedCreative = true
 
 $chunkRadius = -1
 
 $destroyBlockParticle = true
 
 $allowSplashPotion = true
 
 $fireSpread = false
 
 $advancedCommandSelector = false
 
 $enchantingTableEnabled = true
 
 $countBookshelf = false
 
 $allowInventoryCheats = false
 
 $folderpluginloader = true
 
 $loadIncompatibleAPI = true
 
 $enderEnabled = true
 
 $enderName = "ender"
 
 $enderLevel = null
 
 $absorbWater = false
 

Detailed Description

The class that manages everything

Constructor & Destructor Documentation

◆ __construct()

__construct ( \ClassLoader  $autoloader,
\ThreadedLogger  $logger,
  $filePath,
  $dataPath,
  $pluginPath,
  $defaultLang = "unknown" 
)
Parameters
\ClassLoader$autoloader
\ThreadedLogger$logger
string$filePath
string$dataPath
string$pluginPath
string$defaultLang
1646  {
1647  self::$instance = $this;
1648  self::$sleeper = new \Threaded;
1649  $this->autoloader = $autoloader;
1650  $this->logger = $logger;
1651  $this->filePath = $filePath;
1652  try{
1653  if(!file_exists($dataPath . "worlds/")){
1654  mkdir($dataPath . "worlds/", 0777);
1655  }
1656 
1657  if(!file_exists($dataPath . "players/")){
1658  mkdir($dataPath . "players/", 0777);
1659  }
1660 
1661  if(!file_exists($pluginPath)){
1662  mkdir($pluginPath, 0777);
1663  }
1664 
1665  if(!file_exists($dataPath . "crashdumps/")){
1666  mkdir($dataPath . "crashdumps/", 0777);
1667  }
1668 
1669  $this->dataPath = realpath($dataPath) . DIRECTORY_SEPARATOR;
1670  $this->pluginPath = realpath($pluginPath) . DIRECTORY_SEPARATOR;
1671 
1672  $this->console = new CommandReader();
1673 
1674  $version = new VersionString($this->getPocketMineVersion());
1675  $this->version = $version;
1676 
1677  $this->about();
1678 
1679  $this->logger->info("Loading properties and configuration...");
1680  if(!file_exists($this->dataPath . "pocketmine.yml")){
1681  if(file_exists($this->dataPath . "lang.txt")){
1682  $langFile = new Config($configPath = $this->dataPath . "lang.txt", Config::ENUM, []);
1683  $wizardLang = null;
1684  foreach ($langFile->getAll(true) as $langName) {
1685  $wizardLang = $langName;
1686  break;
1687  }
1688  if(file_exists($this->filePath . "src/pocketmine/resources/pocketmine_$wizardLang.yml")){
1689  $content = file_get_contents($file = $this->filePath . "src/pocketmine/resources/pocketmine_$wizardLang.yml");
1690  }else{
1691  $content = file_get_contents($file = $this->filePath . "src/pocketmine/resources/pocketmine_eng.yml");
1692  }
1693  }else{
1694  $content = file_get_contents($file = $this->filePath . "src/pocketmine/resources/pocketmine_eng.yml");
1695  }
1696  @file_put_contents($this->dataPath . "pocketmine.yml", $content);
1697  }
1698  if(file_exists($this->dataPath . "lang.txt")){
1699  unlink($this->dataPath . "lang.txt");
1700  }
1701  $this->config = new Config($configPath = $this->dataPath . "pocketmine.yml", Config::YAML, []);
1702  $nowLang = $this->getProperty("settings.language", "eng");
1703 
1704  //Crashes unsupported builds without the correct configuration
1705  if(strpos(\pocketmine\VERSION, "unsupported") !== false and getenv("CI") === false){
1706  if($this->getProperty("settings.enable-testing", false) !== true){
1707  throw new ServerException("This build is not intended for production use. You may set 'settings.enable-testing: true' under pocketmine.yml to allow use of non-production builds. Do so at your own risk and ONLY if you know what you are doing.");
1708  }else{
1709  $this->logger->warning("You are using an unsupported build. Do not use this build in a production environment.");
1710  }
1711  }
1712  if($defaultLang != "unknown" and $nowLang != $defaultLang){
1713  @file_put_contents($configPath, str_replace('language: "' . $nowLang . '"', 'language: "' . $defaultLang . '"', file_get_contents($configPath)));
1714  $this->config->reload();
1715  unset($this->propertyCache["settings.language"]);
1716  }
1717 
1718  $lang = $this->getProperty("settings.language", BaseLang::FALLBACK_LANGUAGE);
1719  if(file_exists($this->filePath . "src/pocketmine/resources/genisys_$lang.yml")){
1720  $content = file_get_contents($file = $this->filePath . "src/pocketmine/resources/genisys_$lang.yml");
1721  }else{
1722  $content = file_get_contents($file = $this->filePath . "src/pocketmine/resources/genisys_eng.yml");
1723  }
1724 
1725  if(!file_exists($this->dataPath . "genisys.yml")){
1726  @file_put_contents($this->dataPath . "genisys.yml", $content);
1727  }
1728  $internelConfig = new Config($file, Config::YAML, []);
1729  $this->advancedConfig = new Config($this->dataPath . "genisys.yml", Config::YAML, []);
1730  $cfgVer = $this->getAdvancedProperty("config.version", 0, $internelConfig);
1731  $advVer = $this->getAdvancedProperty("config.version", 0);
1732 
1733  $this->loadAdvancedConfig();
1734 
1735  $this->properties = new Config($this->dataPath . "server.properties", Config::PROPERTIES, [
1736  "motd" => "Minecraft: PE Server",
1737  "server-port" => 19132,
1738  "white-list" => false,
1739  "announce-player-achievements" => true,
1740  "spawn-protection" => 16,
1741  "max-players" => 20,
1742  "allow-flight" => false,
1743  "spawn-animals" => true,
1744  "spawn-mobs" => true,
1745  "gamemode" => 0,
1746  "force-gamemode" => false,
1747  "hardcore" => false,
1748  "pvp" => true,
1749  "difficulty" => 1,
1750  "generator-settings" => "",
1751  "level-name" => "world",
1752  "level-seed" => "",
1753  "level-type" => "DEFAULT",
1754  "enable-query" => true,
1755  "enable-rcon" => false,
1756  "rcon.password" => substr(base64_encode(random_bytes(20)), 3, 10),
1757  "auto-save" => true,
1758  "online-mode" => false,
1759  "view-distance" => 8
1760  ]);
1761 
1762  $onlineMode = $this->getConfigBoolean("online-mode", false);
1763  if(!extension_loaded("openssl")){
1764  $this->logger->warning("OpenSSL extension not found");
1765  $this->logger->warning("Please configure OpenSSL extension for PHP if you want to use Xbox Live authentication or global resource pack.");
1766  $this->setConfigBool("online-mode", false);
1767  }elseif(!$onlineMode){
1768  $this->logger->warning("Online mode has been turned off in server.properties");
1769  $this->logger->warning("Xbox Live authentication is disabled.");
1770  }
1771 
1772  $this->forceLanguage = $this->getProperty("settings.force-language", false);
1773  $this->baseLang = new BaseLang($this->getProperty("settings.language", BaseLang::FALLBACK_LANGUAGE));
1774  $this->logger->info($this->getLanguage()->translateString("language.selected", [$this->getLanguage()->getName(), $this->getLanguage()->getLang()]));
1775 
1776  $this->memoryManager = new MemoryManager($this);
1777 
1778  if(($poolSize = $this->getProperty("settings.async-workers", "auto")) === "auto"){
1779  $poolSize = ServerScheduler::$WORKERS;
1780  $processors = Utils::getCoreCount() - 2;
1781 
1782  if($processors > 0){
1783  $poolSize = max(1, $processors);
1784  }
1785  }
1786 
1787  ServerScheduler::$WORKERS = $poolSize;
1788 
1789  if($this->getProperty("network.batch-threshold", 256) >= 0){
1790  Network::$BATCH_THRESHOLD = (int) $this->getProperty("network.batch-threshold", 256);
1791  }else{
1793  }
1794  $this->networkCompressionLevel = $this->getProperty("network.compression-level", 7);
1795  $this->networkCompressionAsync = $this->getProperty("network.async-compression", true);
1796 
1797  $this->autoTickRate = (bool) $this->getProperty("level-settings.auto-tick-rate", true);
1798  $this->autoTickRateLimit = (int) $this->getProperty("level-settings.auto-tick-rate-limit", 20);
1799  $this->alwaysTickPlayers = (int) $this->getProperty("level-settings.always-tick-players", false);
1800  $this->baseTickRate = (int) $this->getProperty("level-settings.base-tick-rate", 1);
1801 
1802  $this->scheduler = new ServerScheduler();
1803 
1804  if($this->getConfigBoolean("enable-rcon", false) === true){
1805  $this->rcon = new RCON($this, $this->getConfigString("rcon.password", ""), $this->getConfigInt("rcon.port", $this->getPort()), ($ip = $this->getIp()) != "" ? $ip : "0.0.0.0", $this->getConfigInt("rcon.threads", 1), $this->getConfigInt("rcon.clients-per-thread", 50));
1806  }
1807 
1808  $this->entityMetadata = new EntityMetadataStore();
1809  $this->playerMetadata = new PlayerMetadataStore();
1810  $this->levelMetadata = new LevelMetadataStore();
1811 
1812  $this->operators = new Config($this->dataPath . "ops.txt", Config::ENUM);
1813  $this->whitelist = new Config($this->dataPath . "white-list.txt", Config::ENUM);
1814  if(file_exists($this->dataPath . "banned.txt") and !file_exists($this->dataPath . "banned-players.txt")){
1815  @rename($this->dataPath . "banned.txt", $this->dataPath . "banned-players.txt");
1816  }
1817  @touch($this->dataPath . "banned-players.txt");
1818  $this->banByName = new BanList($this->dataPath . "banned-players.txt");
1819  $this->banByName->load();
1820  @touch($this->dataPath . "banned-ips.txt");
1821  $this->banByIP = new BanList($this->dataPath . "banned-ips.txt");
1822  $this->banByIP->load();
1823  @touch($this->dataPath . "banned-cids.txt");
1824  $this->banByCID = new BanList($this->dataPath . "banned-cids.txt");
1825  $this->banByCID->load();
1826 
1827  $this->maxPlayers = $this->getConfigInt("max-players", 20);
1828  $this->setAutoSave($this->getConfigBoolean("auto-save", true));
1829 
1830  if($this->getConfigBoolean("hardcore", false) === true and $this->getDifficulty() < 3){
1831  $this->setConfigInt("difficulty", 3);
1832  }
1833 
1834  define('pocketmine\DEBUG', (int) $this->getProperty("debug.level", 1));
1835 
1836  if(((int) ini_get('zend.assertions')) > 0 and ((bool) $this->getProperty("debug.assertions.warn-if-enabled", true)) !== false){
1837  $this->logger->warning("Debugging assertions are enabled, this may impact on performance. To disable them, set `zend.assertions = -1` in php.ini.");
1838  }
1839 
1840  ini_set('assert.exception', (bool) $this->getProperty("debug.assertions.throw-exception", 0));
1841 
1842  if($this->logger instanceof MainLogger){
1843  $this->logger->setLogDebug(\pocketmine\DEBUG > 1);
1844  }
1845 
1846  if(\pocketmine\DEBUG >= 0){
1847  @cli_set_process_title($this->getName() . " " . $this->getPocketMineVersion());
1848  }
1849 
1850  $this->logger->info($this->getLanguage()->translateString("pocketmine.server.networkStart", [$this->getIp() === "" ? "*" : $this->getIp(), $this->getPort()]));
1851  $this->serverID = Utils::getMachineUniqueId($this->getIp() . $this->getPort());
1852 
1853  $this->getLogger()->debug("Server unique id: " . $this->getServerUniqueId());
1854  $this->getLogger()->debug("Machine unique id: " . Utils::getMachineUniqueId());
1855 
1856  $this->network = new Network($this);
1857  $this->network->setName($this->getMotd());
1858 
1859  $this->logger->info($this->getLanguage()->translateString("pocketmine.server.license", [$this->getName()]));
1860 
1861  Timings::init();
1862 
1863  $this->consoleSender = new ConsoleCommandSender();
1864  $this->commandMap = new SimpleCommandMap($this);
1865 
1866  Entity::init();
1867  Tile::init();
1869  Block::init();
1871  Item::init();
1872  Biome::init();
1873  Effect::init();
1874  Attribute::init();
1876  Color::init();
1877  $this->craftingManager = new CraftingManager();
1878 
1879  $this->resourceManager = new ResourcePackManager($this, $this->getDataPath() . "resource_packs" . DIRECTORY_SEPARATOR);
1880 
1881  $this->pluginManager = new PluginManager($this, $this->commandMap);
1882  $this->pluginManager->subscribeToPermission(Server::BROADCAST_CHANNEL_ADMINISTRATIVE, $this->consoleSender);
1883  $this->pluginManager->setUseTimings($this->getProperty("settings.enable-profiling", false));
1884  $this->profilingTickRate = (float) $this->getProperty("settings.profile-report-trigger", 20);
1885  $this->pluginManager->registerInterface(PharPluginLoader::class);
1886  if($this->folderpluginloader === true) {
1887  $this->pluginManager->registerInterface(FolderPluginLoader::class);
1888  }
1889  $this->pluginManager->registerInterface(ScriptPluginLoader::class);
1890 
1891  //set_exception_handler([$this, "exceptionHandler"]);
1892  register_shutdown_function([$this, "crashDump"]);
1893 
1894  $this->queryRegenerateTask = new QueryRegenerateEvent($this, 5);
1895 
1896  $this->network->registerInterface(new RakLibInterface($this));
1897 
1898  $this->pluginManager->loadPlugins($this->pluginPath);
1899 
1901 
1902  LevelProviderManager::addProvider(Anvil::class);
1903  LevelProviderManager::addProvider(McRegion::class);
1904  LevelProviderManager::addProvider(PMAnvil::class);
1905  if(extension_loaded("leveldb")){
1906  $this->logger->debug($this->getLanguage()->translateString("pocketmine.debug.enable"));
1907  LevelProviderManager::addProvider(LevelDB::class);
1908  }
1909 
1910 
1911  Generator::addGenerator(Flat::class, "flat");
1912  Generator::addGenerator(Normal::class, "normal");
1913  Generator::addGenerator(Normal::class, "default");
1914  Generator::addGenerator(Nether::class, "hell");
1915  Generator::addGenerator(Nether::class, "nether");
1916  Generator::addGenerator(VoidGenerator::class, "void");
1917  Generator::addGenerator(Normal2::class, "normal2");
1918  Generator::addGenerator(Ender::class, "ender");
1919 
1920  foreach((array) $this->getProperty("worlds", []) as $name => $worldSetting){
1921  if($this->loadLevel($name) === false){
1922  $seed = $this->getProperty("worlds.$name.seed", time());
1923  $options = explode(":", $this->getProperty("worlds.$name.generator", Generator::getGenerator("default")));
1924  $generator = Generator::getGenerator(array_shift($options));
1925  if(count($options) > 0){
1926  $options = [
1927  "preset" => implode(":", $options),
1928  ];
1929  }else{
1930  $options = [];
1931  }
1932 
1933  $this->generateLevel($name, $seed, $generator, $options);
1934  }
1935  }
1936 
1937  if($this->getDefaultLevel() === null){
1938  $default = $this->getConfigString("level-name", "world");
1939  if(trim($default) == ""){
1940  $this->getLogger()->warning("level-name cannot be null, using default");
1941  $default = "world";
1942  $this->setConfigString("level-name", "world");
1943  }
1944  if($this->loadLevel($default) === false){
1945  $seed = getopt("", ["level-seed::"])["level-seed"] ?? $this->properties->get("level-seed", time());
1946  if(!is_numeric($seed) or bccomp($seed, "9223372036854775807") > 0){
1947  $seed = Utils::javaStringHash($seed);
1948  }elseif(PHP_INT_SIZE === 8){
1949  $seed = (int) $seed;
1950  }
1951  $this->generateLevel($default, $seed === 0 ? time() : $seed);
1952  }
1953 
1954  $this->setDefaultLevel($this->getLevelByName($default));
1955  }
1956 
1957 
1958  $this->properties->save(true);
1959 
1960  if(!($this->getDefaultLevel() instanceof Level)){
1961  $this->getLogger()->emergency($this->getLanguage()->translateString("pocketmine.level.defaultError"));
1962  $this->forceShutdown();
1963 
1964  return;
1965  }
1966 
1967  if($this->netherEnabled){
1968  if(!$this->loadLevel($this->netherName)){
1969  $this->generateLevel($this->netherName, time(), Generator::getGenerator("nether"));
1970  }
1971  $this->netherLevel = $this->getLevelByName($this->netherName);
1972  }
1973 
1974  if($this->enderEnabled){
1975  if(!$this->loadLevel($this->enderName)){
1976  $this->generateLevel($this->enderName, time(), Generator::getGenerator("ender"));
1977  }
1978  $this->enderLevel = $this->getLevelByName($this->enderName);
1979  }
1980 
1981  if($this->getProperty("ticks-per.autosave", 6000) > 0){
1982  $this->autoSaveTicks = (int) $this->getProperty("ticks-per.autosave", 6000);
1983  }
1984 
1986 
1987  if($this->dserverConfig["enable"] and ($this->getAdvancedProperty("dserver.server-list", "") != "")) $this->scheduler->scheduleRepeatingTask(new CallbackTask([
1988  $this,
1989  "updateDServerInfo"
1990  ]), $this->dserverConfig["timer"]);
1991 
1992  if($cfgVer > $advVer){
1993  $this->logger->notice("Your genisys.yml needs update");
1994  $this->logger->notice("Current Version: $advVer Latest Version: $cfgVer");
1995  }
1996 
1997  $this->start();
1998  }catch(\Throwable $e){
1999  $this->exceptionHandler($e);
2000  }
2001  }

Member Function Documentation

◆ __debugInfo()

__debugInfo ( )
2541  {
2542  return [];
2543  }

◆ about()

about ( )
1523  {
1525  $string = "
1526 
1527  _____ _ _____
1528  / ____| (_) | __ \
1529 | | __ ___ _ __ _ ___ _ _ ___| |__) | __ ___
1530 | | |_ |/ _ \ '_ \| / __| | | / __| ___/ '__/ _ \
1531 | |__| | __/ | | | \__ \ |_| \__ \ | | | | (_) |
1532  \_____|\___|_| |_|_|___/\__, |___/_| |_| \___/
1533  __/ |
1534  |___/
1535 
1536  Version: §6" . $this->getPocketMineVersion() . ' (' . $this->getShortGitCommit() . ')§f
1537  Client Version: §b' . $version . '§f
1538  PHP Version: §e' . PHP_VERSION . '§f
1539  OS: §6' . PHP_OS .'§f
1540  This core is maintained by §dGenisysPro§f (https://github.com/GenisysPro)
1541  Discord Group chat: §ehttps://discord.gg/WrKzRNn §f
1542  Chatroom on QQ: §a559301590 §f
1543  Welcome to donate us on QQ: §c1912003473
1544  ';
1545 
1546  $this->getLogger()->info($string);
1547  }

◆ addOnlinePlayer()

addOnlinePlayer ( Player  $player)
2570  {
2571  $this->playerList[$player->getRawUniqueId()] = $player;
2572 
2573  $this->updatePlayerListData($player->getUniqueId(), $player->getId(), $player->getDisplayName(), $player->getSkinId(), $player->getSkinData());
2574  }

◆ addOp()

addOp (   $name)
Parameters
string$name
1407  {
1408  $this->operators->set(strtolower($name), true);
1409 
1410  if(($player = $this->getPlayerExact($name)) !== null){
1411  $player->recalculatePermissions();
1412  }
1413  $this->operators->save(true);
1414  }

◆ addPlayer()

addPlayer (   $identifier,
Player  $player 
)
2565  {
2566  $this->players[$identifier] = $player;
2567  $this->identifiers[spl_object_hash($player)] = $identifier;
2568  }

◆ addRecipe()

addRecipe ( Recipe  $recipe)
795  {
796  $this->craftingManager->registerRecipe($recipe);
797  }

◆ addWhitelist()

addWhitelist (   $name)
Parameters
string$name
1435  {
1436  $this->whitelist->set(strtolower($name), true);
1437  $this->whitelist->save(true);
1438  }

◆ batchPackets()

batchPackets ( array  $players,
array  $packets,
  $forceSync = false 
)

Broadcasts a list of packets in a batch to a list of players

Parameters
Player[]$players
DataPacket[]|string$packets
bool$forceSync
2154  {
2155  Timings::$playerNetworkTimer->startTiming();
2156  $str = "";
2157 
2158  foreach($packets as $p){
2159  if($p instanceof DataPacket){
2160  if(!$p->isEncoded){
2161  $p->encode();
2162  }
2163  $str .= Binary::writeUnsignedVarInt(strlen($p->buffer)) . $p->buffer;
2164  }else{
2165  $str .= Binary::writeUnsignedVarInt(strlen($p)) . $p;
2166  }
2167  }
2168 
2169  $targets = [];
2170  foreach($players as $p){
2171  if($p->isConnected()){
2172  $targets[] = $this->identifiers[spl_object_hash($p)];
2173  }
2174  }
2175 
2176  if(!$forceSync and $this->networkCompressionAsync){
2177  $task = new CompressBatchedTask($str, $targets, $this->networkCompressionLevel);
2178  $this->getScheduler()->scheduleAsyncTask($task);
2179  }else{
2180  $this->broadcastPacketsCallback(zlib_encode($str, ZLIB_ENCODING_DEFLATE, $this->networkCompressionLevel), $targets);
2181  }
2182 
2183  Timings::$playerNetworkTimer->stopTiming();
2184  }

◆ broadcastPacket()

broadcastPacket ( array  $players,
DataPacket  $packet 
)

Broadcasts a Minecraft packet to a list of players

Parameters
Player[]$players
DataPacket$packet
2131  {
2132  $packet->encode();
2133  $packet->isEncoded = true;
2134  if(Network::$BATCH_THRESHOLD >= 0 and strlen($packet->buffer) >= Network::$BATCH_THRESHOLD){
2135  $this->batchPackets($players, [$packet->buffer], false);
2136  return;
2137  }
2138 
2139  foreach($players as $player){
2140  $player->dataPacket($packet);
2141  }
2142  if(isset($packet->__encapsulatedPacket)){
2143  unset($packet->__encapsulatedPacket);
2144  }
2145  }

◆ broadcastPacketsCallback()

broadcastPacketsCallback (   $data,
array  $identifiers 
)
2186  {
2187  $pk = new BatchPacket();
2188  $pk->payload = $data;
2189  $pk->encode();
2190  $pk->isEncoded = true;
2191 
2192  foreach($identifiers as $i){
2193  if(isset($this->players[$i])){
2194  $this->players[$i]->dataPacket($pk);
2195  }
2196  }
2197  }

◆ checkConsole()

checkConsole ( )
2227  {
2228  Timings::$serverCommandTimer->startTiming();
2229  if(($line = $this->console->getLine()) !== null){
2230  $this->pluginManager->callEvent($ev = new ServerCommandEvent($this->consoleSender, $line));
2231  if(!$ev->isCancelled()){
2232  $this->dispatchCommand($ev->getSender(), $ev->getCommand());
2233  }
2234  }
2235  Timings::$serverCommandTimer->stopTiming();
2236  }

◆ crashDump()

crashDump ( )
2479  {
2480  if($this->isRunning === false){
2481  return;
2482  }
2483  if($this->sendUsageTicker > 0){
2485  }
2486  $this->hasStopped = false;
2487 
2488  ini_set("error_reporting", 0);
2489  ini_set("memory_limit", -1); //Fix error dump not dumped on memory problems
2490  $this->logger->emergency($this->getLanguage()->translateString("pocketmine.crash.create"));
2491  try{
2492  $dump = new CrashDump($this);
2493  }catch(\Throwable $e){
2494  $this->logger->critical($this->getLanguage()->translateString("pocketmine.crash.error", $e->getMessage()));
2495  return;
2496  }
2497 
2498  $this->logger->emergency($this->getLanguage()->translateString("pocketmine.crash.submit", [$dump->getPath()]));
2499 
2500 
2501  if($this->getProperty("auto-report.enabled", true) !== false){
2502  $report = true;
2503  $plugin = $dump->getData()["plugin"];
2504  if(is_string($plugin)){
2505  $p = $this->pluginManager->getPlugin($plugin);
2506  if($p instanceof Plugin and !($p->getPluginLoader() instanceof PharPluginLoader)){
2507  $report = false;
2508  }
2509  }elseif(\Phar::running(true) == ""){
2510  $report = false;
2511  }
2512  if($dump->getData()["error"]["type"] === "E_PARSE" or $dump->getData()["error"]["type"] === "E_COMPILE_ERROR"){
2513  $report = false;
2514  }
2515 
2516  if($report){
2517  $reply = Utils::postURL("http://" . $this->getProperty("auto-report.host", "crash.pocketmine.net") . "/submit/api", [
2518  "report" => "yes",
2519  "name" => $this->getName() . " " . $this->getPocketMineVersion(),
2520  "email" => "crash@pocketmine.net",
2521  "reportPaste" => base64_encode($dump->getEncodedData())
2522  ]);
2523 
2524  if(($data = json_decode($reply)) !== false and isset($data->crashId)){
2525  $reportId = $data->crashId;
2526  $reportUrl = $data->crashUrl;
2527  $this->logger->emergency($this->getLanguage()->translateString("pocketmine.crash.archive", [$reportUrl, $reportId]));
2528  }
2529  }
2530  }
2531 
2532  //$this->checkMemory();
2533  //$dump .= "Memory Usage Tracking: \r\n" . chunk_split(base64_encode(gzdeflate(implode(";", $this->memoryStats), 9))) . "\r\n";
2534 
2535  $this->forceShutdown();
2536  $this->isRunning = false;
2537  @kill(getmypid());
2538  exit(1);
2539  }

◆ disablePlugins()

disablePlugins ( )
2223  {
2224  $this->pluginManager->disablePlugins();
2225  }

◆ dispatchCommand()

dispatchCommand ( CommandSender  $sender,
  $commandLine 
)

Executes a command from a CommandSender

Parameters
CommandSender$sender
string$commandLine
Returns
bool
2246  {
2247  if($this->commandMap->dispatch($sender, $commandLine)){
2248  return true;
2249  }
2250 
2251 
2252  $sender->sendMessage(new TranslationContainer(TextFormat::GOLD . "%commands.generic.notFound"));
2253 
2254  return false;
2255  }

◆ doAutoSave()

doAutoSave ( )
2663  {
2664  if($this->getAutoSave()){
2665  Timings::$worldSaveTimer->startTiming();
2666  foreach($this->players as $index => $player){
2667  if($player->isOnline()){
2668  $player->save(true);
2669  }elseif(!$player->isConnected()){
2670  $this->removePlayer($player);
2671  }
2672  }
2673 
2674  foreach($this->getLevels() as $level){
2675  $level->save(false);
2676  }
2677  Timings::$worldSaveTimer->stopTiming();
2678  }
2679  }

◆ enablePlugin()

enablePlugin ( Plugin  $plugin)
Parameters
Plugin$plugin
2219  {
2220  $this->pluginManager->enablePlugin($plugin);
2221  }

◆ enablePlugins()

enablePlugins ( int  $type)
Parameters
int$type
2203  {
2204  foreach($this->pluginManager->getPlugins() as $plugin){
2205  if(!$plugin->isEnabled() and $plugin->getDescription()->getOrder() === $type){
2206  $this->enablePlugin($plugin);
2207  }
2208  }
2209 
2210  if($type === PluginLoadOrder::POSTWORLD){
2211  $this->commandMap->registerServerAliases();
2213  }
2214  }

◆ exceptionHandler()

exceptionHandler ( \Throwable  $e,
  $trace = null 
)
2438  {
2439  if($e === null){
2440  return;
2441  }
2442 
2443  global $lastError;
2444 
2445  if($trace === null){
2446  $trace = $e->getTrace();
2447  }
2448 
2449  $errstr = $e->getMessage();
2450  $errfile = $e->getFile();
2451  $errno = $e->getCode();
2452  $errline = $e->getLine();
2453 
2454  $type = ($errno === E_ERROR or $errno === E_USER_ERROR) ? \LogLevel::ERROR : (($errno === E_USER_WARNING or $errno === E_WARNING) ? \LogLevel::WARNING : \LogLevel::NOTICE);
2455  if(($pos = strpos($errstr, "\n")) !== false){
2456  $errstr = substr($errstr, 0, $pos);
2457  }
2458 
2459  $errfile = cleanPath($errfile);
2460 
2461  if($this->logger instanceof MainLogger){
2462  $this->logger->logException($e, $trace);
2463  }
2464 
2465  $lastError = [
2466  "type" => $type,
2467  "message" => $errstr,
2468  "fullFile" => $e->getFile(),
2469  "file" => $errfile,
2470  "line" => $errline,
2471  "trace" => @getTrace(1, $trace)
2472  ];
2473 
2474  global $lastExceptionError, $lastError;
2475  $lastExceptionError = $lastError;
2476  $this->crashDump();
2477  }

◆ findEntity()

findEntity ( int  $entityId,
Level  $expectedLevel = null 
)

Searches all levels for the entity with the specified ID. Useful for tracking entities across multiple worlds without needing strong references.

Parameters
int$entityId
Level | null$expectedLevelLevel to look in first for the target
Returns
Entity|null
1256  {
1257  $levels = $this->levels;
1258  if($expectedLevel !== null){
1259  array_unshift($levels, $expectedLevel);
1260  }
1261 
1262  foreach($levels as $level){
1263  assert(!$level->isClosed());
1264  if(($entity = $level->getEntity($entityId)) instanceof Entity){
1265  return $entity;
1266  }
1267  }
1268 
1269  return null;
1270  }

◆ forceShutdown()

forceShutdown ( )
2318  {
2319  if($this->hasStopped){
2320  return;
2321  }
2322 
2323  try{
2324  if(!$this->isRunning()){
2326  }
2327 
2328  $this->hasStopped = true;
2329 
2330  $this->shutdown();
2331  if($this->rcon instanceof RCON){
2332  $this->rcon->stop();
2333  }
2334 
2335  if($this->getProperty("network.upnp-forwarding", false) === true){
2336  $this->logger->info("[UPnP] Removing port forward...");
2337  UPnP::RemovePortForward($this->getPort());
2338  }
2339 
2340  $this->getLogger()->debug("Disabling all plugins");
2341  $this->pluginManager->disablePlugins();
2342 
2343  foreach($this->players as $player){
2344  $player->close($player->getLeaveMessage(), $this->getProperty("settings.shutdown-message", "Server closed"));
2345  }
2346 
2347  $this->getLogger()->debug("Unloading all levels");
2348  foreach($this->getLevels() as $level){
2349  $this->unloadLevel($level, true);
2350  }
2351 
2352  $this->getLogger()->debug("Removing event handlers");
2354 
2355  $this->getLogger()->debug("Stopping all tasks");
2356  $this->scheduler->cancelAllTasks();
2357  $this->scheduler->mainThreadHeartbeat(PHP_INT_MAX);
2358 
2359  $this->getLogger()->debug("Saving properties");
2360  $this->properties->save();
2361 
2362  $this->getLogger()->debug("Closing console");
2363  $this->console->shutdown();
2364  $this->console->notify();
2365 
2366  $this->getLogger()->debug("Stopping network interfaces");
2367  foreach($this->network->getInterfaces() as $interface){
2368  $interface->shutdown();
2369  $this->network->unregisterInterface($interface);
2370  }
2371 
2372  //$this->memoryManager->doObjectCleanup();
2373 
2374  gc_collect_cycles();
2375  }catch(\Throwable $e){
2376  $this->logger->logException($e);
2377  $this->logger->emergency("Crashed while crashing, killing process");
2378  @kill(getmypid());
2379  }
2380 
2381  }

◆ getAdvancedProperty()

getAdvancedProperty (   $variable,
  $defaultValue = null,
Config  $cfg = null 
)
Parameters
$variable
null$defaultValue
Config | null$cfg
Returns
bool|mixed|null
2766  {
2767  $vars = explode(".", $variable);
2768  $base = array_shift($vars);
2769  if($cfg == null) $cfg = $this->advancedConfig;
2770  if($cfg->exists($base)){
2771  $base = $cfg->get($base);
2772  }else{
2773  return $defaultValue;
2774  }
2775 
2776  while(count($vars) > 0){
2777  $baseKey = array_shift($vars);
2778  if(is_array($base) and isset($base[$baseKey])){
2779  $base = $base[$baseKey];
2780  }else{
2781  return $defaultValue;
2782  }
2783  }
2784 
2785  return $base;
2786  }

◆ getAllowedViewDistance()

getAllowedViewDistance ( int  $distance)

Returns a view distance up to the currently-allowed limit.

Parameters
int$distance
Returns
int
477  : int{
478  return max(2, min($distance, $this->memoryManager->getViewDistance($this->getViewDistance())));
479  }

◆ getAllowFlight()

getAllowFlight ( )
Returns
bool
646  {
647  return $this->getConfigBoolean("allow-flight", false);
648  }

◆ getApiVersion()

getApiVersion ( )
Returns
string
409  {
410  return \pocketmine\API_VERSION;
411  }

◆ getAutoSave()

getAutoSave ( )
Returns
bool
495  {
496  return $this->autoSave;
497  }

◆ getBuild()

getBuild ( )
1630  {
1631  return $this->version->getBuild();
1632  }

◆ getCIDBans()

getCIDBans ( )
1400  {
1401  return $this->banByCID;
1402  }

◆ getCodename()

getCodename ( )
Returns
string
394  {
395  return \pocketmine\CODENAME;
396  }

◆ getCommandAliases()

getCommandAliases ( )
Returns
string[]
1487  {
1488  $section = $this->getProperty("aliases");
1489  $result = [];
1490  if(is_array($section)){
1491  foreach($section as $key => $value){
1492  $commands = [];
1493  if(is_array($value)){
1494  $commands = $value;
1495  }else{
1496  $commands[] = $value;
1497  }
1498 
1499  $result[$key] = $commands;
1500  }
1501  }
1502 
1503  return $result;
1504  }

◆ getCommandMap()

getCommandMap ( )
Returns
SimpleCommandMap
784  {
785  return $this->commandMap;
786  }

◆ getConfigBoolean()

getConfigBoolean (   $variable,
  $defaultValue = false 
)
Parameters
string$variable
boolean$defaultValue
Returns
boolean
1343  {
1344  $v = getopt("", ["$variable::"]);
1345  if(isset($v[$variable])){
1346  $value = $v[$variable];
1347  }else{
1348  $value = $this->properties->exists($variable) ? $this->properties->get($variable) : $defaultValue;
1349  }
1350 
1351  if(is_bool($value)){
1352  return $value;
1353  }
1354  switch(strtolower($value)){
1355  case "on":
1356  case "true":
1357  case "1":
1358  case "yes":
1359  return true;
1360  }
1361 
1362  return false;
1363  }

◆ getConfigInt()

getConfigInt (   $variable,
  $defaultValue = 0 
)
Parameters
string$variable
int$defaultValue
Returns
int
1320  {
1321  $v = getopt("", ["$variable::"]);
1322  if(isset($v[$variable])){
1323  return (int) $v[$variable];
1324  }
1325 
1326  return $this->properties->exists($variable) ? (int) $this->properties->get($variable) : (int) $defaultValue;
1327  }

◆ getConfigString()

getConfigString (   $variable,
  $defaultValue = "" 
)
Parameters
string$variable
string$defaultValue
Returns
string
1278  {
1279  $v = getopt("", ["$variable::"]);
1280  if(isset($v[$variable])){
1281  return (string) $v[$variable];
1282  }
1283 
1284  return $this->properties->exists($variable) ? $this->properties->get($variable) : $defaultValue;
1285  }

◆ getCraftingManager()

getCraftingManager ( )
Returns
CraftingManager
716  {
717  return $this->craftingManager;
718  }

◆ getCrashPath()

getCrashPath ( )
1506  {
1507  return $this->dataPath . "crashdumps/";
1508  }

◆ getDataPath()

getDataPath ( )
Returns
string
438  {
439  return $this->dataPath;
440  }

◆ getDefaultGamemode()

getDefaultGamemode ( )
Returns
int
660  {
661  return $this->getConfigInt("gamemode", 0) & 0b11;
662  }

◆ getDefaultLevel()

getDefaultLevel ( )
Returns
Level
1005  {
1006  return $this->levelDefault;
1007  }

◆ getDifficulty()

getDifficulty ( )
Returns
int
625  {
626  return $this->getConfigInt("difficulty", 1);
627  }

◆ getDifficultyFromString()

static getDifficultyFromString (   $str)
static
Parameters
string$str
Returns
int
597  {
598  switch(strtolower(trim($str))){
599  case "0":
600  case "peaceful":
601  case "p":
602  return 0;
603 
604  case "1":
605  case "easy":
606  case "e":
607  return 1;
608 
609  case "2":
610  case "normal":
611  case "n":
612  return 2;
613 
614  case "3":
615  case "hard":
616  case "h":
617  return 3;
618  }
619  return -1;
620  }

◆ getDServerMaxPlayers()

getDServerMaxPlayers ( )
Returns
int

Get DServer max players

1609  {
1610  return ($this->dserverAllPlayers + $this->getMaxPlayers());
1611  }

◆ getDServerOnlinePlayers()

getDServerOnlinePlayers ( )
Returns
int

Get DServer all online player count

1618  {
1619  return ($this->dserverPlayers + count($this->getOnlinePlayers()));
1620  }

◆ getEntityMetadata()

getEntityMetadata ( )
Returns
EntityMetadataStore
688  {
689  return $this->entityMetadata;
690  }

◆ getExpectedExperience()

getExpectedExperience (   $level)
1059  {
1060  if(isset($this->expCache[$level])) return $this->expCache[$level];
1061  $levelSquared = $level ** 2;
1062  if($level < 16) $this->expCache[$level] = $levelSquared + 6 * $level;
1063  elseif($level < 31) $this->expCache[$level] = 2.5 * $levelSquared - 40.5 * $level + 360;
1064  else $this->expCache[$level] = 4.5 * $levelSquared - 162.5 * $level + 2220;
1065  return $this->expCache[$level];
1066  }

◆ getFilePath()

getFilePath ( )
Returns
string
431  {
432  return $this->filePath;
433  }

◆ getForceGamemode()

getForceGamemode ( )
Returns
bool
533  {
534  return $this->getConfigBoolean("force-gamemode", false);
535  }

◆ getFormattedVersion()

getFormattedVersion (   $prefix = "")
373  {
374  return (\pocketmine\VERSION !== ""? $prefix . \pocketmine\VERSION : "");
375  }

◆ getGamemode()

getGamemode ( )
Returns
int
526  {
527  return $this->getConfigInt("gamemode", 0) & 0b11;
528  }

◆ getGamemodeFromString()

static getGamemodeFromString (   $str)
static

Parses a string and returns a gamemode integer, -1 if not found

Parameters
string$str
Returns
int
566  {
567  switch(strtolower(trim($str))){
568  case (string) Player::SURVIVAL:
569  case "survival":
570  case "s":
571  return Player::SURVIVAL;
572 
573  case (string) Player::CREATIVE:
574  case "creative":
575  case "c":
576  return Player::CREATIVE;
577 
578  case (string) Player::ADVENTURE:
579  case "adventure":
580  case "a":
581  return Player::ADVENTURE;
582 
583  case (string) Player::SPECTATOR:
584  case "spectator":
585  case "view":
586  case "v":
587  return Player::SPECTATOR;
588  }
589  return -1;
590  }

◆ getGamemodeString()

static getGamemodeString (   $mode)
static

Returns the gamemode text name

Parameters
int$mode
Returns
string
544  {
545  switch((int) $mode){
546  case Player::SURVIVAL:
547  return "%gameMode.survival";
548  case Player::CREATIVE:
549  return "%gameMode.creative";
550  case Player::ADVENTURE:
551  return "%gameMode.adventure";
552  case Player::SPECTATOR:
553  return "%gameMode.spectator";
554  }
555 
556  return "UNKNOWN";
557  }

◆ getGameVersion()

getGameVersion ( )
1634  {
1635  return $this->version->getRelease();
1636  }

◆ getGenerateStructures()

getGenerateStructures ( )
Returns
bool
519  {
520  return $this->getConfigBoolean("generate-structures", true);
521  }

◆ getGeniApiVersion()

getGeniApiVersion ( )
Returns
string
424  {
425  return \pocketmine\GENISYS_API_VERSION;
426  }

◆ getGitCommit()

getGitCommit ( )
Returns
string
380  {
381  return \pocketmine\GIT_COMMIT;
382  }

◆ getInstance()

static getInstance ( )
static
Returns
Server
1513  : Server{
1514  return self::$instance;
1515  }

◆ getIp()

getIp ( )
Returns
string
484  {
485  return $this->getConfigString("server-ip", "0.0.0.0");
486  }

◆ getIPBans()

getIPBans ( )
Returns
BanList
1396  {
1397  return $this->banByIP;
1398  }

◆ getiTXApiVersion()

getiTXApiVersion ( )
Returns
string
417  {
418  return \pocketmine\GENISYS_API_VERSION;
419  }

◆ getLanguage()

getLanguage ( )
Returns
BaseLang
2690  {
2691  return $this->baseLang;
2692  }

◆ getLevel()

getLevel (   $levelId)
Parameters
int$levelId
Returns
Level
1036  {
1037  if(isset($this->levels[$levelId])){
1038  return $this->levels[$levelId];
1039  }
1040 
1041  return null;
1042  }

◆ getLevelByName()

getLevelByName (   $name)
Parameters
$name
Returns
Level
1049  {
1050  foreach($this->getLevels() as $level){
1051  if($level->getFolderName() === $name){
1052  return $level;
1053  }
1054  }
1055 
1056  return null;
1057  }

◆ getLevelMetadata()

getLevelMetadata ( )
Returns
LevelMetadataStore
702  {
703  return $this->levelMetadata;
704  }

◆ getLevels()

getLevels ( )
Returns
Level[]
998  {
999  return $this->levels;
1000  }

◆ getLevelType()

getLevelType ( )
Returns
string
512  {
513  return $this->getConfigString("level-type", "DEFAULT");
514  }

◆ getLoader()

getLoader ( )
Returns
674  {
675  return $this->autoloader;
676  }

◆ getLogger()

getLogger ( )
Returns
MainLogger
681  {
682  return $this->logger;
683  }

◆ getMaxPlayers()

getMaxPlayers ( )
Returns
int
452  {
453  return $this->maxPlayers;
454  }

◆ getMemoryManager()

getMemoryManager ( )
Returns
MemoryManager
2711  {
2712  return $this->memoryManager;
2713  }

◆ getMotd()

getMotd ( )
Returns
string
667  {
668  return $this->getConfigString("motd", "Minecraft: PE Server");
669  }

◆ getName()

getName ( )
Returns
string
323  : string{
324  return "GenisysPro";
325  }

◆ getNameBans()

getNameBans ( )
Returns
BanList
1389  {
1390  return $this->banByName;
1391  }

◆ getNetwork()

getNetwork ( )
Returns
Network
2704  {
2705  return $this->network;
2706  }

◆ getOfflinePlayer()

getOfflinePlayer (   $name)
Parameters
string$name
Returns
OfflinePlayer|Player
808  {
809  $name = strtolower($name);
810  $result = $this->getPlayerExact($name);
811 
812  if($result === null){
813  $result = new OfflinePlayer($this, $name);
814  }
815 
816  return $result;
817  }

◆ getOfflinePlayerData()

getOfflinePlayerData (   $name)
Parameters
string$name
Returns
CompoundTag
824  {
825  $name = strtolower($name);
826  $path = $this->getDataPath() . "players/";
827  if($this->shouldSavePlayerData()){
828  if(file_exists($path . "$name.dat")){
829  try{
830  $nbt = new NBT(NBT::BIG_ENDIAN);
831  $nbt->readCompressed(file_get_contents($path . "$name.dat"));
832 
833  return $nbt->getData();
834  }catch(\Throwable $e){ //zlib decode error / corrupt data
835  rename($path . "$name.dat", $path . "$name.dat.bak");
836  $this->logger->notice($this->getLanguage()->translateString("pocketmine.data.playerCorrupted", [$name]));
837  }
838  }else{
839  $this->logger->notice($this->getLanguage()->translateString("pocketmine.data.playerNotFound", [$name]));
840  }
841  }
842  $spawn = $this->getDefaultLevel()->getSafeSpawn();
843  $nbt = new CompoundTag("", [
844  new LongTag("firstPlayed", floor(microtime(true) * 1000)),
845  new LongTag("lastPlayed", floor(microtime(true) * 1000)),
846  new ListTag("Pos", [
847  new DoubleTag(0, $spawn->x),
848  new DoubleTag(1, $spawn->y),
849  new DoubleTag(2, $spawn->z)
850  ]),
851  new StringTag("Level", $this->getDefaultLevel()->getName()),
852  //new StringTag("SpawnLevel", $this->getDefaultLevel()->getName()),
853  //new IntTag("SpawnX", (int) $spawn->x),
854  //new IntTag("SpawnY", (int) $spawn->y),
855  //new IntTag("SpawnZ", (int) $spawn->z),
856  //new ByteTag("SpawnForced", 1), //TODO
857  new ListTag("Inventory", []),
858  new ListTag("EnderChestInventory", []),
859  new CompoundTag("Achievements", []),
860  new IntTag("playerGameType", $this->getGamemode()),
861  new ListTag("Motion", [
862  new DoubleTag(0, 0.0),
863  new DoubleTag(1, 0.0),
864  new DoubleTag(2, 0.0)
865  ]),
866  new ListTag("Rotation", [
867  new FloatTag(0, 0.0),
868  new FloatTag(1, 0.0)
869  ]),
870  new FloatTag("FallDistance", 0.0),
871  new ShortTag("Fire", 0),
872  new ShortTag("Air", 300),
873  new ByteTag("OnGround", 1),
874  new ByteTag("Invulnerable", 0),
875  new StringTag("NameTag", $name),
876  new ShortTag("Health", 20),
877  new ShortTag("MaxHealth", 20),
878  ]);
879  $nbt->Pos->setTagType(NBT::TAG_Double);
880  $nbt->Inventory->setTagType(NBT::TAG_Compound);
881  $nbt->EnderChestInventory->setTagType(NBT::TAG_Compound);
882  $nbt->Motion->setTagType(NBT::TAG_Double);
883  $nbt->Rotation->setTagType(NBT::TAG_Float);
884 
885  $this->saveOfflinePlayerData($name, $nbt);
886 
887  return $nbt;
888 
889  }

◆ getOnlinePlayers()

getOnlinePlayers ( )
Returns
Player[]
791  {
792  return $this->playerList;
793  }

◆ getOps()

getOps ( )
Returns
Config
1476  {
1477  return $this->operators;
1478  }

◆ getPlayer()

getPlayer ( string  $name)
Parameters
string$name
Returns
Player
919  {
920  $found = null;
921  $name = strtolower($name);
922  $delta = PHP_INT_MAX;
923  foreach($this->getOnlinePlayers() as $player){
924  if(stripos($player->getName(), $name) === 0){
925  $curDelta = strlen($player->getName()) - strlen($name);
926  if($curDelta < $delta){
927  $found = $player;
928  $delta = $curDelta;
929  }
930  if($curDelta === 0){
931  break;
932  }
933  }
934  }
935 
936  return $found;
937  }

◆ getPlayerExact()

getPlayerExact ( string  $name)
Parameters
string$name
Returns
Player
944  {
945  $name = strtolower($name);
946  foreach($this->getOnlinePlayers() as $player){
947  if(strtolower($player->getName()) === $name){
948  return $player;
949  }
950  }
951 
952  return null;
953  }

◆ getPlayerMetadata()

getPlayerMetadata ( )
Returns
PlayerMetadataStore
695  {
696  return $this->playerMetadata;
697  }

◆ getPluginCommand()

getPluginCommand (   $name)
Parameters
string$name
Returns
command
1378  {
1379  if(($command = $this->commandMap->getCommand($name)) instanceof PluginIdentifiableCommand){
1380  return $command;
1381  }else{
1382  return null;
1383  }
1384  }

◆ getPluginManager()

getPluginManager ( )
Returns
PluginManager
709  {
710  return $this->pluginManager;
711  }

◆ getPluginPath()

getPluginPath ( )
Returns
string
445  {
446  return $this->pluginPath;
447  }

◆ getPocketMineVersion()

getPocketMineVersion ( )
Returns
string
369  {
370  return \pocketmine\VERSION;
371  }

◆ getPort()

getPort ( )
Returns
int
459  {
460  return $this->getConfigInt("server-port", 19132);
461  }

◆ getProperty()

getProperty (   $variable,
  $defaultValue = null 
)
Parameters
string$variable
mixed$defaultValue
Returns
mixed
1293  {
1294  if(!array_key_exists($variable, $this->propertyCache)){
1295  $v = getopt("", ["$variable::"]);
1296  if(isset($v[$variable])){
1297  $this->propertyCache[$variable] = $v[$variable];
1298  }else{
1299  $this->propertyCache[$variable] = $this->config->getNested($variable);
1300  }
1301  }
1302 
1303  return $this->propertyCache[$variable] === null ? $defaultValue : $this->propertyCache[$variable];
1304  }

◆ getQueryInformation()

getQueryInformation ( )
2383  {
2384  return $this->queryRegenerateTask;
2385  }

◆ getResourceManager()

getResourceManager ( )
Returns
ResourcePackManager
723  : ResourcePackManager{
724  return $this->resourceManager;
725  }

◆ getResourcePackManager()

getResourcePackManager ( )
727  : ResourcePackManager{
728  return $this->resourceManager;
729  }

◆ getScheduler()

getScheduler ( )
Returns
ServerScheduler
734  {
735  return $this->scheduler;
736  }

◆ getServerUniqueId()

getServerUniqueId ( )
488  {
489  return $this->serverID;
490  }

◆ getShortGitCommit()

getShortGitCommit ( )
Returns
string
387  {
388  return substr(\pocketmine\GIT_COMMIT, 0, 7);
389  }

◆ getSpawnRadius()

getSpawnRadius ( )
Returns
int
639  {
640  return $this->getConfigInt("spawn-protection", 16);
641  }

◆ getTick()

getTick ( )
Returns
int
741  {
742  return $this->tickCounter;
743  }

◆ getTicksPerSecond()

getTicksPerSecond ( )

Returns the last server TPS measure

Returns
float
750  {
751  return round($this->maxTick, 2);
752  }

◆ getTicksPerSecondAverage()

getTicksPerSecondAverage ( )

Returns the last server TPS average measure

Returns
float
759  {
760  return round(array_sum($this->tickAverage) / count($this->tickAverage), 2);
761  }

◆ getTickUsage()

getTickUsage ( )

Returns the TPS usage/load in %

Returns
float
768  {
769  return round($this->maxUse * 100, 2);
770  }

◆ getTickUsageAverage()

getTickUsageAverage ( )

Returns the TPS usage/load average in %

Returns
float
777  {
778  return round((array_sum($this->useAverage) / count($this->useAverage)) * 100, 2);
779  }

◆ getUptime()

getUptime ( )
Returns
string Returns a formatted string of how long the server has been running for
338  {
339  $time = microtime(true) - \pocketmine\START_TIME;
340 
341  $seconds = floor($time % 60);
342  $minutes = null;
343  $hours = null;
344  $days = null;
345 
346  if($time >= 60){
347  $minutes = floor(($time % 3600) / 60);
348  if($time >= 3600){
349  $hours = floor(($time % (3600 * 24)) / 3600);
350  if($time >= 3600 * 24){
351  $days = floor($time / (3600 * 24));
352  }
353  }
354  }
355 
356  $uptime = ($minutes !== null ?
357  ($hours !== null ?
358  ($days !== null ?
359  "$days " . $this->getLanguage()->translateString("%pocketmine.command.status.days") . " "
360  : "") . "$hours " . $this->getLanguage()->translateString("%pocketmine.command.status.hours") . " "
361  : "") . "$minutes " . $this->getLanguage()->translateString("%pocketmine.command.status.minutes") . " "
362  : "") . "$seconds " . $this->getLanguage()->translateString("%pocketmine.command.status.seconds");
363  return $uptime;
364  }

◆ getVersion()

getVersion ( )
Returns
string
401  {
403  return $version;
404  }

◆ getViewDistance()

getViewDistance ( )
Returns
int
466  : int{
467  return max(2, $this->getConfigInt("view-distance", 8));
468  }

◆ getWhitelisted()

getWhitelisted ( )
Returns
Config
1469  {
1470  return $this->whitelist;
1471  }

◆ handlePacket()

handlePacket (   $address,
  $port,
  $payload 
)
Parameters
string$address
int$port
string$payloadTODO: move this to Network
2743  {
2744  try{
2745  if(strlen($payload) > 2 and substr($payload, 0, 2) === "\xfe\xfd" and $this->queryHandler instanceof QueryHandler){
2746  $this->queryHandler->handle($address, $port, $payload);
2747  }
2748  }catch(\Throwable $e){
2749  if(\pocketmine\DEBUG > 1){
2750  if($this->logger instanceof MainLogger){
2751  $this->logger->logException($e);
2752  }
2753  }
2754 
2755  $this->getNetwork()->blockAddress($address, 600);
2756  }
2757  //TODO: add raw packet events
2758  }

◆ handleSignal()

handleSignal (   $signo)
2432  {
2433  if($signo === SIGTERM or $signo === SIGINT or $signo === SIGHUP){
2434  $this->shutdown();
2435  }
2436  }

◆ hasWhitelist()

hasWhitelist ( )
Returns
bool
632  {
633  return $this->getConfigBoolean("white-list", false);
634  }

◆ isDServerEnabled()

isDServerEnabled ( )
1622  {
1623  return $this->dserverConfig["enable"];
1624  }

◆ isHardcore()

isHardcore ( )
Returns
bool
653  {
654  return $this->getConfigBoolean("hardcore", false);
655  }

◆ isLanguageForced()

isLanguageForced ( )
Returns
bool
2697  {
2698  return $this->forceLanguage;
2699  }

◆ isLevelGenerated()

isLevelGenerated (   $name)
Parameters
string$name
Returns
bool
1224  {
1225  if(trim($name) === ""){
1226  return false;
1227  }
1228  $path = $this->getDataPath() . "worlds/" . $name . "/";
1229  if(!($this->getLevelByName($name) instanceof Level)){
1230 
1231  if(LevelProviderManager::getProvider($path) === null){
1232  return false;
1233  }
1234  /*if(file_exists($path)){
1235  $level = new LevelImport($path);
1236  if($level->import() === false){ //Try importing a world
1237  return false;
1238  }
1239  }else{
1240  return false;
1241  }*/
1242  }
1243 
1244  return true;
1245  }

◆ isLevelLoaded()

isLevelLoaded (   $name)
Parameters
string$name
Returns
bool
1027  {
1028  return $this->getLevelByName($name) instanceof Level;
1029  }

◆ isOp()

isOp (   $name)
Parameters
string$name
Returns
bool
1462  {
1463  return $this->operators->exists($name, true);
1464  }

◆ isRunning()

isRunning ( )
Returns
bool
330  {
331  return $this->isRunning === true;
332  }

◆ isWhitelisted()

isWhitelisted (   $name)
Parameters
string$name
Returns
bool
1453  {
1454  return !$this->hasWhitelist() or $this->whitelist->exists($name, true);
1455  }

◆ loadAdvancedConfig()

loadAdvancedConfig ( )
1549  {
1550  $this->playerMsgType = $this->getAdvancedProperty("server.player-msg-type", self::PLAYER_MSG_TYPE_MESSAGE);
1551  $this->playerLoginMsg = $this->getAdvancedProperty("server.login-msg", "§3@player joined the game");
1552  $this->playerLogoutMsg = $this->getAdvancedProperty("server.logout-msg", "§3@player left the game");
1553  $this->weatherEnabled = $this->getAdvancedProperty("level.weather", true);
1554  $this->foodEnabled = $this->getAdvancedProperty("player.hunger", true);
1555  $this->expEnabled = $this->getAdvancedProperty("player.experience", true);
1556  $this->keepInventory = $this->getAdvancedProperty("player.keep-inventory", false);
1557  $this->keepExperience = $this->getAdvancedProperty("player.keep-experience", false);
1558  $this->loadIncompatibleAPI = $this->getAdvancedProperty("developer.load-incompatible-api", true);
1559  $this->netherEnabled = $this->getAdvancedProperty("nether.allow-nether", false);
1560  $this->netherName = $this->getAdvancedProperty("nether.level-name", "nether");
1561  $this->enderEnabled = $this->getAdvancedProperty("ender.allow-ender", false);
1562  $this->enderName = $this->getAdvancedProperty("ender.level-name", "ender");
1563  $this->weatherRandomDurationMin = $this->getAdvancedProperty("level.weather-random-duration-min", 6000);
1564  $this->weatherRandomDurationMax = $this->getAdvancedProperty("level.weather-random-duration-max", 12000);
1565  $this->lightningTime = $this->getAdvancedProperty("level.lightning-time", 200);
1566  $this->lightningFire = $this->getAdvancedProperty("level.lightning-fire", false);
1567  $this->allowSnowGolem = $this->getAdvancedProperty("server.allow-snow-golem", false);
1568  $this->allowIronGolem = $this->getAdvancedProperty("server.allow-iron-golem", false);
1569  $this->autoClearInv = $this->getAdvancedProperty("player.auto-clear-inventory", true);
1570  $this->dserverConfig = [
1571  "enable" => $this->getAdvancedProperty("dserver.enable", false),
1572  "queryAutoUpdate" => $this->getAdvancedProperty("dserver.query-auto-update", false),
1573  "queryTickUpdate" => $this->getAdvancedProperty("dserver.query-tick-update", true),
1574  "motdMaxPlayers" => $this->getAdvancedProperty("dserver.motd-max-players", 0),
1575  "queryMaxPlayers" => $this->getAdvancedProperty("dserver.query-max-players", 0),
1576  "motdAllPlayers" => $this->getAdvancedProperty("dserver.motd-all-players", false),
1577  "queryAllPlayers" => $this->getAdvancedProperty("dserver.query-all-players", false),
1578  "motdPlayers" => $this->getAdvancedProperty("dserver.motd-players", false),
1579  "queryPlayers" => $this->getAdvancedProperty("dserver.query-players", false),
1580  "timer" => $this->getAdvancedProperty("dserver.time", 40),
1581  "retryTimes" => $this->getAdvancedProperty("dserver.retry-times", 3),
1582  "serverList" => explode(";", $this->getAdvancedProperty("dserver.server-list", ""))
1583  ];
1584  $this->redstoneEnabled = $this->getAdvancedProperty("redstone.enable", false);
1585  $this->allowFrequencyPulse = $this->getAdvancedProperty("redstone.allow-frequency-pulse", false);
1586  $this->pulseFrequency = $this->getAdvancedProperty("redstone.pulse-frequency", 20);
1587  $this->getLogger()->setWrite(!$this->getAdvancedProperty("server.disable-log", false));
1588  $this->limitedCreative = $this->getAdvancedProperty("server.limited-creative", true);
1589  $this->chunkRadius = $this->getAdvancedProperty("player.chunk-radius", -1);
1590  $this->destroyBlockParticle = $this->getAdvancedProperty("server.destroy-block-particle", true);
1591  $this->allowSplashPotion = $this->getAdvancedProperty("server.allow-splash-potion", true);
1592  $this->fireSpread = $this->getAdvancedProperty("level.fire-spread", false);
1593  $this->advancedCommandSelector = $this->getAdvancedProperty("server.advanced-command-selector", false);
1594  $this->anvilEnabled = $this->getAdvancedProperty("enchantment.enable-anvil", true);
1595  $this->enchantingTableEnabled = $this->getAdvancedProperty("enchantment.enable-enchanting-table", true);
1596  $this->countBookshelf = $this->getAdvancedProperty("enchantment.count-bookshelf", false);
1597 
1598  $this->allowInventoryCheats = $this->getAdvancedProperty("inventory.allow-cheats", false);
1599  $this->folderpluginloader = $this->getAdvancedProperty("developer.folder-plugin-loader", true);
1600  $this->absorbWater = $this->getAdvancedProperty("server.absorb-water", false);
1601 
1602  }

◆ loadLevel()

loadLevel (   $name)

Loads a level from the data directory

Parameters
string$name
Returns
bool
Exceptions
LevelException
1096  {
1097  if(trim($name) === ""){
1098  throw new LevelException("Invalid empty level name");
1099  }
1100  if($this->isLevelLoaded($name)){
1101  return true;
1102  }elseif(!$this->isLevelGenerated($name)){
1103  $this->logger->notice($this->getLanguage()->translateString("pocketmine.level.notFound", [$name]));
1104 
1105  return false;
1106  }
1107 
1108  $path = $this->getDataPath() . "worlds/" . $name . "/";
1109 
1110  $provider = LevelProviderManager::getProvider($path);
1111 
1112  if($provider === null){
1113  $this->logger->error($this->getLanguage()->translateString("pocketmine.level.loadError", [$name, "Unknown provider"]));
1114 
1115  return false;
1116  }
1117 
1118  try{
1119  $level = new Level($this, $name, $path, $provider);
1120  }catch(\Throwable $e){
1121 
1122  $this->logger->error($this->getLanguage()->translateString("pocketmine.level.loadError", [$name, $e->getMessage()]));
1123  if($this->logger instanceof MainLogger){
1124  $this->logger->logException($e);
1125  }
1126  return false;
1127  }
1128 
1129  $this->levels[$level->getId()] = $level;
1130 
1131  $level->initLevel();
1132 
1133  $this->getPluginManager()->callEvent(new LevelLoadEvent($level));
1134 
1135  $level->setTickRate($this->baseTickRate);
1136 
1137  return true;
1138  }

◆ matchPlayer()

matchPlayer (   $partialName)
Parameters
string$partialName
Returns
Player[]
960  {
961  $partialName = strtolower($partialName);
962  $matchedPlayers = [];
963  foreach($this->getOnlinePlayers() as $player){
964  if(strtolower($player->getName()) === $partialName){
965  $matchedPlayers = [$player];
966  break;
967  }elseif(stripos($player->getName(), $partialName) !== false){
968  $matchedPlayers[] = $player;
969  }
970  }
971 
972  return $matchedPlayers;
973  }

◆ microSleep()

static microSleep ( int  $microseconds)
static
1517  {
1518  Server::$sleeper->synchronized(function(int $ms){
1519  Server::$sleeper->wait($ms);
1520  }, $microseconds);
1521  }

◆ onPlayerLogin()

onPlayerLogin ( Player  $player)
2556  {
2557  if($this->sendUsageTicker > 0){
2558  $this->uniquePlayers[$player->getRawUniqueId()] = $player->getRawUniqueId();
2559  }
2560 
2561  $this->sendFullPlayerListData($player);
2562  $player->dataPacket($this->craftingManager->getCraftingDataPacket());
2563  }

◆ reload()

reload ( )
2257  {
2258  $this->logger->info("Saving levels...");
2259 
2260  foreach($this->levels as $level){
2261  $level->save();
2262  }
2263 
2264  $this->pluginManager->disablePlugins();
2265  $this->pluginManager->clearPlugins();
2266  $this->commandMap->clearCommands();
2267 
2268  $this->logger->info("Reloading properties...");
2269  $this->properties->reload();
2270  $this->advancedConfig->reload();
2271  $this->loadAdvancedConfig();
2272  $this->maxPlayers = $this->getConfigInt("max-players", 20);
2273 
2274  if($this->getConfigBoolean("hardcore", false) === true and $this->getDifficulty() < 3){
2275  $this->setConfigInt("difficulty", 3);
2276  }
2277 
2278  $this->banByIP->load();
2279  $this->banByName->load();
2280  $this->banByCID->load();
2281  $this->reloadWhitelist();
2282  $this->operators->reload();
2283 
2284  $this->memoryManager->doObjectCleanup();
2285 
2286  foreach($this->getIPBans()->getEntries() as $entry){
2287  $this->getNetwork()->blockAddress($entry->getName(), -1);
2288  }
2289 
2290  $this->pluginManager->registerInterface(PharPluginLoader::class);
2291  if($this->folderpluginloader === true) {
2292  $this->pluginManager->registerInterface(FolderPluginLoader::class);
2293  }
2294  $this->pluginManager->registerInterface(ScriptPluginLoader::class);
2295  $this->pluginManager->loadPlugins($this->pluginPath);
2299  }

◆ reloadWhitelist()

reloadWhitelist ( )
1480  {
1481  $this->whitelist->reload();
1482  }

◆ removeOnlinePlayer()

removeOnlinePlayer ( Player  $player)
2576  {
2577  if(isset($this->playerList[$player->getRawUniqueId()])){
2578  unset($this->playerList[$player->getRawUniqueId()]);
2579 
2580  $pk = new PlayerListPacket();
2581  $pk->type = PlayerListPacket::TYPE_REMOVE;
2582  $pk->entries[] = [$player->getUniqueId()];
2583  $this->broadcastPacket($this->playerList, $pk);
2584  }
2585  }

◆ removeOp()

removeOp (   $name)
Parameters
string$name
1419  {
1420  foreach($this->operators->getAll() as $opName => $dummyValue){
1421  if(strtolower($name) === strtolower($opName)){
1422  $this->operators->remove($opName);
1423  }
1424  }
1425 
1426  if(($player = $this->getPlayerExact($name)) !== null){
1427  $player->recalculatePermissions();
1428  }
1429  $this->operators->save();
1430  }

◆ removePlayer()

removePlayer ( Player  $player)
Parameters
Player$player
978  {
979  if(isset($this->identifiers[$hash = spl_object_hash($player)])){
980  $identifier = $this->identifiers[$hash];
981  unset($this->players[$identifier]);
982  unset($this->identifiers[$hash]);
983  return;
984  }
985 
986  foreach($this->players as $identifier => $p){
987  if($player === $p){
988  unset($this->players[$identifier]);
989  unset($this->identifiers[spl_object_hash($player)]);
990  break;
991  }
992  }
993  }

◆ removePlayerListData()

removePlayerListData ( UUID  $uuid,
array  $players = null 
)
2594  {
2595  $pk = new PlayerListPacket();
2596  $pk->type = PlayerListPacket::TYPE_REMOVE;
2597  $pk->entries[] = [$uuid];
2598  $this->broadcastPacket($players === null ? $this->playerList : $players, $pk);
2599  }

◆ removeWhitelist()

removeWhitelist (   $name)
Parameters
string$name
1443  {
1444  $this->whitelist->remove(strtolower($name));
1445  $this->whitelist->save();
1446  }

◆ saveOfflinePlayerData()

saveOfflinePlayerData (   $name,
CompoundTag  $nbtTag,
  $async = false 
)
Parameters
string$name
CompoundTag$nbtTag
bool$async
896  {
897  if($this->shouldSavePlayerData()){
898  $nbt = new NBT(NBT::BIG_ENDIAN);
899  try{
900  $nbt->setData($nbtTag);
901 
902  if($async){
903  $this->getScheduler()->scheduleAsyncTask(new FileWriteTask($this->getDataPath() . "players/" . strtolower($name) . ".dat", $nbt->writeCompressed()));
904  }else{
905  file_put_contents($this->getDataPath() . "players/" . strtolower($name) . ".dat", $nbt->writeCompressed());
906  }
907  }catch(\Throwable $e){
908  $this->logger->critical($this->getLanguage()->translateString("pocketmine.data.saveError", [$name, $e->getMessage()]));
909  $this->logger->logException($e);
910  }
911  }
912  }

◆ sendFullPlayerListData()

sendFullPlayerListData ( Player  $p)
2601  {
2602  $pk = new PlayerListPacket();
2603  $pk->type = PlayerListPacket::TYPE_ADD;
2604  foreach($this->playerList as $player){
2605  if($p === $player){
2606  continue; //fixes duplicates
2607  }
2608  $pk->entries[] = [$player->getUniqueId(), $player->getId(), $player->getDisplayName(), $player->getSkinId(), $player->getSkinData()];
2609  }
2610 
2611  $p->dataPacket($pk);
2612  }

◆ sendUsage()

sendUsage (   $type = SendUsageTask::TYPE_STATUS)
2681  {
2682  $this->scheduler->scheduleAsyncTask(new SendUsageTask($this, $type, $this->uniquePlayers));
2683  $this->uniquePlayers = [];
2684  }

◆ setAutoSave()

setAutoSave (   $value)
Parameters
bool$value
502  {
503  $this->autoSave = (bool) $value;
504  foreach($this->getLevels() as $level){
505  $level->setAutoSave($this->autoSave);
506  }
507  }

◆ setConfigBool()

setConfigBool (   $variable,
  $value 
)
Parameters
string$variable
bool$value
1369  {
1370  $this->properties->set($variable, $value == true ? "1" : "0");
1371  }

◆ setConfigInt()

setConfigInt (   $variable,
  $value 
)
Parameters
string$variable
int$value
1333  {
1334  $this->properties->set($variable, (int) $value);
1335  }

◆ setConfigString()

setConfigString (   $variable,
  $value 
)
Parameters
string$variable
string$value
1310  {
1311  $this->properties->set($variable, $value);
1312  }

◆ setDefaultLevel()

setDefaultLevel (   $level)

Sets the default level to a different level This won't change the level-name property, it only affects the server on runtime

Parameters
Level$level
1016  {
1017  if($level === null or ($this->isLevelLoaded($level->getFolderName()) and $level !== $this->levelDefault)){
1018  $this->levelDefault = $level;
1019  }
1020  }

◆ shouldSavePlayerData()

shouldSavePlayerData ( )
799  : bool{
800  return (bool) $this->getProperty("player.save-player-data", true);
801  }

◆ shutdown()

shutdown ( bool  $restart = false,
string  $msg = "" 
)

Shutdowns the server correctly

Parameters
bool$restart
string$msg
2306  {
2307  /*if($this->isRunning){
2308  $killer = new ServerKiller(90);
2309  $killer->start();
2310  $killer->kill();
2311  }*/
2312  $this->isRunning = false;
2313  if($msg != ""){
2314  $this->propertyCache["settings.shutdown-message"] = $msg;
2315  }
2316  }

◆ start()

start ( )

Starts the PocketMine-MP server and starts processing ticks and packets

2390  {
2391  if($this->getConfigBoolean("enable-query", true) === true){
2392  $this->queryHandler = new QueryHandler();
2393  }
2394 
2395  foreach($this->getIPBans()->getEntries() as $entry){
2396  $this->network->blockAddress($entry->getName(), -1);
2397  }
2398 
2399  if($this->getProperty("settings.send-usage", true)){
2400  $this->sendUsageTicker = 6000;
2402  }
2403 
2404 
2405  if($this->getProperty("network.upnp-forwarding", false) == true){
2406  $this->logger->info("[UPnP] Trying to port forward...");
2407  UPnP::PortForward($this->getPort());
2408  }
2409 
2410  $this->tickCounter = 0;
2411 
2412  if(function_exists("pcntl_signal")){
2413  pcntl_signal(SIGTERM, [$this, "handleSignal"]);
2414  pcntl_signal(SIGINT, [$this, "handleSignal"]);
2415  pcntl_signal(SIGHUP, [$this, "handleSignal"]);
2416  $this->dispatchSignals = true;
2417  }
2418 
2419  $this->logger->info($this->getLanguage()->translateString("pocketmine.server.defaultGameMode", [self::getGamemodeString($this->getGamemode())]));
2420 
2421  $this->logger->info($this->getLanguage()->translateString("pocketmine.server.startFinished", [round(microtime(true) - \pocketmine\START_TIME, 3)]));
2422 
2423  if(!file_exists($this->getPluginPath() . DIRECTORY_SEPARATOR . "GenisysPro"))
2424  @mkdir($this->getPluginPath() . DIRECTORY_SEPARATOR . "GenisysPro");
2425 
2426  $this->tickProcessor();
2427  $this->forceShutdown();
2428 
2429  gc_collect_cycles();
2430  }

◆ unloadLevel()

unloadLevel ( Level  $level,
  $forceUnload = false 
)
Parameters
Level$level
bool$forceUnload
Returns
bool
1074  {
1075  if($level === $this->getDefaultLevel() and !$forceUnload){
1076  throw new \InvalidStateException("The default level cannot be unloaded while running, please switch levels.");
1077  }
1078  if($level->unload($forceUnload) === true){
1079  unset($this->levels[$level->getId()]);
1080 
1081  return true;
1082  }
1083 
1084  return false;
1085  }

◆ updateDServerInfo()

updateDServerInfo ( )
1626  {
1627  $this->scheduler->scheduleAsyncTask(new DServerTask($this->dserverConfig["serverList"], $this->dserverConfig["retryTimes"]));
1628  }

◆ updatePlayerListData()

updatePlayerListData ( UUID  $uuid,
  $entityId,
  $name,
  $skinId,
  $skinData,
array  $players = null 
)
2587  {
2588  $pk = new PlayerListPacket();
2589  $pk->type = PlayerListPacket::TYPE_ADD;
2590  $pk->entries[] = [$uuid, $entityId, $name, $skinId, $skinData];
2591  $this->broadcastPacket($players === null ? $this->playerList : $players, $pk);
2592  }

◆ updateQuery()

updateQuery ( )
2788  {
2789  try{
2790  $this->getPluginManager()->callEvent($this->queryRegenerateTask = new QueryRegenerateEvent($this, 5));
2791  if($this->queryHandler !== null){
2792  $this->queryHandler->regenerateInfo();
2793  }
2794  }catch(\Throwable $e){
2795  $this->logger->logException($e);
2796  }
2797  }

Field Documentation

◆ $absorbWater

$absorbWater = false

◆ $advancedCommandSelector

$advancedCommandSelector = false

◆ $advancedConfig

$advancedConfig = null

Advanced Config

◆ $allowFrequencyPulse

$allowFrequencyPulse = true

◆ $allowInventoryCheats

$allowInventoryCheats = false

◆ $allowIronGolem

$allowIronGolem

◆ $allowSnowGolem

$allowSnowGolem

◆ $allowSplashPotion

$allowSplashPotion = true

◆ $anvilEnabled

$anvilEnabled = false

◆ $autoClearInv

$autoClearInv = true

◆ $chunkRadius

$chunkRadius = -1

◆ $countBookshelf

$countBookshelf = false

◆ $destroyBlockParticle

$destroyBlockParticle = true

◆ $dserverAllPlayers

$dserverAllPlayers = 0

◆ $dserverConfig

$dserverConfig = []

◆ $dserverPlayers

$dserverPlayers = 0

◆ $enchantingTableEnabled

$enchantingTableEnabled = true

◆ $enderEnabled

$enderEnabled = true

◆ $enderLevel

$enderLevel = null

◆ $enderName

$enderName = "ender"

◆ $expEnabled

$expEnabled = true

◆ $fireSpread

$fireSpread = false

◆ $folderpluginloader

$folderpluginloader = true

◆ $foodEnabled

$foodEnabled = true

◆ $keepExperience

$keepExperience = false

◆ $keepInventory

$keepInventory = false

◆ $lightningFire

$lightningFire = false

◆ $lightningTime

$lightningTime = 200

◆ $limitedCreative

$limitedCreative = true

◆ $loadIncompatibleAPI

$loadIncompatibleAPI = true

◆ $netherEnabled

$netherEnabled = false

◆ $netherLevel

$netherLevel = null

◆ $netherName

$netherName = "nether"

◆ $networkCompressionLevel

$networkCompressionLevel = 7

◆ $playerLoginMsg

$playerLoginMsg = ""

◆ $playerLogoutMsg

$playerLogoutMsg = ""

◆ $playerMsgType

$playerMsgType = self::PLAYER_MSG_TYPE_MESSAGE

◆ $pulseFrequency

$pulseFrequency = 20

◆ $redstoneEnabled

$redstoneEnabled = false

◆ $version

$version

◆ $weatherEnabled

$weatherEnabled = true

◆ $weatherRandomDurationMax

$weatherRandomDurationMax = 12000

◆ $weatherRandomDurationMin

$weatherRandomDurationMin = 6000

◆ BROADCAST_CHANNEL_ADMINISTRATIVE

const BROADCAST_CHANNEL_ADMINISTRATIVE = "pocketmine.broadcast.admin"

◆ BROADCAST_CHANNEL_USERS

const BROADCAST_CHANNEL_USERS = "pocketmine.broadcast.user"

◆ PLAYER_MSG_TYPE_MESSAGE

const PLAYER_MSG_TYPE_MESSAGE = 0

◆ PLAYER_MSG_TYPE_POPUP

const PLAYER_MSG_TYPE_POPUP = 2

◆ PLAYER_MSG_TYPE_TIP

const PLAYER_MSG_TYPE_TIP = 1

The documentation for this class was generated from the following file: