From f7ec1de0fd643b9543461eaf3a4e2d3c49b5dcd7 Mon Sep 17 00:00:00 2001 From: Shoghi Cervantes Date: Fri, 19 Jun 2015 14:40:05 +0200 Subject: [PATCH] Players now have entity id 0 --- src/pocketmine/Player.php | 32 ++++++-- src/pocketmine/entity/Entity.php | 17 +++-- src/pocketmine/inventory/ChestInventory.php | 4 +- .../inventory/DoubleChestInventory.php | 4 +- src/pocketmine/inventory/PlayerInventory.php | 29 ++++--- src/pocketmine/level/Explosion.php | 2 +- src/pocketmine/level/Level.php | 75 ++++++++++++++----- 7 files changed, 108 insertions(+), 55 deletions(-) diff --git a/src/pocketmine/Player.php b/src/pocketmine/Player.php index 1feafad18..1356483b6 100644 --- a/src/pocketmine/Player.php +++ b/src/pocketmine/Player.php @@ -884,7 +884,7 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade * @return int|bool */ public function dataPacket(DataPacket $packet, $needACK = false){ - if($this->connected === false){ + if(!$this->connected){ return false; } @@ -1010,7 +1010,7 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade $this->level->sleepTicks = 0; $pk = new AnimatePacket(); - $pk->eid = $this->getId(); + $pk->eid = 0; $pk->action = 3; //Wake up $this->dataPacket($pk->setChannel(Network::CHANNEL_WORLD_EVENTS)); } @@ -1099,7 +1099,7 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade $pk->spawnZ = (int) $spawnPosition->z; $pk->generator = 1; //0 old, 1 infinite, 2 flat $pk->gamemode = $this->gamemode & 0x01; - $pk->eid = $this->getId(); + $pk->eid = 0; $this->dataPacket($pk->setChannel(Network::CHANNEL_WORLD_EVENTS)); $this->sendSettings(); @@ -1274,6 +1274,12 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade $pk->eid = $this->getId(); $pk->target = $entity->getId(); Server::broadcastPacket($entity->getViewers(), $pk->setChannel(Network::CHANNEL_ENTITY_SPAWNING)); + + $pk = new TakeItemEntityPacket(); + $pk->eid = 0; + $pk->target = $entity->getId(); + $this->dataPacket($pk->setChannel(Network::CHANNEL_ENTITY_SPAWNING)); + $this->inventory->addItem(clone $item); $entity->kill(); }elseif($entity instanceof DroppedItem){ @@ -1303,6 +1309,12 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade $pk->eid = $this->getId(); $pk->target = $entity->getId(); Server::broadcastPacket($entity->getViewers(), $pk->setChannel(Network::CHANNEL_ENTITY_SPAWNING)); + + $pk = new TakeItemEntityPacket(); + $pk->eid = 0; + $pk->target = $entity->getId(); + $this->dataPacket($pk->setChannel(Network::CHANNEL_ENTITY_SPAWNING)); + $this->inventory->addItem(clone $item); $entity->kill(); } @@ -1400,7 +1412,7 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade if($to->distanceSquared($ev->getTo()) > 0.01){ //If plugins modify the destination $this->teleport($ev->getTo()); }else{ - $this->sendPosition($this, null, null, MovePlayerPacket::MODE_NORMAL, Network::CHANNEL_MOVEMENT, $this->hasSpawned); + $this->level->addEntityMovement($this->x >> 4, $this->z >> 4, $this->getId(), $this->x, $this->y, $this->z, $this->yaw, $this->pitch, $this->yaw); } } } @@ -1439,6 +1451,9 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade if(parent::setMotion($mot)){ if($this->chunk !== null){ $this->level->addEntityMotion($this->chunk->getX(), $this->chunk->getZ(), $this->getId(), $this->motionX, $this->motionY, $this->motionZ); + $pk = new SetEntityMotionPacket(); + $pk->entities[] = [0, $mot->x, $mot->y, $mot->z]; + $this->dataPacket($pk->setChannel(Network::CHANNEL_MOVEMENT)); } if($this->motionY > 0){ @@ -1764,7 +1779,7 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade $pk->spawnZ = (int) $spawnPosition->z; $pk->generator = 1; //0 old, 1 infinite, 2 flat $pk->gamemode = $this->gamemode & 0x01; - $pk->eid = $this->getId(); //Always use EntityID as zero for the actual player + $pk->eid = 0; //Always use EntityID as zero for the actual player $this->dataPacket($pk->setChannel(Network::CHANNEL_PRIORITY)); $pk = new SetTimePacket(); @@ -2122,7 +2137,7 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade if ($this->isSurvival()) { $slot = $this->inventory->getItemInHand(); --$slot->count; - $this->inventory->setItemInHand($slot, $this); + $this->inventory->setItemInHand($slot); $this->inventory->addItem(Item::get(Item::BUCKET, 0, 1)); } @@ -3139,7 +3154,7 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade return; }elseif($this->getLastDamageCause() === $source and $this->spawned){ $pk = new EntityEventPacket(); - $pk->eid = $this->getId(); + $pk->eid = 0; $pk->event = EntityEventPacket::HURT_ANIMATION; $this->dataPacket($pk->setChannel(Network::CHANNEL_WORLD_EVENTS)); } @@ -3160,8 +3175,9 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade $pk->mode = $mode; if($targets !== null){ - Server::broadcastPacket($targets, $pk); + Server::broadcastPacket($targets, $pk->setChannel($channel)); }else{ + $pk->eid = 0; $this->dataPacket($pk->setChannel($channel)); } } diff --git a/src/pocketmine/entity/Entity.php b/src/pocketmine/entity/Entity.php index 745dd2391..987020325 100644 --- a/src/pocketmine/entity/Entity.php +++ b/src/pocketmine/entity/Entity.php @@ -520,7 +520,7 @@ abstract class Entity extends Location implements Metadatable{ public function sendPotionEffects(Player $player){ foreach($this->effects as $effect){ $pk = new MobEffectPacket(); - $pk->eid = $this->getId(); + $pk->eid = 0; $pk->effectId = $effect->getId(); $pk->amplifier = $effect->getAmplifier(); $pk->particles = $effect->isVisible(); @@ -543,14 +543,15 @@ abstract class Entity extends Location implements Metadatable{ * @param array $data Properly formatted entity data, defaults to everything */ public function sendData($player, array $data = null){ - if(!is_array($player)){ - $player = [$player]; - } - $pk = new SetEntityDataPacket(); - $pk->eid = $this->id; + $pk->eid = ($player === $this ? 0 : $this->getId()); $pk->metadata = $data === null ? $this->dataProperties : $data; - Server::broadcastPacket($player, $pk->setChannel(Network::CHANNEL_WORLD_EVENTS)); + + if(!is_array($player)){ + $player->dataPacket($pk->setChannel(Network::CHANNEL_WORLD_EVENTS)); + }else{ + Server::broadcastPacket($player, $pk->setChannel(Network::CHANNEL_WORLD_EVENTS)); + } } /** @@ -559,7 +560,7 @@ abstract class Entity extends Location implements Metadatable{ public function despawnFrom(Player $player){ if(isset($this->hasSpawned[$player->getLoaderId()])){ $pk = new RemoveEntityPacket(); - $pk->eid = $this->id; + $pk->eid = $this->getId(); $player->dataPacket($pk->setChannel(Network::CHANNEL_ENTITY_SPAWNING)); unset($this->hasSpawned[$player->getLoaderId()]); } diff --git a/src/pocketmine/inventory/ChestInventory.php b/src/pocketmine/inventory/ChestInventory.php index 844bbf897..a2f8447c6 100644 --- a/src/pocketmine/inventory/ChestInventory.php +++ b/src/pocketmine/inventory/ChestInventory.php @@ -51,7 +51,7 @@ class ChestInventory extends ContainerInventory{ $pk->case1 = 1; $pk->case2 = 2; if(($level = $this->getHolder()->getLevel()) instanceof Level){ - Server::broadcastPacket($level->getChunkPlayers($this->getHolder()->getX() >> 4, $this->getHolder()->getZ() >> 4), $pk->setChannel(Network::CHANNEL_WORLD_EVENTS)); + $level->addChunkPacket($this->getHolder()->getX() >> 4, $this->getHolder()->getZ() >> 4, $pk->setChannel(Network::CHANNEL_WORLD_EVENTS)); } } } @@ -65,7 +65,7 @@ class ChestInventory extends ContainerInventory{ $pk->case1 = 1; $pk->case2 = 0; if(($level = $this->getHolder()->getLevel()) instanceof Level){ - Server::broadcastPacket($level->getChunkPlayers($this->getHolder()->getX() >> 4, $this->getHolder()->getZ() >> 4), $pk->setChannel(Network::CHANNEL_WORLD_EVENTS)); + $level->addChunkPacket($this->getHolder()->getX() >> 4, $this->getHolder()->getZ() >> 4, $pk->setChannel(Network::CHANNEL_WORLD_EVENTS)); } } parent::onClose($who); diff --git a/src/pocketmine/inventory/DoubleChestInventory.php b/src/pocketmine/inventory/DoubleChestInventory.php index 7c882a8db..94c611cb4 100644 --- a/src/pocketmine/inventory/DoubleChestInventory.php +++ b/src/pocketmine/inventory/DoubleChestInventory.php @@ -106,7 +106,7 @@ class DoubleChestInventory extends ChestInventory implements InventoryHolder{ $pk->case1 = 1; $pk->case2 = 2; if(($level = $this->right->getHolder()->getLevel()) instanceof Level){ - Server::broadcastPacket($level->getChunkPlayers($this->right->getHolder()->getX() >> 4, $this->right->getHolder()->getZ() >> 4), $pk->setChannel(Network::CHANNEL_WORLD_EVENTS)); + $level->addChunkPacket($this->right->getHolder()->getX() >> 4, $this->right->getHolder()->getZ() >> 4, $pk->setChannel(Network::CHANNEL_WORLD_EVENTS)); } } } @@ -120,7 +120,7 @@ class DoubleChestInventory extends ChestInventory implements InventoryHolder{ $pk->case1 = 1; $pk->case2 = 0; if(($level = $this->right->getHolder()->getLevel()) instanceof Level){ - Server::broadcastPacket($level->getChunkPlayers($this->right->getHolder()->getX() >> 4, $this->right->getHolder()->getZ() >> 4), $pk->setChannel(Network::CHANNEL_WORLD_EVENTS)); + $level->addChunkPacket($this->right->getHolder()->getX() >> 4, $this->right->getHolder()->getZ() >> 4, $pk->setChannel(Network::CHANNEL_WORLD_EVENTS)); } } parent::onClose($who); diff --git a/src/pocketmine/inventory/PlayerInventory.php b/src/pocketmine/inventory/PlayerInventory.php index f0a624be8..a9285172c 100644 --- a/src/pocketmine/inventory/PlayerInventory.php +++ b/src/pocketmine/inventory/PlayerInventory.php @@ -124,26 +124,27 @@ class PlayerInventory extends BaseInventory{ * @param Player|Player[] $target */ public function sendHeldItem($target){ - if($target instanceof Player){ - $target = [$target]; - } - $item = $this->getItemInHand(); $pk = new PlayerEquipmentPacket(); - $pk->eid = $this->getHolder()->getId(); + $pk->eid = ($target === $this->getHolder() ? 0 : $this->getHolder()->getId()); $pk->item = $item->getId(); $pk->meta = $item->getDamage(); $pk->slot = $this->getHeldItemSlot(); $pk->selectedSlot = $this->getHeldItemIndex(); - $pk->isEncoded = true; - Server::broadcastPacket($target, $pk->setChannel(Network::CHANNEL_ENTITY_SPAWNING)); - - foreach($target as $player){ - if($player === $this->getHolder()){ - $this->sendSlot($this->getHeldItemSlot(), $player); - break; + if(!is_array($target)){ + $target->dataPacket($pk->setChannel(Network::CHANNEL_ENTITY_SPAWNING)); + if($target === $this->getHolder()){ + $this->sendSlot($this->getHeldItemSlot(), $target); + } + }else{ + Server::broadcastPacket($target, $pk->setChannel(Network::CHANNEL_ENTITY_SPAWNING)); + foreach($target as $player){ + if($player === $this->getHolder()){ + $this->sendSlot($this->getHeldItemSlot(), $player); + break; + } } } } @@ -323,10 +324,6 @@ class PlayerInventory extends BaseInventory{ foreach($target as $player){ if($player === $this->getHolder()){ - /** @var Player $player */ - //$pk2 = clone $pk; - //$pk2->eid = 0; - $pk2 = new ContainerSetContentPacket(); $pk2->windowid = ContainerSetContentPacket::SPECIAL_ARMOR; $pk2->slots = $armor; diff --git a/src/pocketmine/level/Explosion.php b/src/pocketmine/level/Explosion.php index b6682c282..bf119e1e9 100644 --- a/src/pocketmine/level/Explosion.php +++ b/src/pocketmine/level/Explosion.php @@ -233,7 +233,7 @@ class Explosion{ $pk->z = $this->source->z; $pk->radius = $this->size; $pk->records = $send; - Server::broadcastPacket($this->level->getChunkPlayers($source->x >> 4, $source->z >> 4), $pk->setChannel(Network::CHANNEL_BLOCKS)); + $this->level->addChunkPacket($source->x >> 4, $source->z >> 4, $pk->setChannel(Network::CHANNEL_BLOCKS)); return true; } diff --git a/src/pocketmine/level/Level.php b/src/pocketmine/level/Level.php index 441d664ef..4a808350e 100644 --- a/src/pocketmine/level/Level.php +++ b/src/pocketmine/level/Level.php @@ -175,6 +175,9 @@ class Level implements ChunkManager, Metadatable{ /** @var Player[][] */ private $playerLoaders = []; + /** @var DataPacket[] */ + private $chunkPackets = []; + /** @var float[] */ private $unloadQueue; @@ -445,15 +448,23 @@ class Level implements ChunkManager, Metadatable{ $pk = $sound->encode(); if($players === null){ - $players = $this->getChunkPlayers($sound->x >> 4, $sound->z >> 4); - } - - if($pk !== null){ - if(!is_array($pk)){ - Server::broadcastPacket($players, $pk->setChannel(Network::CHANNEL_WORLD_EVENTS)); - }else{ - $this->server->batchPackets($players, $pk, false, Network::CHANNEL_WORLD_EVENTS); + if($pk !== null){ + if(!is_array($pk)){ + $this->addChunkPacket($sound->x >> 4, $sound->z >> 4, $pk); + }else{ + foreach($pk as $e){ + $this->addChunkPacket($sound->x >> 4, $sound->z >> 4, $e); + } + } } + }else{ + if($pk !== null){ + if(!is_array($pk)){ + Server::broadcastPacket($players, $pk->setChannel(Network::CHANNEL_WORLD_EVENTS)); + }else{ + $this->server->batchPackets($players, $pk, false, Network::CHANNEL_WORLD_EVENTS); + } + } } } @@ -461,14 +472,22 @@ class Level implements ChunkManager, Metadatable{ $pk = $particle->encode(); if($players === null){ - $players = $this->getChunkPlayers($particle->x >> 4, $particle->z >> 4); - } - - if($pk !== null){ - if(!is_array($pk)){ - Server::broadcastPacket($players, $pk->setChannel(Network::CHANNEL_WORLD_EVENTS)); - }else{ - $this->server->batchPackets($players, $pk, false, Network::CHANNEL_WORLD_EVENTS); + if($pk !== null){ + if(!is_array($pk)){ + $this->addChunkPacket($particle->x >> 4, $particle->z >> 4, $pk); + }else{ + foreach($pk as $e){ + $this->addChunkPacket($particle->x >> 4, $particle->z >> 4, $e); + } + } + } + }else{ + if($pk !== null){ + if(!is_array($pk)){ + Server::broadcastPacket($players, $pk->setChannel(Network::CHANNEL_WORLD_EVENTS)); + }else{ + $this->server->batchPackets($players, $pk, false, Network::CHANNEL_WORLD_EVENTS); + } } } } @@ -558,6 +577,14 @@ class Level implements ChunkManager, Metadatable{ return isset($this->chunkLoaders[$index = Level::chunkHash($chunkX, $chunkZ)]) ? $this->chunkLoaders[$index] : []; } + public function addChunkPacket($chunkX, $chunkZ, DataPacket $packet){ + if(!isset($this->chunkPackets[$index = Level::chunkHash($chunkX, $chunkZ)])){ + $this->chunkPackets[$index] = [$packet]; + }else{ + $this->chunkPackets[$index][] = $packet; + } + } + public function registerChunkLoader(ChunkLoader $loader, $chunkX, $chunkZ, $autoLoad = true){ $hash = $loader->getLoaderId(); @@ -718,7 +745,7 @@ class Level implements ChunkManager, Metadatable{ Level::getXZ($index, $chunkX, $chunkZ); $pk = new MoveEntityPacket(); $pk->entities = $entry; - Server::broadcastPacket($this->getChunkPlayers($chunkX, $chunkZ), $pk->setChannel(Network::CHANNEL_MOVEMENT)); + $this->addChunkPacket($chunkX, $chunkZ, $pk->setChannel(Network::CHANNEL_MOVEMENT)); } $this->moveToSend = []; @@ -726,10 +753,22 @@ class Level implements ChunkManager, Metadatable{ Level::getXZ($index, $chunkX, $chunkZ); $pk = new SetEntityMotionPacket(); $pk->entities = $entry; - Server::broadcastPacket($this->getChunkPlayers($chunkX, $chunkZ), $pk->setChannel(Network::CHANNEL_MOVEMENT)); + $this->addChunkPacket($chunkX, $chunkZ, $pk->setChannel(Network::CHANNEL_MOVEMENT)); } $this->motionToSend = []; + foreach($this->chunkPackets as $index => $entries){ + Level::getXZ($index, $chunkX, $chunkZ); + $chunkPlayers = $this->getChunkPlayers($chunkX, $chunkZ); + if(count($chunkPlayers) > 0){ + foreach($entries as $pk){ + Server::broadcastPacket($chunkPlayers, $pk); + } + } + } + + $this->chunkPackets = []; + $this->timings->doTick->stopTiming(); }