mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-05-13 01:09:44 +00:00
Deprecated CallbackTask, moved sleep checking to level
This commit is contained in:
parent
1d8c29add7
commit
7ad98d4659
@ -117,7 +117,6 @@ use pocketmine\network\SourceInterface;
|
|||||||
use pocketmine\permission\PermissibleBase;
|
use pocketmine\permission\PermissibleBase;
|
||||||
use pocketmine\permission\PermissionAttachment;
|
use pocketmine\permission\PermissionAttachment;
|
||||||
use pocketmine\plugin\Plugin;
|
use pocketmine\plugin\Plugin;
|
||||||
use pocketmine\scheduler\CallbackTask;
|
|
||||||
use pocketmine\tile\Sign;
|
use pocketmine\tile\Sign;
|
||||||
use pocketmine\tile\Spawnable;
|
use pocketmine\tile\Spawnable;
|
||||||
use pocketmine\tile\Tile;
|
use pocketmine\tile\Tile;
|
||||||
@ -219,11 +218,6 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{
|
|||||||
|
|
||||||
private $batchedPackets = [];
|
private $batchedPackets = [];
|
||||||
|
|
||||||
/**
|
|
||||||
* @var \pocketmine\scheduler\TaskHandler[]
|
|
||||||
*/
|
|
||||||
protected $tasks = [];
|
|
||||||
|
|
||||||
/** @var PermissibleBase */
|
/** @var PermissibleBase */
|
||||||
private $perm = null;
|
private $perm = null;
|
||||||
|
|
||||||
@ -871,7 +865,8 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{
|
|||||||
$this->setDataFlag(self::DATA_PLAYER_FLAGS, self::DATA_PLAYER_FLAG_SLEEP, true);
|
$this->setDataFlag(self::DATA_PLAYER_FLAGS, self::DATA_PLAYER_FLAG_SLEEP, true);
|
||||||
|
|
||||||
$this->setSpawn($pos);
|
$this->setSpawn($pos);
|
||||||
$this->tasks[] = $this->server->getScheduler()->scheduleDelayedTask(new CallbackTask([$this, "checkSleep"]), 60);
|
|
||||||
|
$this->level->sleepTicks = 60;
|
||||||
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -903,36 +898,13 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{
|
|||||||
$this->sleeping = null;
|
$this->sleeping = null;
|
||||||
$this->setDataProperty(self::DATA_PLAYER_BED_POSITION, self::DATA_TYPE_POS, [0, 0, 0]);
|
$this->setDataProperty(self::DATA_PLAYER_BED_POSITION, self::DATA_TYPE_POS, [0, 0, 0]);
|
||||||
$this->setDataFlag(self::DATA_PLAYER_FLAGS, self::DATA_PLAYER_FLAG_SLEEP, false);
|
$this->setDataFlag(self::DATA_PLAYER_FLAGS, self::DATA_PLAYER_FLAG_SLEEP, false);
|
||||||
|
|
||||||
|
|
||||||
|
$this->level->sleepTicks = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* WARNING: Do not use this, it's only for internal use.
|
|
||||||
* Changes to this function won't be recorded on the version.
|
|
||||||
*/
|
|
||||||
public function checkSleep(){
|
|
||||||
if($this->sleeping instanceof Vector3){
|
|
||||||
//TODO: Move to Level
|
|
||||||
|
|
||||||
$time = $this->level->getTime() % Level::TIME_FULL;
|
|
||||||
|
|
||||||
if($time >= Level::TIME_NIGHT and $time < Level::TIME_SUNRISE){
|
|
||||||
foreach($this->level->getPlayers() as $p){
|
|
||||||
if($p->sleeping === null){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->level->setTime($this->level->getTime() + Level::TIME_FULL - $time);
|
|
||||||
|
|
||||||
foreach($this->level->getPlayers() as $p){
|
|
||||||
$p->stopSleep();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string $achievementId
|
* @param string $achievementId
|
||||||
*
|
*
|
||||||
@ -2609,11 +2581,6 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{
|
|||||||
*/
|
*/
|
||||||
public function close($message = "", $reason = "generic reason", $notify = true){
|
public function close($message = "", $reason = "generic reason", $notify = true){
|
||||||
|
|
||||||
foreach($this->tasks as $task){
|
|
||||||
$task->cancel();
|
|
||||||
}
|
|
||||||
$this->tasks = [];
|
|
||||||
|
|
||||||
if($this->connected and !$this->closed){
|
if($this->connected and !$this->closed){
|
||||||
if($notify and $reason != ""){
|
if($notify and $reason != ""){
|
||||||
$pk = new DisconnectPacket;
|
$pk = new DisconnectPacket;
|
||||||
|
@ -91,7 +91,6 @@ use pocketmine\plugin\PharPluginLoader;
|
|||||||
use pocketmine\plugin\Plugin;
|
use pocketmine\plugin\Plugin;
|
||||||
use pocketmine\plugin\PluginLoadOrder;
|
use pocketmine\plugin\PluginLoadOrder;
|
||||||
use pocketmine\plugin\PluginManager;
|
use pocketmine\plugin\PluginManager;
|
||||||
use pocketmine\scheduler\CallbackTask;
|
|
||||||
use pocketmine\scheduler\SendUsageTask;
|
use pocketmine\scheduler\SendUsageTask;
|
||||||
use pocketmine\scheduler\ServerScheduler;
|
use pocketmine\scheduler\ServerScheduler;
|
||||||
use pocketmine\tile\Chest;
|
use pocketmine\tile\Chest;
|
||||||
@ -153,11 +152,15 @@ class Server{
|
|||||||
*/
|
*/
|
||||||
private $tickCounter;
|
private $tickCounter;
|
||||||
private $nextTick = 0;
|
private $nextTick = 0;
|
||||||
private $tickAverage = [20, 20, 20, 20, 20];
|
private $tickAverage = [20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20];
|
||||||
private $useAverage = [20, 20, 20, 20, 20];
|
private $useAverage = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
||||||
private $maxTick = 20;
|
private $maxTick = 20;
|
||||||
private $maxUse = 0;
|
private $maxUse = 0;
|
||||||
|
|
||||||
|
private $sendUsageTicker = 0;
|
||||||
|
|
||||||
|
private $dispatchSignals = false;
|
||||||
|
|
||||||
/** @var \AttachableThreadedLogger */
|
/** @var \AttachableThreadedLogger */
|
||||||
private $logger;
|
private $logger;
|
||||||
|
|
||||||
@ -206,6 +209,9 @@ class Server{
|
|||||||
private $alwaysTickPlayers = false;
|
private $alwaysTickPlayers = false;
|
||||||
private $baseTickRate = 1;
|
private $baseTickRate = 1;
|
||||||
|
|
||||||
|
private $autoSaveTicker = 0;
|
||||||
|
private $autoSaveTicks = 0;
|
||||||
|
|
||||||
/** @var BaseLang */
|
/** @var BaseLang */
|
||||||
private $baseLang;
|
private $baseLang;
|
||||||
|
|
||||||
@ -1734,7 +1740,7 @@ class Server{
|
|||||||
}
|
}
|
||||||
|
|
||||||
if($this->getAutoSave() and $this->getProperty("ticks-per.autosave", 6000) > 0){
|
if($this->getAutoSave() and $this->getProperty("ticks-per.autosave", 6000) > 0){
|
||||||
$this->scheduler->scheduleDelayedRepeatingTask(new CallbackTask([$this, "doAutoSave"]), $this->getProperty("ticks-per.autosave", 6000), $this->getProperty("ticks-per.autosave", 6000));
|
$this->autoSaveTicks = (int) $this->getProperty("ticks-per.autosave", 6000);
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->enablePlugins(PluginLoadOrder::POSTWORLD);
|
$this->enablePlugins(PluginLoadOrder::POSTWORLD);
|
||||||
@ -2031,7 +2037,7 @@ class Server{
|
|||||||
}
|
}
|
||||||
|
|
||||||
if($this->getProperty("settings.send-usage", true) !== false){
|
if($this->getProperty("settings.send-usage", true) !== false){
|
||||||
$this->scheduler->scheduleDelayedRepeatingTask(new CallbackTask([$this, "sendUsage"]), 6000, 6000);
|
$this->sendUsageTicker = 6000;
|
||||||
$this->sendUsage();
|
$this->sendUsage();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2047,12 +2053,9 @@ class Server{
|
|||||||
pcntl_signal(SIGTERM, [$this, "handleSignal"]);
|
pcntl_signal(SIGTERM, [$this, "handleSignal"]);
|
||||||
pcntl_signal(SIGINT, [$this, "handleSignal"]);
|
pcntl_signal(SIGINT, [$this, "handleSignal"]);
|
||||||
pcntl_signal(SIGHUP, [$this, "handleSignal"]);
|
pcntl_signal(SIGHUP, [$this, "handleSignal"]);
|
||||||
$this->getScheduler()->scheduleRepeatingTask(new CallbackTask("pcntl_signal_dispatch"), 5);
|
$this->dispatchSignals = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
$this->getScheduler()->scheduleRepeatingTask(new CallbackTask([$this, "checkTicks"]), 20 * 5);
|
|
||||||
|
|
||||||
$this->logger->info($this->getLanguage()->translateString("pocketmine.server.defaultGameMode", [self::getGamemodeString($this->getGamemode())]));
|
$this->logger->info($this->getLanguage()->translateString("pocketmine.server.defaultGameMode", [self::getGamemodeString($this->getGamemode())]));
|
||||||
|
|
||||||
$this->logger->info($this->getLanguage()->translateString("pocketmine.server.startFinished", [round(microtime(true) - \pocketmine\START_TIME, 3)]));
|
$this->logger->info($this->getLanguage()->translateString("pocketmine.server.startFinished", [round(microtime(true) - \pocketmine\START_TIME, 3)]));
|
||||||
@ -2069,12 +2072,6 @@ class Server{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function checkTicks(){
|
|
||||||
if($this->getTicksPerSecond() < 12){
|
|
||||||
$this->logger->warning($this->getLanguage()->translateString("pocketmine.server.tickOverload"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function exceptionHandler(\Exception $e, $trace = null){
|
public function exceptionHandler(\Exception $e, $trace = null){
|
||||||
if($e === null){
|
if($e === null){
|
||||||
return;
|
return;
|
||||||
@ -2377,6 +2374,11 @@ class Server{
|
|||||||
|
|
||||||
Timings::$connectionTimer->startTiming();
|
Timings::$connectionTimer->startTiming();
|
||||||
$this->network->processInterfaces();
|
$this->network->processInterfaces();
|
||||||
|
|
||||||
|
if($this->rcon !== null){
|
||||||
|
$this->rcon->check();
|
||||||
|
}
|
||||||
|
|
||||||
Timings::$connectionTimer->stopTiming();
|
Timings::$connectionTimer->stopTiming();
|
||||||
|
|
||||||
Timings::$schedulerTimer->startTiming();
|
Timings::$schedulerTimer->startTiming();
|
||||||
@ -2401,10 +2403,28 @@ class Server{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if($this->autoSave and ++$this->autoSaveTicker >= $this->autoSaveTicks){
|
||||||
|
$this->autoSaveTicker = 0;
|
||||||
|
$this->doAutoSave();
|
||||||
|
}
|
||||||
|
|
||||||
|
if($this->sendUsageTicker > 0 and --$this->sendUsageTicker === 0){
|
||||||
|
$this->sendUsageTicker = 6000;
|
||||||
|
$this->sendUsage();
|
||||||
|
}
|
||||||
|
|
||||||
if(($this->tickCounter % 100) === 0){
|
if(($this->tickCounter % 100) === 0){
|
||||||
foreach($this->levels as $level){
|
foreach($this->levels as $level){
|
||||||
$level->clearCache();
|
$level->clearCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if($this->getTicksPerSecondAverage() < 12){
|
||||||
|
$this->logger->warning($this->getLanguage()->translateString("pocketmine.server.tickOverload"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if($this->dispatchSignals and $this->tickCounter % 5 === 0){
|
||||||
|
pcntl_signal_dispatch();
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->getMemoryManager()->check();
|
$this->getMemoryManager()->check();
|
||||||
|
@ -203,6 +203,8 @@ class Level implements ChunkManager, Metadatable{
|
|||||||
/** @var \SplFixedArray */
|
/** @var \SplFixedArray */
|
||||||
private $blockStates;
|
private $blockStates;
|
||||||
|
|
||||||
|
public $sleepTicks = 0;
|
||||||
|
|
||||||
private $chunkTickRadius;
|
private $chunkTickRadius;
|
||||||
private $chunkTickList = [];
|
private $chunkTickList = [];
|
||||||
private $chunksPerTick;
|
private $chunksPerTick;
|
||||||
@ -644,9 +646,35 @@ class Level implements ChunkManager, Metadatable{
|
|||||||
|
|
||||||
$this->processChunkRequest();
|
$this->processChunkRequest();
|
||||||
|
|
||||||
|
if($this->sleepTicks > 0 and --$this->sleepTicks <= 0){
|
||||||
|
$this->checkSleep();
|
||||||
|
}
|
||||||
|
|
||||||
$this->timings->doTick->stopTiming();
|
$this->timings->doTick->stopTiming();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function checkSleep(){
|
||||||
|
$resetTime = true;
|
||||||
|
foreach($this->getPlayers() as $p){
|
||||||
|
if(!$p->isSleeping()){
|
||||||
|
$resetTime = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if($resetTime){
|
||||||
|
$time = $this->getTime() % Level::TIME_FULL;
|
||||||
|
|
||||||
|
if($time >= Level::TIME_NIGHT and $time < Level::TIME_SUNRISE){
|
||||||
|
$this->setTime($this->getTime() + Level::TIME_FULL - $time);
|
||||||
|
|
||||||
|
foreach($this->getPlayers() as $p){
|
||||||
|
$p->stopSleep();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param Player[] $target
|
* @param Player[] $target
|
||||||
* @param Block[] $blocks
|
* @param Block[] $blocks
|
||||||
|
@ -27,7 +27,6 @@ namespace pocketmine\network\rcon;
|
|||||||
|
|
||||||
use pocketmine\command\RemoteConsoleCommandSender;
|
use pocketmine\command\RemoteConsoleCommandSender;
|
||||||
use pocketmine\event\server\RemoteServerCommandEvent;
|
use pocketmine\event\server\RemoteServerCommandEvent;
|
||||||
use pocketmine\scheduler\CallbackTask;
|
|
||||||
use pocketmine\Server;
|
use pocketmine\Server;
|
||||||
use pocketmine\utils\TextFormat;
|
use pocketmine\utils\TextFormat;
|
||||||
|
|
||||||
@ -66,7 +65,6 @@ class RCON{
|
|||||||
}
|
}
|
||||||
socket_getsockname($this->socket, $addr, $port);
|
socket_getsockname($this->socket, $addr, $port);
|
||||||
$this->server->getLogger()->info("RCON running on $addr:$port");
|
$this->server->getLogger()->info("RCON running on $addr:$port");
|
||||||
$this->server->getScheduler()->scheduleRepeatingTask(new CallbackTask([$this, "check"]), 3);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function stop(){
|
public function stop(){
|
||||||
|
@ -26,6 +26,9 @@ namespace pocketmine\scheduler;
|
|||||||
* The last parameter in the callback will be this object
|
* The last parameter in the callback will be this object
|
||||||
*
|
*
|
||||||
* If you want to do a task in a Plugin, consider extending PluginTask to your needs
|
* If you want to do a task in a Plugin, consider extending PluginTask to your needs
|
||||||
|
*
|
||||||
|
* @deprecated
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
class CallbackTask extends Task{
|
class CallbackTask extends Task{
|
||||||
|
|
||||||
|
@ -189,6 +189,18 @@ class ServerScheduler{
|
|||||||
}elseif(!$task->getOwner()->isEnabled()){
|
}elseif(!$task->getOwner()->isEnabled()){
|
||||||
throw new PluginException("Plugin '" . $task->getOwner()->getName() . "' attempted to register a task while disabled");
|
throw new PluginException("Plugin '" . $task->getOwner()->getName() . "' attempted to register a task while disabled");
|
||||||
}
|
}
|
||||||
|
}elseif($task instanceof CallbackTask and Server::getInstance()->getProperty("settings.deprecated-verbose", true)){
|
||||||
|
$callable = $task->getCallable();
|
||||||
|
if(is_array($callable)){
|
||||||
|
if(is_object($callable[0])){
|
||||||
|
$taskName = "Callback#" . get_class($callable[0]) . "::" . $callable[1];
|
||||||
|
}else{
|
||||||
|
$taskName = "Callback#" . $callable[0] . "::" . $callable[1];
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
$taskName = "Callback#" . $callable;
|
||||||
|
}
|
||||||
|
Server::getInstance()->getLogger()->warning("A plugin attempted to register a deprecated CallbackTask ($taskName)");
|
||||||
}
|
}
|
||||||
|
|
||||||
if($delay <= 0){
|
if($delay <= 0){
|
||||||
@ -201,22 +213,7 @@ class ServerScheduler{
|
|||||||
$period = 1;
|
$period = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if($task instanceof CallbackTask){
|
return $this->handle(new TaskHandler(get_class($task), $task, $this->nextId(), $delay, $period));
|
||||||
$callable = $task->getCallable();
|
|
||||||
if(is_array($callable)){
|
|
||||||
if(is_object($callable[0])){
|
|
||||||
$taskName = "Callback#" . get_class($callable[0]) . "::" . $callable[1];
|
|
||||||
}else{
|
|
||||||
$taskName = "Callback#" . $callable[0] . "::" . $callable[1];
|
|
||||||
}
|
|
||||||
}else{
|
|
||||||
$taskName = "Callback#" . $callable;
|
|
||||||
}
|
|
||||||
}else{
|
|
||||||
$taskName = get_class($task);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->handle(new TaskHandler($taskName, $task, $this->nextId(), $delay, $period));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private function handle(TaskHandler $handler){
|
private function handle(TaskHandler $handler){
|
||||||
|
Loading…
x
Reference in New Issue
Block a user