diff --git a/src/Player.php b/src/Player.php index 38ee6d611..b1a5b08a8 100644 --- a/src/Player.php +++ b/src/Player.php @@ -2322,14 +2322,16 @@ class Player{ } public function sendBuffer(){ - if($this->bufferLen > 0 and $this->buffer instanceof RakNetPacket){ - $this->buffer->seqNumber = $this->counter[0]++; - $this->send($this->buffer); + if($this->connected === true){ + if($this->bufferLen > 0 and $this->buffer instanceof RakNetPacket){ + $this->buffer->seqNumber = $this->counter[0]++; + $this->send($this->buffer); + } + $this->bufferLen = 0; + $this->buffer = new RakNetPacket(RakNetInfo::DATA_PACKET_0); + $this->buffer->data = array(); + $this->nextBuffer = microtime(true) + 0.1; } - $this->bufferLen = 0; - $this->buffer = new RakNetPacket(RakNetInfo::DATA_PACKET_0); - $this->buffer->data = array(); - $this->nextBuffer = microtime(true) + 0.1; } private function directBigRawPacket(RakNetDataPacket $packet){ @@ -2418,7 +2420,7 @@ class Player{ $packet->messageIndex = $this->counter[3]++; $packet->reliability = 2; - $this->buffer->data[] = $packet; + @$this->buffer->data[] = $packet; $this->bufferLen += 6 + $len; return array(); } diff --git a/src/world/Level.php b/src/world/Level.php index 5def8ab8b..dc8a8bff3 100644 --- a/src/world/Level.php +++ b/src/world/Level.php @@ -138,8 +138,11 @@ class Level{ if(count($c) === 0){ unset($this->usedChunks[$i]); $X = explode(".", $i); - $Z = array_pop($X); - $this->level->unloadChunk((int) array_pop($X), (int) $Z, $this->server->saveEnabled); + $Z = (int) array_pop($X); + $X = (int) array_pop($X); + if(!$this->isSpawnChunk($X, $Z)){ + $this->level->unloadChunk($X, $Z, $this->server->saveEnabled); + } } } $this->save(false, false); @@ -408,13 +411,23 @@ class Level{ return $this->level->loadChunk($X, $Z); } - public function unloadChunk($X, $Z){ + public function unloadChunk($X, $Z, $force = false){ if(!isset($this->level)){ return false; } + + if($force !== true and $this->isSpawnChunk($X, $Z)){ + return false; + } Cache::remove("world:{$this->name}:$X:$Z"); return $this->level->unloadChunk($X, $Z, $this->server->saveEnabled); } + + public function isSpawnChunk($X, $Z){ + $spawnX = $this->level->getData("spawnX") >> 4; + $spawnZ = $this->level->getData("spawnZ") >> 4; + return abs($X - $spawnX) <= 1 and abs($Z - $spawnZ) <= 1; + } public function getOrderedChunk($X, $Z, $Yndex){ if(!isset($this->level)){