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

View File

@ -40,22 +40,63 @@ 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;
} }
for($side = 2; $side <= 5; ++$side){ if($fromSide === null){
if($this->findLog($pos->getSide($side), $visited, $distance + 1) === true){ for($side = 2; $side <= 5; ++$side){
return true; 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;
} }
} }
} }