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;
}
$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);

View File

@ -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){
if($tickMs < 50 and $level->getTickRate() > $this->baseTickRate){
$level->setTickRate($r = $level->getTickRate() - 1);
if($r > 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");
}

View File

@ -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();

View File

@ -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