From 63f1a50be48af6542ff4a329902c22bb6a380ba5 Mon Sep 17 00:00:00 2001 From: Shoghi Cervantes Date: Wed, 14 Jan 2015 23:47:01 +0100 Subject: [PATCH] Added new predictive flight protection --- src/pocketmine/Player.php | 19 ++++++++++++++++--- src/pocketmine/block/Block.php | 9 ++++----- src/pocketmine/entity/Entity.php | 2 +- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/pocketmine/Player.php b/src/pocketmine/Player.php index bccb33510b..86c7541c08 100644 --- a/src/pocketmine/Player.php +++ b/src/pocketmine/Player.php @@ -147,6 +147,9 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{ protected $moveToSend = []; protected $motionToSend = []; + /** @var Vector3 */ + public $speed = null; + public $blocked = false; public $achievements = []; public $lastCorrect; @@ -1164,6 +1167,10 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{ } } } + + $this->speed = $to->subtract($from); + }elseif($distanceSquared == 0){ + $this->speed = new Vector3(0, 0, 0); } if($revert){ @@ -1186,13 +1193,14 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{ $pk->teleport = true; $this->directDataPacket($pk); $this->forceMovement = new Vector3($from->x, $from->y, $from->z); - $this->newPosition = null; }else{ $this->forceMovement = null; if($distanceSquared != 0 and $this->nextChunkOrderRun > 20){ $this->nextChunkOrderRun = 20; } } + + $this->newPosition = null; } public function updateMovement(){ @@ -1224,8 +1232,13 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{ if($this->onGround){ $this->inAirTicks = 0; }else{ - if($this->inAirTicks > 100 and $this->isSurvival() and !$this->isSleeping() and $this->spawned and !$this->server->getAllowFlight()){ - $this->kick("Flying is not enabled on this server"); + if($this->inAirTicks > 20 and $this->isSurvival() and !$this->isSleeping() and $this->spawned and !$this->server->getAllowFlight()){ + $expectedVelocity = (-$this->gravity) / $this->drag - ((-$this->gravity) / $this->drag) * exp(-$this->drag * ($this->inAirTicks - 2)); + $diff = ($this->speed->y - $expectedVelocity) ** 2; + + if($diff > 0.6 and $expectedVelocity < $this->speed->y){ + $this->kick("Flying is not enabled on this server"); + } return false; }else{ ++$this->inAirTicks; diff --git a/src/pocketmine/block/Block.php b/src/pocketmine/block/Block.php index 943416c391..948acfbb22 100644 --- a/src/pocketmine/block/Block.php +++ b/src/pocketmine/block/Block.php @@ -1039,7 +1039,7 @@ class Block extends Position implements Metadatable{ */ public function collidesWithBB(AxisAlignedBB $bb, &$list = []){ $bb2 = $this->getBoundingBox(); - if($bb2 !== null and $bb2->intersectsWith($bb)){ + if($bb2 !== null and $bb->intersectsWith($bb2)){ $list[] = $bb2; } } @@ -1055,11 +1055,10 @@ class Block extends Position implements Metadatable{ * @return AxisAlignedBB */ public function getBoundingBox(){ - if($this->boundingBox !== null){ - return $this->boundingBox; - }else{ - return ($this->boundingBox = $this->recalculateBoundingBox()); + if($this->boundingBox === null){ + $this->boundingBox = $this->recalculateBoundingBox(); } + return $this->boundingBox; } /** diff --git a/src/pocketmine/entity/Entity.php b/src/pocketmine/entity/Entity.php index 258f35f9e8..3b291dcf81 100644 --- a/src/pocketmine/entity/Entity.php +++ b/src/pocketmine/entity/Entity.php @@ -1004,7 +1004,7 @@ abstract class Entity extends Location implements Metadatable{ if(!$this->onGround or $movY != 0){ $bb = clone $this->boundingBox; $bb->minY -= 1; - if(count($this->level->getCollisionBlocks($bb->expand(0.01, 0.01, 0.01))) > 0){ + if(count($this->level->getCollisionBlocks($bb)) > 0){ $this->onGround = true; }else{ $this->onGround = false;