diff --git a/src/Player.php b/src/Player.php index 9a05a2447..3f3a3b534 100644 --- a/src/Player.php +++ b/src/Player.php @@ -712,6 +712,9 @@ class Player{ $this->chunksLoaded = array(); $this->server->api->entity->spawnToAll($this->entity); $this->server->api->entity->spawnAll($this); + $this->dataPacket(MC_SET_TIME, array( + "time" => $this->level->getTime(), + )); $terrain = true; } $this->lastCorrect = $pos; @@ -1102,6 +1105,9 @@ class Player{ $this->sendSettings(); $this->server->schedule(50, array($this, "orderChunks"), array(), true); $this->blocked = false; + $this->dataPacket(MC_SET_TIME, array( + "time" => $this->level->getTime(), + )); $this->teleport(new Position($this->data->get("position")["x"], $this->data->get("position")["y"], $this->data->get("position")["z"], $this->level)); $this->server->handle("player.spawn", $this); break; diff --git a/src/network/CustomPacketHandler.php b/src/network/CustomPacketHandler.php index d1cc1bcb7..1d95223b7 100644 --- a/src/network/CustomPacketHandler.php +++ b/src/network/CustomPacketHandler.php @@ -192,9 +192,9 @@ class CustomPacketHandler{ break; case MC_SET_TIME: if($this->c === false){ - $this->data["time"] = Utils::readLong($this->get(4)); + $this->data["time"] = Utils::readInt($this->get(4)); }else{ - $this->raw .= Utils::writeLong($this->data["time"]); + $this->raw .= Utils::writeInt($this->data["time"]); } break; case MC_START_GAME: diff --git a/src/world/Level.php b/src/world/Level.php index 4e383a6ec..d12ad919d 100644 --- a/src/world/Level.php +++ b/src/world/Level.php @@ -39,7 +39,7 @@ class Level{ $this->nextSave = $this->startCheck = microtime(true); $this->nextSave += 90; $this->server->schedule(15, array($this, "checkThings"), array(), true); - $this->server->event("server.close", array($this, "save")); + $this->server->schedule(20 * 13, array($this, "checkTime"), array(), true); $this->name = $name; $this->usedChunks = array(); $this->changedBlocks = array(); @@ -65,23 +65,31 @@ class Level{ unset($this->usedChunks[$i][$player->CID]); } } + public function freeChunk($X, $Z, Player $player){ unset($this->usedChunks[$X.".".$Z][$player->CID]); } + public function checkTime(){ + if(!isset($this->level)){ + return false; + } + $now = microtime(true); + $time = $this->startTime + ($now - $this->startCheck) * 20; + if($this->server->api->dhandle("time.change", array("level" => $this, "time" => $time)) !== false){ + $this->time = $time; + $this->server->api->player->broadcastPacket($this->players, MC_SET_TIME, array( + "time" => (int) $this->time, + )); + } + } + public function checkThings(){ if(!isset($this->level)){ return false; } - $this->players = $this->server->api->player->getAll($this); $now = microtime(true); - $time = $this->startTime + ($now - $this->startCheck) * 20; - if($this->server->api->dhandle("time.change", array("level" => $this, "time" => $time)) !== false){ - $this->time = $time; - $this->server->api->player->broadcastPacket($this->players, MC_SET_TIME, array( - "time" => $this->time, - )); - } + $this->players = $this->server->api->player->getAll($this); if(count($this->changedCount) > 0){ arsort($this->changedCount);