Merge branch 'release/3.2' into release/3.3

This commit is contained in:
Dylan K. Taylor 2018-09-08 14:25:20 +01:00
commit 90d01f5ed2
10 changed files with 50 additions and 61 deletions

View File

@ -2352,37 +2352,29 @@ class Server{
if($level->getTickRate() > $this->baseTickRate and --$level->tickRateCounter > 0){ if($level->getTickRate() > $this->baseTickRate and --$level->tickRateCounter > 0){
continue; continue;
} }
try{
$levelTime = microtime(true);
$level->doTick($currentTick);
$tickMs = (microtime(true) - $levelTime) * 1000;
$level->tickRateTime = $tickMs;
if($this->autoTickRate){ $levelTime = microtime(true);
if($tickMs < 50 and $level->getTickRate() > $this->baseTickRate){ $level->doTick($currentTick);
$level->setTickRate($r = $level->getTickRate() - 1); $tickMs = (microtime(true) - $levelTime) * 1000;
if($r > $this->baseTickRate){ $level->tickRateTime = $tickMs;
$level->tickRateCounter = $level->getTickRate();
} if($this->autoTickRate){
$this->getLogger()->debug("Raising level \"{$level->getName()}\" tick rate to {$level->getTickRate()} ticks"); if($tickMs < 50 and $level->getTickRate() > $this->baseTickRate){
}elseif($tickMs >= 50){ $level->setTickRate($r = $level->getTickRate() - 1);
if($level->getTickRate() === $this->baseTickRate){ if($r > $this->baseTickRate){
$level->setTickRate(max($this->baseTickRate + 1, min($this->autoTickRateLimit, (int) floor($tickMs / 50))));
$this->getLogger()->debug(sprintf("Level \"%s\" took %gms, setting tick rate to %d ticks", $level->getName(), (int) round($tickMs, 2), $level->getTickRate()));
}elseif(($tickMs / $level->getTickRate()) >= 50 and $level->getTickRate() < $this->autoTickRateLimit){
$level->setTickRate($level->getTickRate() + 1);
$this->getLogger()->debug(sprintf("Level \"%s\" took %gms, setting tick rate to %d ticks", $level->getName(), (int) round($tickMs, 2), $level->getTickRate()));
}
$level->tickRateCounter = $level->getTickRate(); $level->tickRateCounter = $level->getTickRate();
} }
$this->getLogger()->debug("Raising level \"{$level->getName()}\" tick rate to {$level->getTickRate()} ticks");
}elseif($tickMs >= 50){
if($level->getTickRate() === $this->baseTickRate){
$level->setTickRate(max($this->baseTickRate + 1, min($this->autoTickRateLimit, (int) floor($tickMs / 50))));
$this->getLogger()->debug(sprintf("Level \"%s\" took %gms, setting tick rate to %d ticks", $level->getName(), (int) round($tickMs, 2), $level->getTickRate()));
}elseif(($tickMs / $level->getTickRate()) >= 50 and $level->getTickRate() < $this->autoTickRateLimit){
$level->setTickRate($level->getTickRate() + 1);
$this->getLogger()->debug(sprintf("Level \"%s\" took %gms, setting tick rate to %d ticks", $level->getName(), (int) round($tickMs, 2), $level->getTickRate()));
}
$level->tickRateCounter = $level->getTickRate();
} }
}catch(\Throwable $e){
if(!$level->isClosed()){
$this->logger->critical($this->getLanguage()->translateString("pocketmine.level.tickError", [$level->getName(), $e->getMessage()]));
}else{
$this->logger->critical($this->getLanguage()->translateString("pocketmine.level.tickUnloadError", [$level->getName()]));
}
$this->logger->logException($e);
} }
} }
} }

View File

