public function __construct(Level $level, $weatherTime = 12000, $weatherNow = 0) { $this->level = $level; $this->weatherTime = $weatherTime; $this->weatherNow = $weatherNow; $this->weatherLast = 0; WeatherManager::registerLevel($level); }
public function execute(CommandSender $sender, $currentAlias, array $args) { if (!$this->testPermission($sender)) { return true; } if (count($args) < 1) { $sender->sendMessage(new TranslationContainer("commands.generic.usage", [$this->usageMessage])); return false; } if ($sender instanceof Player) { $wea = (int) $args[0]; if ($wea >= 0 and $wea <= 3) { if (WeatherManager::isRegistered($sender->getLevel())) { $sender->getLevel()->getWeather()->setWeather($wea); $sender->sendMessage(TextFormat::GREEN . "Weather changed successfully for " . $sender->getLevel()->getFolderName()); return true; } else { $sender->sendMessage(TextFormat::RED . $sender->getLevel()->getFolderName() . " hasn't registered to WeatherManager."); return false; } } else { $sender->sendMessage(TextFormat::RED . "Invalid weather."); return false; } } if (count($args) < 2) { $sender->sendMessage(TextFormat::RED . "Wrong parameters."); return false; } $level = $sender->getServer()->getLevelByName($args[0]); if (!$level instanceof Level) { $sender->sendMessage(TextFormat::RED . "Invalid level name."); return false; } $wea = (int) $args[1]; if ($wea >= 0 and $wea <= 3) { if (WeatherManager::isRegistered($level)) { $level->getWeather()->setWeather($wea); $sender->sendMessage(TextFormat::GREEN . "Weather changed successfully for " . $level->getFolderName()); return true; } else { $sender->sendMessage(TextFormat::RED . $level->getFolderName() . " hasn't registered to WeatherManager."); return false; } } else { $sender->sendMessage(TextFormat::RED . "Invalid weather."); return false; } return true; }
public function execute(CommandSender $sender, $currentAlias, array $args) { if (!$this->testPermission($sender)) { return true; } if (count($args) < 1) { $sender->sendMessage(new TranslationContainer("commands.generic.usage", [$this->usageMessage])); return false; } if ($sender instanceof Player) { $wea = (int) $args[0]; if ($wea >= 0 and $wea <= 3) { if (WeatherManager::isRegistered($sender->getLevel())) { $sender->getLevel()->getWeather()->setWeather($wea); $sender->sendMessage(new TranslationContainer("pocketmine.command.weather.changed", [$sender->getLevel()->getFolderName()])); return true; } else { $sender->sendMessage(new TranslationContainer("pocketmine.command.weather.noregistered", [$sender->getLevel()->getFolderName()])); return false; } } else { $sender->sendMessage(TextFormat::RED . "%pocketmine.command.weather.invalid"); return false; } } if (count($args) < 2) { $sender->sendMessage(TextFormat::RED . "%pocketmine.command.weather.wrong"); return false; } $level = $sender->getServer()->getLevelByName($args[0]); if (!$level instanceof Level) { $sender->sendMessage(TextFormat::RED . "%pocketmine.command.weather.invalid.level"); return false; } $wea = (int) $args[1]; if ($wea >= 0 and $wea <= 3) { if (WeatherManager::isRegistered($level)) { $level->getWeather()->setWeather($wea); $sender->sendMessage(new TranslationContainer("pocketmine.command.weather.changed", [$level->getFolderName()])); return true; } else { $sender->sendMessage(new TranslationContainer("pocketmine.command.weather.noregistered", [$level->getFolderName()])); return false; } } else { $sender->sendMessage(TextFormat::RED . "%pocketmine.command.weather.invalid"); return false; } return true; }
public function execute(CommandSender $sender, $currentAlias, array $args) { if (count($args) < 1) { $sender->sendMessage(new TranslationContainer("commands.generic.usage", [$this->usageMessage])); return false; } if ($sender instanceof Player) { $wea = (int) $args[0]; if ($wea >= 0 and $wea <= 3) { if (WeatherManager::isRegistered($sender->getLevel())) { $sender->getLevel()->getWeather()->setWeather($wea); $sender->sendMessage(TextFormat::GREEN . "天气设置成功!"); return true; } else { $sender->sendMessage(TextFormat::RED . "这个世界没有注册到天气管理器!"); return false; } } else { $sender->sendMessage(TextFormat::RED . "无效的天气!"); return false; } } if (count($args) < 2) { $sender->sendMessage(TextFormat::RED . "缺少参数!"); return false; } $level = $sender->getServer()->getLevelByName($args[0]); if (!$level instanceof Level) { $sender->sendMessage(TextFormat::RED . "错误的地图名!"); return false; } $wea = (int) $args[1]; if ($wea >= 0 and $wea <= 3) { if (WeatherManager::isRegistered($level)) { $level->getWeather()->setWeather($wea); $sender->sendMessage(TextFormat::GREEN . "天气设置成功!"); return true; } else { $sender->sendMessage(TextFormat::RED . "这个世界没有注册到天气管理器!"); return false; } } else { $sender->sendMessage(TextFormat::RED . "无效的天气!"); return false; } return true; }
protected function doFirstSpawn() { $this->spawned = true; $this->sendSettings(); $this->setMovementSpeed(0.1); $this->sendPotionEffects($this); $this->sendData($this); $this->inventory->sendContents($this); $this->inventory->sendArmorContents($this); $pk = new SetTimePacket(); $pk->time = $this->level->getTime(); $pk->started = $this->level->stopTime == false; $this->dataPacket($pk); $pos = $this->level->getSafeSpawn($this); $this->server->getPluginManager()->callEvent($ev = new PlayerRespawnEvent($this, $pos)); $pos = $ev->getRespawnPosition()->add(0, 0.2, 0); $pk = new RespawnPacket(); $pk->x = $pos->x; $pk->y = $pos->y; $pk->z = $pos->z; $this->dataPacket($pk); $pk = new PlayStatusPacket(); $pk->status = PlayStatusPacket::PLAYER_SPAWN; $this->dataPacket($pk); $this->noDamageTicks = 60; foreach ($this->usedChunks as $index => $c) { Level::getXZ($index, $chunkX, $chunkZ); foreach ($this->level->getChunkEntities($chunkX, $chunkZ) as $entity) { if ($entity !== $this and !$entity->closed and $entity->isAlive()) { $entity->spawnTo($this); } } } $this->teleport($pos); $this->server->getPluginManager()->callEvent($ev = new PlayerJoinEvent($this, new TranslationContainer(TextFormat::YELLOW . "%multiplayer.player.joined", [$this->getDisplayName()]))); if (strlen(trim($msg = $ev->getJoinMessage())) > 0) { if ($this->server->playerMsgType === Server::PLAYER_MSG_TYPE_MESSAGE) { $this->server->broadcastMessage($msg); } elseif ($this->server->playerMsgType === Server::PLAYER_MSG_TYPE_TIP) { $this->server->broadcastTip(str_replace("@player", $this->getName(), $this->server->playerLoginMsg)); } elseif ($this->server->playerMsgType === Server::PLAYER_MSG_TYPE_POPUP) { $this->server->broadcastPopup(str_replace("@player", $this->getName(), $this->server->playerLoginMsg)); } } $this->setAllowFlight($this->gamemode == 3 || $this->gamemode == 1); $this->server->onPlayerLogin($this); $this->spawnToAll(); if (WeatherManager::isRegistered($this->level)) { $this->level->getWeather()->sendWeather($this); } if ($this->server->expEnabled) { //$this->checkExpLevel(); $this->updateExperience(); } $this->setHealth($this->getHealth()); if ($this->server->foodEnabled) { $this->setFood($this->getFood()); } else { $this->setFood(20); } if ($this->server->dserverConfig["enable"] and $this->server->dserverConfig["queryAutoUpdate"]) { $this->server->updateQuery(); } /*if($this->server->getUpdater()->hasUpdate() and $this->hasPermission(Server::BROADCAST_CHANNEL_ADMINISTRATIVE)){ $this->server->getUpdater()->showPlayerUpdate($this); }*/ if ($this->getHealth() <= 0) { $pk = new RespawnPacket(); $pos = $this->getSpawn(); $pk->x = $pos->x; $pk->y = $pos->y; $pk->z = $pos->z; $this->dataPacket($pk); } }
/** * Unloads the current level from memory safely * * @param bool $force default false, force unload of default level * * @return bool */ public function unload($force = false) { $ev = new LevelUnloadEvent($this); if ($this === $this->server->getDefaultLevel() and $force !== true) { $ev->setCancelled(true); } $this->server->getPluginManager()->callEvent($ev); if (!$force and $ev->isCancelled()) { return false; } $this->server->getLogger()->info($this->server->getLanguage()->translateString("pocketmine.level.unloading", [$this->getName()])); $defaultLevel = $this->server->getDefaultLevel(); foreach ($this->getPlayers() as $player) { if ($this === $defaultLevel or $defaultLevel === null) { $player->close($player->getLeaveMessage(), "Forced default level unload"); } elseif ($defaultLevel instanceof Level) { $player->teleport($this->server->getDefaultLevel()->getSafeSpawn()); } } if ($this === $defaultLevel) { $this->server->setDefaultLevel(null); } if ($this->weather != null) { WeatherManager::unregisterLevel($this); } $this->close(); return true; }
/** * Tries to execute a server tick */ private function tick() { $tickTime = microtime(true); if ($tickTime - $this->nextTick < -0.025) { //Allow half a tick of diff return false; } Timings::$serverTickTimer->startTiming(); ++$this->tickCounter; $this->checkConsole(); Timings::$connectionTimer->startTiming(); $this->network->processInterfaces(); if ($this->rcon !== null) { $this->rcon->check(); } Timings::$connectionTimer->stopTiming(); Timings::$schedulerTimer->startTiming(); $this->scheduler->mainThreadHeartbeat($this->tickCounter); Timings::$schedulerTimer->stopTiming(); $this->checkTickUpdates($this->tickCounter, $tickTime); foreach ($this->players as $player) { $player->checkNetwork(); } if (($this->tickCounter & 0b1111) === 0) { $this->titleTick(); $this->maxTick = 20; $this->maxUse = 0; if (($this->tickCounter & 0b111111111) === 0) { if ($this->dserverConfig["enable"] and $this->dserverConfig["queryTickUpdate"] or !$this->dserverConfig["enable"]) { $this->updateQuery(); } } $this->getNetwork()->updateName(); } if ($this->autoSave and ++$this->autoSaveTicker >= $this->autoSaveTicks) { $this->autoSaveTicker = 0; $this->doAutoSave(); } if ($this->weatherEnabled) { WeatherManager::updateWeather(); } /*if($this->sendUsageTicker > 0 and --$this->sendUsageTicker === 0){ $this->sendUsageTicker = 6000; $this->sendUsage(SendUsageTask::TYPE_STATUS); }*/ if ($this->tickCounter % 100 === 0) { foreach ($this->levels as $level) { $level->clearCache(); } if ($this->getTicksPerSecondAverage() < 1) { $this->logger->warning($this->getLanguage()->translateString("pocketmine.server.tickOverload")); } } if ($this->dispatchSignals and $this->tickCounter % 5 === 0) { pcntl_signal_dispatch(); } $this->getMemoryManager()->check(); Timings::$serverTickTimer->stopTiming(); $now = microtime(true); $tick = min(20, 1 / max(0.001, $now - $tickTime)); $use = min(1, ($now - $tickTime) / 0.05); //TimingsHandler::tick($tick <= $this->profilingTickRate); if ($this->maxTick > $tick) { $this->maxTick = $tick; } if ($this->maxUse < $use) { $this->maxUse = $use; } array_shift($this->tickAverage); $this->tickAverage[] = $tick; array_shift($this->useAverage); $this->useAverage[] = $use; if ($this->nextTick - $tickTime < -1) { $this->nextTick = $tickTime; } else { $this->nextTick += 0.05; } return true; }