From a0739a7b03cb9f80efac46aa7e7a60334da09df0 Mon Sep 17 00:00:00 2001 From: Shoghi Cervantes Date: Thu, 23 Apr 2015 11:34:01 +0200 Subject: [PATCH] Added more level tick options, force player ticks, base tick rate for levels --- src/pocketmine/Player.php | 9 ++++-- src/pocketmine/Server.php | 37 +++++++++++++++++-------- src/pocketmine/entity/Entity.php | 6 +++- src/pocketmine/resources/pocketmine.yml | 5 ++++ 4 files changed, 42 insertions(+), 15 deletions(-) diff --git a/src/pocketmine/Player.php b/src/pocketmine/Player.php index bd9b9f3b7..ae5bd7452 100644 --- a/src/pocketmine/Player.php +++ b/src/pocketmine/Player.php @@ -1306,18 +1306,23 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{ return false; } + $tickDiff = $currentTick - $this->lastUpdate; + + if($tickDiff <= 0){ + return true; + } + if($this->dead === true and $this->spawned){ ++$this->deadTicks; if($this->deadTicks >= 10){ $this->despawnFromAll(); } - return $this->deadTicks < 10; + return true; } $this->timings->startTiming(); if($this->spawned){ - $tickDiff = $currentTick - $this->lastUpdate; $this->processMovement($tickDiff); diff --git a/src/pocketmine/Server.php b/src/pocketmine/Server.php index 9e78f2f02..e88051780 100644 --- a/src/pocketmine/Server.php +++ b/src/pocketmine/Server.php @@ -200,6 +200,9 @@ class Server{ private $networkCompressionLevel = 7; private $autoTickRate = true; + private $autoTickRateLimit = 20; + private $alwaysTickPlayers = false; + private $baseTickRate = 1; /** @var BaseLang */ private $baseLang; @@ -1030,6 +1033,8 @@ class Server{ $this->getPluginManager()->callEvent(new LevelLoadEvent($level)); + $level->setTickRate($this->baseTickRate); + /*foreach($entities->getAll() as $entity){ if(!isset($entity["id"])){ break; @@ -1164,6 +1169,8 @@ class Server{ $this->levels[$level->getId()] = $level; $level->initLevel(); + + $level->setTickRate($this->baseTickRate); }catch(\Exception $e){ $this->logger->error($this->getLanguage()->translateString("pocketmine.level.generateError", [$name, $e->getMessage()])); if($this->logger instanceof MainLogger){ @@ -1554,7 +1561,10 @@ class Server{ $this->networkCompressionLevel = $this->getProperty("network.compression-level", 7); $this->networkCompressionAsync = $this->getProperty("network.async-compression", true); - $this->autoTickRate = $this->getProperty("level-settings.auto-tick-rate", true); + $this->autoTickRate = (bool) $this->getProperty("level-settings.auto-tick-rate", true); + $this->autoTickRateLimit = (int) $this->getProperty("level-settings.auto-tick-rate-limit", 20); + $this->alwaysTickPlayers = (int) $this->getProperty("level-settings.always-tick-players", false); + $this->baseTickRate = (int) $this->getProperty("level-settings.base-tick-rate", 1); $this->scheduler = new ServerScheduler(); @@ -2164,7 +2174,12 @@ class Server{ private function checkTickUpdates($currentTick){ //Do level ticks foreach($this->getLevels() as $level){ - if($level->getTickRate() > 1 and --$level->tickRateCounter > 0){ + if($level->getTickRate() > $this->baseTickRate and --$level->tickRateCounter > 0){ + if($this->alwaysTickPlayers){ + foreach($level->getPlayers() as $p){ + $p->onUpdate($currentTick); + } + } continue; } try{ @@ -2173,19 +2188,17 @@ class Server{ $tickMs = (microtime(true) - $levelTime) * 1000; if($this->autoTickRate){ - if($tickMs < 50 and $level->getTickRate() > 1){ - if($level->getTickRate() > 1){ - $level->setTickRate($r = $level->getTickRate() - 1); - if($r > 1){ - $level->tickRateCounter = $level->getTickRate(); - } - $this->getLogger()->debug("Raising level \"".$level->getName()."\" tick rate to ".$level->getTickRate()." ticks"); + if($tickMs < 50 and $level->getTickRate() > $this->baseTickRate){ + $level->setTickRate($r = $level->getTickRate() - 1); + if($r > $this->baseTickRate){ + $level->tickRateCounter = $level->getTickRate(); } + $this->getLogger()->debug("Raising level \"".$level->getName()."\" tick rate to ".$level->getTickRate()." ticks"); }elseif($tickMs >= 50){ - if($level->getTickRate() === 1){ - $level->setTickRate(max(2, min(10, floor($tickMs / 50)))); + if($level->getTickRate() === $this->baseTickRate){ + $level->setTickRate(max($this->baseTickRate + 1, min($this->autoTickRateLimit, floor($tickMs / 50)))); $this->getLogger()->debug("Level \"".$level->getName()."\" took ".round($tickMs, 2)."ms, setting tick rate to ".$level->getTickRate()." ticks"); - }elseif(($tickMs / $level->getTickRate()) >= 50 and $level->getTickRate() < 10){ //Limit? + }elseif(($tickMs / $level->getTickRate()) >= 50 and $level->getTickRate() < $this->autoTickRateLimit){ $level->setTickRate($level->getTickRate() + 1); $this->getLogger()->debug("Level \"".$level->getName()."\" took ".round($tickMs, 2)."ms, setting tick rate to ".$level->getTickRate()." ticks"); } diff --git a/src/pocketmine/entity/Entity.php b/src/pocketmine/entity/Entity.php index b6101b8a1..d01c1391e 100644 --- a/src/pocketmine/entity/Entity.php +++ b/src/pocketmine/entity/Entity.php @@ -832,7 +832,11 @@ abstract class Entity extends Location implements Metadatable{ return false; } - $tickDiff = max(1, $currentTick - $this->lastUpdate); + $tickDiff = $currentTick - $this->lastUpdate; + if($tickDiff <= 0){ + return false; + } + $this->lastUpdate = $currentTick; $this->timings->startTiming(); diff --git a/src/pocketmine/resources/pocketmine.yml b/src/pocketmine/resources/pocketmine.yml index d1006ac67..3b61bfd30 100644 --- a/src/pocketmine/resources/pocketmine.yml +++ b/src/pocketmine/resources/pocketmine.yml @@ -93,6 +93,11 @@ level-settings: convert-format: false #Automatically change levels tick rate to maintain 20 ticks per second auto-tick-rate: true + auto-tick-rate-limit: 20 + #Sets the base tick rate (1 = 20 ticks per second, 2 = 10 ticks per second, etc.) + base-tick-rate: 1 + #Tick all players each tick even when other settings disallow this. + always-tick-players: false chunk-sending: #Amount of chunks sent to players per tick