Players now have entity id 0

This commit is contained in:
Shoghi Cervantes 2015-06-19 14:40:05 +02:00
parent b856e5e909
commit f7ec1de0fd
No known key found for this signature in database
GPG Key ID: 78464DB0A7837F89
7 changed files with 108 additions and 55 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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