mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-05-13 01:09:44 +00:00
Added more level tick options, force player ticks, base tick rate for levels
This commit is contained in:
parent
f73bd02198
commit
a0739a7b03
@ -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);
|
||||||
|
|
||||||
|
@ -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 > $this->baseTickRate){
|
||||||
if($r > 1){
|
$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");
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user