mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-06-07 20:28:31 +00:00
Fixed Leaf Decay loops causing Lag Spikes, fixed #391 [gh#391]
This commit is contained in:
parent
19d0c70669
commit
155c918bb8
@ -785,16 +785,16 @@ class BlockAPI{
|
|||||||
$offset = 0;
|
$offset = 0;
|
||||||
while(true){
|
while(true){
|
||||||
$t = $offset + Utils::getRandomUpdateTicks() * 0.05;
|
$t = $offset + Utils::getRandomUpdateTicks() * 0.05;
|
||||||
$update = $this->server->query("SELECT COUNT(*) FROM blockUpdates WHERE level = '".$pos->level->getName()."' AND type = ".BLOCK_UPDATE_RANDOM." AND delay >= ".($time + $t - 1.5)." AND delay <= ".($time + $t + 1.5).";");
|
$update = $this->server->query("SELECT COUNT(*) FROM blockUpdates WHERE level = '".$pos->level->getName()."' AND type = ".BLOCK_UPDATE_RANDOM." AND delay >= ".($time + $t - 1)." AND delay <= ".($time + $t + 1).";");
|
||||||
if($update instanceof SQLite3Result){
|
if($update instanceof SQLite3Result){
|
||||||
$update = $update->fetchArray(SQLITE3_NUM);
|
$update = $update->fetchArray(SQLITE3_NUM);
|
||||||
if($update[0] == 0){
|
if($update[0] < 3){
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
$offset += 10;
|
$offset += 5;
|
||||||
}
|
}
|
||||||
$this->scheduleBlockUpdate($pos, $t / 0.05, BLOCK_UPDATE_RANDOM);
|
$this->scheduleBlockUpdate($pos, $t / 0.05, BLOCK_UPDATE_RANDOM);
|
||||||
}
|
}
|
||||||
|
@ -40,24 +40,65 @@ class LeavesBlock extends TransparentBlock{
|
|||||||
$this->name = $names[$this->meta & 0x03];
|
$this->name = $names[$this->meta & 0x03];
|
||||||
}
|
}
|
||||||
|
|
||||||
private function findLog(Block $pos, array $visited, $distance){
|
private function findLog(Block $pos, array $visited, $distance, $fromSide = null){
|
||||||
$index = $pos->x.".".$pos->y.".".$pos->z;
|
$index = $pos->x.".".$pos->y.".".$pos->z;
|
||||||
if(isset($visited[$index])){
|
if(isset($visited[$index])){
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if($pos->getID() === WOOD){
|
if($pos->getID() === WOOD){
|
||||||
return true;
|
return true;
|
||||||
}elseif($pos->getID() === LEAVES and $distance < 5){
|
}elseif($pos->getID() === LEAVES and $distance < 4){
|
||||||
$visited[$index] = true;
|
$visited[$index] = true;
|
||||||
$down = $pos->getSide(0)->getID();
|
$down = $pos->getSide(0)->getID();
|
||||||
if($down === WOOD or $down == LEAVES){
|
if($down === WOOD or $down == LEAVES){
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if($fromSide === null){
|
||||||
for($side = 2; $side <= 5; ++$side){
|
for($side = 2; $side <= 5; ++$side){
|
||||||
if($this->findLog($pos->getSide($side), $visited, $distance + 1) === true){
|
if($this->findLog($pos->getSide($side), $visited, $distance + 1, $side) === true){
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}else{ //No more loops
|
||||||
|
switch($fromSide){
|
||||||
|
case 2:
|
||||||
|
if($this->findLog($pos->getSide(2), $visited, $distance + 1, $fromSide) === true){
|
||||||
|
return true;
|
||||||
|
}elseif($this->findLog($pos->getSide(4), $visited, $distance + 1, $fromSide) === true){
|
||||||
|
return true;
|
||||||
|
}elseif($this->findLog($pos->getSide(5), $visited, $distance + 1, $fromSide) === true){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
if($this->findLog($pos->getSide(3), $visited, $distance + 1, $fromSide) === true){
|
||||||
|
return true;
|
||||||
|
}elseif($this->findLog($pos->getSide(4), $visited, $distance + 1, $fromSide) === true){
|
||||||
|
return true;
|
||||||
|
}elseif($this->findLog($pos->getSide(5), $visited, $distance + 1, $fromSide) === true){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
if($this->findLog($pos->getSide(2), $visited, $distance + 1, $fromSide) === true){
|
||||||
|
return true;
|
||||||
|
}elseif($this->findLog($pos->getSide(3), $visited, $distance + 1, $fromSide) === true){
|
||||||
|
return true;
|
||||||
|
}elseif($this->findLog($pos->getSide(4), $visited, $distance + 1, $fromSide) === true){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
if($this->findLog($pos->getSide(2), $visited, $distance + 1, $fromSide) === true){
|
||||||
|
return true;
|
||||||
|
}elseif($this->findLog($pos->getSide(3), $visited, $distance + 1, $fromSide) === true){
|
||||||
|
return true;
|
||||||
|
}elseif($this->findLog($pos->getSide(5), $visited, $distance + 1, $fromSide) === true){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user