@ -408,8 +408,6 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
public $boundingBox; public $boundingBox;
/** @var bool */ /** @var bool */
public $onGround; public $onGround;
/** @var int */
protected $age = 0;
/** @var float */ /** @var float */
public $eyeHeight = null; public $eyeHeight = null;
@ -1041,7 +1039,6 @@ abstract class Entity extends Location implements Metadatable, EntityIds{
} }
} }
$this->age += $tickDiff;
$this->ticksLived += $tickDiff; $this->ticksLived += $tickDiff;
return $hasUpdate; return $hasUpdate;

View File

@ -88,6 +88,9 @@ class ExperienceOrb extends Entity{
public $gravity = 0.04; public $gravity = 0.04;
public $drag = 0.02; public $drag = 0.02;
/** @var int */
protected $age = 0;
/** /**
* @var int * @var int
* Ticker used for determining interval in which to look for new target players. * Ticker used for determining interval in which to look for new target players.
@ -159,6 +162,7 @@ class ExperienceOrb extends Entity{
public function entityBaseTick(int $tickDiff = 1) : bool{ public function entityBaseTick(int $tickDiff = 1) : bool{
$hasUpdate = parent::entityBaseTick($tickDiff); $hasUpdate = parent::entityBaseTick($tickDiff);
$this->age += $tickDiff;
if($this->age > 6000){ if($this->age > 6000){
$this->flagForDespawn(); $this->flagForDespawn();
return true; return true;

View File

@ -53,6 +53,9 @@ class ItemEntity extends Entity{
public $canCollide = false; public $canCollide = false;
/** @var int */
protected $age = 0;
protected function initEntity() : void{ protected function initEntity() : void{
parent::initEntity(); parent::initEntity();
@ -82,14 +85,13 @@ class ItemEntity extends Entity{
$hasUpdate = parent::entityBaseTick($tickDiff); $hasUpdate = parent::entityBaseTick($tickDiff);
if(!$this->isFlaggedForDespawn()){ if(!$this->isFlaggedForDespawn() and $this->pickupDelay > -1 and $this->pickupDelay < 32767){ //Infinite delay
if($this->pickupDelay > 0 and $this->pickupDelay < 32767){ //Infinite delay $this->pickupDelay -= $tickDiff;
$this->pickupDelay -= $tickDiff; if($this->pickupDelay < 0){
if($this->pickupDelay < 0){ $this->pickupDelay = 0;
$this->pickupDelay = 0;
}
} }
$this->age += $tickDiff;
if($this->age > 6000){ if($this->age > 6000){
$this->server->getPluginManager()->callEvent($ev = new ItemDespawnEvent($this)); $this->server->getPluginManager()->callEvent($ev = new ItemDespawnEvent($this));
if($ev->isCancelled()){ if($ev->isCancelled()){
@ -99,7 +101,6 @@ class ItemEntity extends Entity{
$hasUpdate = true; $hasUpdate = true;
} }
} }
} }
return $hasUpdate; return $hasUpdate;

View File

@ -61,6 +61,9 @@ class Arrow extends Projectile{
/** @var float */ /** @var float */
protected $punchKnockback = 0.0; protected $punchKnockback = 0.0;
/** @var int */
protected $collideTicks = 0;
public function __construct(Level $level, CompoundTag $nbt, ?Entity $shootingEntity = null, bool $critical = false){ public function __construct(Level $level, CompoundTag $nbt, ?Entity $shootingEntity = null, bool $critical = false){
parent::__construct($level, $nbt, $shootingEntity); parent::__construct($level, $nbt, $shootingEntity);
$this->setCritical($critical); $this->setCritical($critical);
@ -70,12 +73,14 @@ class Arrow extends Projectile{
parent::initEntity(); parent::initEntity();
$this->pickupMode = $this->namedtag->getByte(self::TAG_PICKUP, self::PICKUP_ANY, true); $this->pickupMode = $this->namedtag->getByte(self::TAG_PICKUP, self::PICKUP_ANY, true);
$this->collideTicks = $this->namedtag->getShort("life", $this->collideTicks);
} }
public function saveNBT() : void{ public function saveNBT() : void{
parent::saveNBT(); parent::saveNBT();
$this->namedtag->setByte(self::TAG_PICKUP, $this->pickupMode, true); $this->namedtag->setByte(self::TAG_PICKUP, $this->pickupMode, true);
$this->namedtag->setShort("life", $this->collideTicks);
} }
public function isCritical() : bool{ public function isCritical() : bool{
@ -116,9 +121,14 @@ class Arrow extends Projectile{
$hasUpdate = parent::entityBaseTick($tickDiff); $hasUpdate = parent::entityBaseTick($tickDiff);
if($this->age > 1200){ if($this->isCollided){
$this->flagForDespawn(); $this->collideTicks += $tickDiff;
$hasUpdate = true; if($this->collideTicks > 1200){
$this->flagForDespawn();
$hasUpdate = true;
}
}else{
$this->collideTicks = 0;
} }
return $hasUpdate; return $hasUpdate;

View File

@ -66,7 +66,5 @@ class EnderPearl extends Throwable{
$owner->attack(new EntityDamageEvent($owner, EntityDamageEvent::CAUSE_FALL, 5)); $owner->attack(new EntityDamageEvent($owner, EntityDamageEvent::CAUSE_FALL, 5));
} }
$this->flagForDespawn();
} }
} }

View File

@ -42,7 +42,5 @@ class ExperienceBottle extends Throwable{
$this->level->broadcastLevelSoundEvent($this, LevelSoundEventPacket::SOUND_GLASS); $this->level->broadcastLevelSoundEvent($this, LevelSoundEventPacket::SOUND_GLASS);
$this->level->dropExperience($this, mt_rand(3, 11)); $this->level->dropExperience($this, mt_rand(3, 11));
$this->flagForDespawn();
} }
} }

View File

@ -74,7 +74,6 @@ abstract class Projectile extends Entity{
$this->setMaxHealth(1); $this->setMaxHealth(1);
$this->setHealth(1); $this->setHealth(1);
$this->age = $this->namedtag->getShort("Age", $this->age);
$this->damage = $this->namedtag->getDouble("damage", $this->damage); $this->damage = $this->namedtag->getDouble("damage", $this->damage);
do{ do{
@ -144,7 +143,6 @@ abstract class Projectile extends Entity{
public function saveNBT() : void{ public function saveNBT() : void{
parent::saveNBT(); parent::saveNBT();
$this->namedtag->setShort("Age", $this->age);
$this->namedtag->setDouble("damage", $this->damage); $this->namedtag->setDouble("damage", $this->damage);
if($this->blockHit !== null){ if($this->blockHit !== null){

View File

@ -124,8 +124,6 @@ class SplashPotion extends Throwable{
} }
} }
} }
$this->flagForDespawn();
} }
/** /**

View File

@ -23,6 +23,9 @@ declare(strict_types=1);
namespace pocketmine\entity\projectile; namespace pocketmine\entity\projectile;
use pocketmine\block\Block;
use pocketmine\math\RayTraceResult;
abstract class Throwable extends Projectile{ abstract class Throwable extends Projectile{
public $width = 0.25; public $width = 0.25;
@ -31,18 +34,8 @@ abstract class Throwable extends Projectile{
protected $gravity = 0.03; protected $gravity = 0.03;
protected $drag = 0.01; protected $drag = 0.01;
public function entityBaseTick(int $tickDiff = 1) : bool{ protected function onHitBlock(Block $blockHit, RayTraceResult $hitResult) : void{
if($this->closed){ parent::onHitBlock($blockHit, $hitResult);
return false; $this->flagForDespawn();
}
$hasUpdate = parent::entityBaseTick($tickDiff);
if($this->age > 1200 or $this->isCollided){
$this->flagForDespawn();
$hasUpdate = true;
}
return $hasUpdate;
} }
} }