Added more level tick options, force player ticks, base tick rate for levels

This commit is contained in:
Shoghi Cervantes 2015-04-23 11:34:01 +02:00
parent f73bd02198
commit a0739a7b03
4 changed files with 42 additions and 15 deletions

View File

@ -1306,18 +1306,23 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{
return false; return false;
} }
$tickDiff = $currentTick - $this->lastUpdate;
if($tickDiff <= 0){
return true;
}
if($this->dead === true and $this->spawned){ if($this->dead === true and $this->spawned){
++$this->deadTicks; ++$this->deadTicks;
if($this->deadTicks >= 10){ if($this->deadTicks >= 10){
$this->despawnFromAll(); $this->despawnFromAll();
} }
return $this->deadTicks < 10; return true;
} }
$this->timings->startTiming(); $this->timings->startTiming();
if($this->spawned){ if($this->spawned){
$tickDiff = $currentTick - $this->lastUpdate;
$this->processMovement($tickDiff); $this->processMovement($tickDiff);

View File

@ -200,6 +200,9 @@ class Server{
private $networkCompressionLevel = 7; private $networkCompressionLevel = 7;
private $autoTickRate = true; private $autoTickRate = true;
private $autoTickRateLimit = 20;
private $alwaysTickPlayers = false;
private $baseTickRate = 1;
/** @var BaseLang */ /** @var BaseLang */
private $baseLang; private $baseLang;
@ -1030,6 +1033,8 @@ class Server{
$this->getPluginManager()->callEvent(new LevelLoadEvent($level)); $this->getPluginManager()->callEvent(new LevelLoadEvent($level));
$level->setTickRate($this->baseTickRate);
/*foreach($entities->getAll() as $entity){ /*foreach($entities->getAll() as $entity){
if(!isset($entity["id"])){ if(!isset($entity["id"])){
break; break;
@ -1164,6 +1169,8 @@ class Server{
$this->levels[$level->getId()] = $level; $this->levels[$level->getId()] = $level;
$level->initLevel(); $level->initLevel();
$level->setTickRate($this->baseTickRate);
}catch(\Exception $e){ }catch(\Exception $e){
$this->logger->error($this->getLanguage()->translateString("pocketmine.level.generateError", [$name, $e->getMessage()])); $this->logger->error($this->getLanguage()->translateString("pocketmine.level.generateError", [$name, $e->getMessage()]));
if($this->logger instanceof MainLogger){ if($this->logger instanceof MainLogger){
@ -1554,7 +1561,10 @@ class Server{
$this->networkCompressionLevel = $this->getProperty("network.compression-level", 7); $this->networkCompressionLevel = $this->getProperty("network.compression-level", 7);
$this->networkCompressionAsync = $this->getProperty("network.async-compression", true); $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(); $this->scheduler = new ServerScheduler();
@ -2164,7 +2174,12 @@ class Server{
private function checkTickUpdates($currentTick){ private function checkTickUpdates($currentTick){
//Do level ticks //Do level ticks
foreach($this->getLevels() as $level){ 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; continue;
} }
try{ try{
@ -2173,19 +2188,17 @@ class Server{
$tickMs = (microtime(true) - $levelTime) * 1000; $tickMs = (microtime(true) - $levelTime) * 1000;
if($this->autoTickRate){ if($this->autoTickRate){
if($tickMs < 50 and $level->getTickRate() > 1){ if($tickMs < 50 and $level->getTickRate() > $this->baseTickRate){
if($level->getTickRate() > 1){
$level->setTickRate($r = $level->getTickRate() - 1); $level->setTickRate($r = $level->getTickRate() - 1);
if($r > 1){ if($r > $this->baseTickRate){
$level->tickRateCounter = $level->getTickRate(); $level->tickRateCounter = $level->getTickRate();
} }
$this->getLogger()->debug("Raising level \"".$level->getName()."\" tick rate to ".$level->getTickRate()." ticks"); $this->getLogger()->debug("Raising level \"".$level->getName()."\" tick rate to ".$level->getTickRate()." ticks");
}
}elseif($tickMs >= 50){ }elseif($tickMs >= 50){
if($level->getTickRate() === 1){ if($level->getTickRate() === $this->baseTickRate){
$level->setTickRate(max(2, min(10, floor($tickMs / 50)))); $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"); $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); $level->setTickRate($level->getTickRate() + 1);
$this->getLogger()->debug("Level \"".$level->getName()."\" took ".round($tickMs, 2)."ms, setting tick rate to ".$level->getTickRate()." ticks"); $this->getLogger()->debug("Level \"".$level->getName()."\" took ".round($tickMs, 2)."ms, setting tick rate to ".$level->getTickRate()." ticks");
} }

View File

@ -832,7 +832,11 @@ abstract class Entity extends Location implements Metadatable{
return false; return false;
} }
$tickDiff = max(1, $currentTick - $this->lastUpdate); $tickDiff = $currentTick - $this->lastUpdate;
if($tickDiff <= 0){
return false;
}
$this->lastUpdate = $currentTick; $this->lastUpdate = $currentTick;
$this->timings->startTiming(); $this->timings->startTiming();

View File

@ -93,6 +93,11 @@ level-settings:
convert-format: false convert-format: false
#Automatically change levels tick rate to maintain 20 ticks per second #Automatically change levels tick rate to maintain 20 ticks per second
auto-tick-rate: true 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: chunk-sending:
#Amount of chunks sent to players per tick #Amount of chunks sent to players per tick