From bf5630dc0d336631e4b462bbe88fbba665160b1b Mon Sep 17 00:00:00 2001 From: Shoghi Cervantes Date: Tue, 26 Aug 2014 16:45:51 +0200 Subject: [PATCH] Fixed #1926 Teleport to non-generated chunks --- src/pocketmine/Player.php | 12 ++- src/pocketmine/level/Level.php | 2 + src/tests/Benchmark.php | 169 --------------------------------- src/tests/ServerSuiteTest.php | 68 ------------- 4 files changed, 13 insertions(+), 238 deletions(-) delete mode 100644 src/tests/Benchmark.php delete mode 100644 src/tests/ServerSuiteTest.php diff --git a/src/pocketmine/Player.php b/src/pocketmine/Player.php index e33f967dc..1fd5b3ca7 100644 --- a/src/pocketmine/Player.php +++ b/src/pocketmine/Player.php @@ -59,6 +59,7 @@ use pocketmine\inventory\InventoryHolder; use pocketmine\inventory\SimpleTransactionGroup; use pocketmine\inventory\StonecutterShapelessRecipe; use pocketmine\item\Item; +use pocketmine\level\format\FullChunk; use pocketmine\level\format\LevelProvider; use pocketmine\level\Level; use pocketmine\level\Position; @@ -1344,7 +1345,16 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{ $this->updateFallState($dy, $this->onGround); - if(!$this->setPositionAndRotation($newPos, $packet->yaw, $packet->pitch)){ + $revert = false; + + if($this->chunk === null or !$this->chunk->isGenerated()){ + $chunk = $this->getLevel()->getChunkAt($newPos->x >> 4, $newPos->z >> 4); + if(!($chunk instanceof FullChunk) or !$chunk->isGenerated()){ + $revert = true; + } + } + + if($revert or !$this->setPositionAndRotation($newPos, $packet->yaw, $packet->pitch)){ $pk = new MovePlayerPacket(); $pk->eid = 0; $pk->x = $this->x; diff --git a/src/pocketmine/level/Level.php b/src/pocketmine/level/Level.php index fdddc8425..14e48887e 100644 --- a/src/pocketmine/level/Level.php +++ b/src/pocketmine/level/Level.php @@ -211,6 +211,8 @@ class Level implements ChunkManager, Metadatable{ public static function getXZ($hash, &$x, &$z){ list($x, $z) = explode(":", $hash); + $x = (int) $x; + $z = (int) $z; } /** diff --git a/src/tests/Benchmark.php b/src/tests/Benchmark.php deleted file mode 100644 index 99665f4ba..000000000 --- a/src/tests/Benchmark.php +++ /dev/null @@ -1,169 +0,0 @@ -add("pocketmine", array( - \pocketmine\PATH . "src" -)); -$autoloader->register(true); -@define("ENDIANNESS", (pack("d", 1) === "\77\360\0\0\0\0\0\0" ? Binary::BIG_ENDIAN : Binary::LITTLE_ENDIAN)); -@define("INT32_MASK", is_int(0xffffffff) ? 0xffffffff : -1); - -echo "=== PocketMine Benchmark suite ===\n"; -echo "[*] uname -a: ".php_uname("a")."\n"; -if(extension_loaded("pocketmine")){ - echo "[*] PocketMine native PHP extension v".phpversion("pocketmine")." loaded.\n"; -} - -$iterations = 200000; -$score = 0; -$tests = 0; - -echo "[*] Using $iterations iterations\n"; - - -$expect = 0.2; -echo "[*] Measuring Random integer generation [$expect]... "; -$random = new Random(1337); -$start = microtime(true); -for($i = $iterations; $i > 0; --$i){ - $random->nextSignedInt(); -} -$taken = microtime(true) - $start; -$score += 1000 * ($taken / $expect); -++$tests; -echo round($taken, 6)."s\n"; - - -$expect = 0.95; -echo "[*] Measuring Simplex noise (8 octaves) [$expect]... "; -$noise = new Simplex(new Random(0), 8, 0.5, 8); -$start = microtime(true); -for($i = $iterations; $i > 0; --$i){ - $noise->getNoise2D($i, $i ^ 0xdead); -} -$taken = microtime(true) - $start; -$score += 1000 * ($taken / $expect); -++$tests; -echo round($taken, 6)."s\n"; - - -$expect = 2.9; -echo "[*] Measuring Perlin noise (8 octaves) [$expect]... "; -$noise = new Perlin(new Random(0), 8, 0.5, 8); -$start = microtime(true); -for($i = $iterations; $i > 0; --$i){ - $noise->getNoise2D($i, $i ^ 0xdead); -} -$taken = microtime(true) - $start; -$score += 1000 * ($taken / $expect); -++$tests; -echo round($taken, 6)."s\n"; - - -$expect = 0.6; -echo "[*] Measuring Vector3 creation & distance [$expect]... "; -$vector = new Vector3(1337, 31337, 0xff); -$start = microtime(true); -for($i = $iterations; $i > 0; --$i){ - $vector->distance(new Vector3(600, 300, 600)); -} -$taken = microtime(true) - $start; -$score += 1000 * ($taken / $expect); -++$tests; -echo round($taken, 6)."s\n"; - - -$expect = 0.4; -echo "[*] Measuring AA Bounding Box [$expect]... "; -$bb = new AxisAlignedBB(12, 219, 21, 15, 59, 51); -$start = microtime(true); -for($i = $iterations; $i > 0; --$i){ - $bb = $bb->getOffsetBoundingBox(1, 2, -1); -} -$taken = microtime(true) - $start; -$score += 1000 * ($taken / $expect); -++$tests; -echo round($taken, 6)."s\n"; - - -$expect = 2.5; -echo "[*] Measuring file operations [$expect]... "; -$start = microtime(true); -for($i = $iterations; $i > 0; --$i){ - @file_exists("./$i.example"); -} -$taken = microtime(true) - $start; -$score += 1000 * ($taken / $expect); -++$tests; -echo round($taken, 6)."s\n"; - - -$expect = 3.75; -echo "[*] Measuring Simple Packet decoding [$expect]... "; -$packet = hex2bin("8401000000000815"); -$start = microtime(true); -for($i = $iterations; $i > 0; --$i){ - $pk = new Packet(ord($packet{0})); - $pk->buffer =& $packet; - $pk->decode(); -} - -$taken = microtime(true) - $start; -$score += 1000 * ($taken / $expect); -++$tests; -echo round($taken, 6)."s\n"; - - -$expect = 0.1; -echo "[*] Measuring microtime() operations [$expect]... "; -$start = microtime(true); -for($i = $iterations; $i > 0; --$i){ - microtime(true); -} - -$taken = microtime(true) - $start; -$score += 1000 * ($taken / $expect); -++$tests; -echo round($taken, 6)."s\n"; - -echo "\n\n[*] Total score (~1000 good; less is better): ".round($score / $tests, 3)."\n"; - - diff --git a/src/tests/ServerSuiteTest.php b/src/tests/ServerSuiteTest.php deleted file mode 100644 index 5acb62d54..000000000 --- a/src/tests/ServerSuiteTest.php +++ /dev/null @@ -1,68 +0,0 @@ -load(); - testCase("event attached", is_integer($server->event("server.start", array($this, "hook"))), true); - $server->init(); - } - - public function hook(){ - testCase("event fired", true, true); - $server = \pocketmine\Server::getInstance(); - testCase("defaultgamemode", $server->getGamemode(), "survival"); - - - //Everything done! - $server->close(); - } -} \ No newline at end of file