mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-06-13 06:55:29 +00:00
Move last-known-position tracking to World instead of Entity
This commit is contained in:
parent
e925423749
commit
dd58a95ae5
@ -96,9 +96,6 @@ abstract class Entity{
|
|||||||
/** @var EntityMetadataCollection */
|
/** @var EntityMetadataCollection */
|
||||||
private $networkProperties;
|
private $networkProperties;
|
||||||
|
|
||||||
/** @var Vector3 */
|
|
||||||
public $worldLastKnownLocation;
|
|
||||||
|
|
||||||
/** @var EntityDamageEvent|null */
|
/** @var EntityDamageEvent|null */
|
||||||
protected $lastDamageCause = null;
|
protected $lastDamageCause = null;
|
||||||
|
|
||||||
@ -229,7 +226,6 @@ abstract class Entity{
|
|||||||
$this->server = $location->getWorld()->getServer();
|
$this->server = $location->getWorld()->getServer();
|
||||||
|
|
||||||
$this->location = $location->asLocation();
|
$this->location = $location->asLocation();
|
||||||
$this->worldLastKnownLocation = $this->location->asLocation();
|
|
||||||
assert(
|
assert(
|
||||||
!is_nan($this->location->x) and !is_infinite($this->location->x) and
|
!is_nan($this->location->x) and !is_infinite($this->location->x) and
|
||||||
!is_nan($this->location->y) and !is_infinite($this->location->y) and
|
!is_nan($this->location->y) and !is_infinite($this->location->y) and
|
||||||
|
@ -148,6 +148,11 @@ class World implements ChunkManager{
|
|||||||
|
|
||||||
/** @var Entity[] */
|
/** @var Entity[] */
|
||||||
private $entities = [];
|
private $entities = [];
|
||||||
|
/**
|
||||||
|
* @var Vector3[]
|
||||||
|
* @phpstan-var array<int, Vector3>
|
||||||
|
*/
|
||||||
|
private $entityLastKnownPositions = [];
|
||||||
|
|
||||||
/** @var Entity[] */
|
/** @var Entity[] */
|
||||||
public $updateEntities = [];
|
public $updateEntities = [];
|
||||||
@ -2142,7 +2147,7 @@ class World implements ChunkManager{
|
|||||||
throw new \InvalidArgumentException("Cannot add an Entity in an ungenerated chunk");
|
throw new \InvalidArgumentException("Cannot add an Entity in an ungenerated chunk");
|
||||||
}
|
}
|
||||||
$chunk->addEntity($entity);
|
$chunk->addEntity($entity);
|
||||||
$entity->worldLastKnownLocation = $pos;
|
$this->entityLastKnownPositions[$entity->getId()] = $pos;
|
||||||
|
|
||||||
if($entity instanceof Player){
|
if($entity instanceof Player){
|
||||||
$this->players[$entity->getId()] = $entity;
|
$this->players[$entity->getId()] = $entity;
|
||||||
@ -2159,11 +2164,12 @@ class World implements ChunkManager{
|
|||||||
if($entity->getWorld() !== $this){
|
if($entity->getWorld() !== $this){
|
||||||
throw new \InvalidArgumentException("Invalid Entity world");
|
throw new \InvalidArgumentException("Invalid Entity world");
|
||||||
}
|
}
|
||||||
$pos = $entity->worldLastKnownLocation;
|
$pos = $this->entityLastKnownPositions[$entity->getId()];
|
||||||
$chunk = $this->getChunk($pos->getFloorX() >> 4, $pos->getFloorZ() >> 4);
|
$chunk = $this->getChunk($pos->getFloorX() >> 4, $pos->getFloorZ() >> 4);
|
||||||
if($chunk !== null){ //we don't care if the chunk already went out of scope
|
if($chunk !== null){ //we don't care if the chunk already went out of scope
|
||||||
$chunk->removeEntity($entity);
|
$chunk->removeEntity($entity);
|
||||||
}
|
}
|
||||||
|
unset($this->entityLastKnownPositions[$entity->getId()]);
|
||||||
|
|
||||||
if($entity instanceof Player){
|
if($entity instanceof Player){
|
||||||
unset($this->players[$entity->getId()]);
|
unset($this->players[$entity->getId()]);
|
||||||
@ -2178,11 +2184,11 @@ class World implements ChunkManager{
|
|||||||
* @internal
|
* @internal
|
||||||
*/
|
*/
|
||||||
public function onEntityMoved(Entity $entity) : void{
|
public function onEntityMoved(Entity $entity) : void{
|
||||||
if(!array_key_exists($entity->getId(), $this->entities)){
|
if(!array_key_exists($entity->getId(), $this->entityLastKnownPositions)){
|
||||||
//this can happen if the entity was teleported before addEntity() was called
|
//this can happen if the entity was teleported before addEntity() was called
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
$oldPosition = $entity->worldLastKnownLocation;
|
$oldPosition = $this->entityLastKnownPositions[$entity->getId()];
|
||||||
$newPosition = $entity->getPosition();
|
$newPosition = $entity->getPosition();
|
||||||
|
|
||||||
$oldChunkX = $oldPosition->getFloorX() >> 4;
|
$oldChunkX = $oldPosition->getFloorX() >> 4;
|
||||||
@ -2219,9 +2225,9 @@ class World implements ChunkManager{
|
|||||||
}
|
}
|
||||||
|
|
||||||
$newChunk->addEntity($entity);
|
$newChunk->addEntity($entity);
|
||||||
$entity->worldLastKnownLocation = $newPosition->asVector3();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
$this->entityLastKnownPositions[$entity->getId()] = $newPosition->asVector3();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
x
Reference in New Issue
Block a user