Added new predictive flight protection

This commit is contained in:
Shoghi Cervantes 2015-01-14 23:47:01 +01:00
parent 24c6cca664
commit 63f1a50be4
No known key found for this signature in database
GPG Key ID: 78464DB0A7837F89
3 changed files with 21 additions and 9 deletions

View File

@ -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()){
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;

View File

@ -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;
}
/**

View File

@ -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;