Fixed Leaf Decay loops causing Lag Spikes, fixed #391 [gh#391]

This commit is contained in:
Shoghi Cervantes 2013-06-16 17:18:15 +02:00
parent 19d0c70669
commit 155c918bb8
2 changed files with 49 additions and 8 deletions

View File

@ -785,16 +785,16 @@ class BlockAPI{
$offset = 0;
while(true){
$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){
$update = $update->fetchArray(SQLITE3_NUM);
if($update[0] == 0){
if($update[0] < 3){
break;
}
}else{
break;
}
$offset += 10;
$offset += 5;
}
$this->scheduleBlockUpdate($pos, $t / 0.05, BLOCK_UPDATE_RANDOM);
}

View File

@ -40,22 +40,63 @@ class LeavesBlock extends TransparentBlock{
$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;
if(isset($visited[$index])){
return false;
}
if($pos->getID() === WOOD){
return true;
}elseif($pos->getID() === LEAVES and $distance < 5){
}elseif($pos->getID() === LEAVES and $distance < 4){
$visited[$index] = true;
$down = $pos->getSide(0)->getID();
if($down === WOOD or $down == LEAVES){
return true;
}
for($side = 2; $side <= 5; ++$side){
if($this->findLog($pos->getSide($side), $visited, $distance + 1) === true){
return true;
if($fromSide === null){
for($side = 2; $side <= 5; ++$side){
if($this->findLog($pos->getSide($side), $visited, $distance + 1, $side) === 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;
}
}
}