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 * @return int|bool
*/ */
public function dataPacket(DataPacket $packet, $needACK = false){ public function dataPacket(DataPacket $packet, $needACK = false){
if($this->connected === false){ if(!$this->connected){
return false; return false;
} }
@ -1010,7 +1010,7 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade
$this->level->sleepTicks = 0; $this->level->sleepTicks = 0;
$pk = new AnimatePacket(); $pk = new AnimatePacket();
$pk->eid = $this->getId(); $pk->eid = 0;
$pk->action = 3; //Wake up $pk->action = 3; //Wake up
$this->dataPacket($pk->setChannel(Network::CHANNEL_WORLD_EVENTS)); $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->spawnZ = (int) $spawnPosition->z;
$pk->generator = 1; //0 old, 1 infinite, 2 flat $pk->generator = 1; //0 old, 1 infinite, 2 flat
$pk->gamemode = $this->gamemode & 0x01; $pk->gamemode = $this->gamemode & 0x01;
$pk->eid = $this->getId(); $pk->eid = 0;
$this->dataPacket($pk->setChannel(Network::CHANNEL_WORLD_EVENTS)); $this->dataPacket($pk->setChannel(Network::CHANNEL_WORLD_EVENTS));
$this->sendSettings(); $this->sendSettings();
@ -1274,6 +1274,12 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade
$pk->eid = $this->getId(); $pk->eid = $this->getId();
$pk->target = $entity->getId(); $pk->target = $entity->getId();
Server::broadcastPacket($entity->getViewers(), $pk->setChannel(Network::CHANNEL_ENTITY_SPAWNING)); 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); $this->inventory->addItem(clone $item);
$entity->kill(); $entity->kill();
}elseif($entity instanceof DroppedItem){ }elseif($entity instanceof DroppedItem){
@ -1303,6 +1309,12 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade
$pk->eid = $this->getId(); $pk->eid = $this->getId();
$pk->target = $entity->getId(); $pk->target = $entity->getId();
Server::broadcastPacket($entity->getViewers(), $pk->setChannel(Network::CHANNEL_ENTITY_SPAWNING)); 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); $this->inventory->addItem(clone $item);
$entity->kill(); $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 if($to->distanceSquared($ev->getTo()) > 0.01){ //If plugins modify the destination
$this->teleport($ev->getTo()); $this->teleport($ev->getTo());
}else{ }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(parent::setMotion($mot)){
if($this->chunk !== null){ if($this->chunk !== null){
$this->level->addEntityMotion($this->chunk->getX(), $this->chunk->getZ(), $this->getId(), $this->motionX, $this->motionY, $this->motionZ); $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){ if($this->motionY > 0){
@ -1764,7 +1779,7 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade
$pk->spawnZ = (int) $spawnPosition->z; $pk->spawnZ = (int) $spawnPosition->z;
$pk->generator = 1; //0 old, 1 infinite, 2 flat $pk->generator = 1; //0 old, 1 infinite, 2 flat
$pk->gamemode = $this->gamemode & 0x01; $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)); $this->dataPacket($pk->setChannel(Network::CHANNEL_PRIORITY));
$pk = new SetTimePacket(); $pk = new SetTimePacket();
@ -2122,7 +2137,7 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade
if ($this->isSurvival()) { if ($this->isSurvival()) {
$slot = $this->inventory->getItemInHand(); $slot = $this->inventory->getItemInHand();
--$slot->count; --$slot->count;
$this->inventory->setItemInHand($slot, $this); $this->inventory->setItemInHand($slot);
$this->inventory->addItem(Item::get(Item::BUCKET, 0, 1)); $this->inventory->addItem(Item::get(Item::BUCKET, 0, 1));
} }
@ -3139,7 +3154,7 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade
return; return;
}elseif($this->getLastDamageCause() === $source and $this->spawned){ }elseif($this->getLastDamageCause() === $source and $this->spawned){
$pk = new EntityEventPacket(); $pk = new EntityEventPacket();
$pk->eid = $this->getId(); $pk->eid = 0;
$pk->event = EntityEventPacket::HURT_ANIMATION; $pk->event = EntityEventPacket::HURT_ANIMATION;
$this->dataPacket($pk->setChannel(Network::CHANNEL_WORLD_EVENTS)); $this->dataPacket($pk->setChannel(Network::CHANNEL_WORLD_EVENTS));
} }
@ -3160,8 +3175,9 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade
$pk->mode = $mode; $pk->mode = $mode;
if($targets !== null){ if($targets !== null){
Server::broadcastPacket($targets, $pk); Server::broadcastPacket($targets, $pk->setChannel($channel));
}else{ }else{
$pk->eid = 0;
$this->dataPacket($pk->setChannel($channel)); $this->dataPacket($pk->setChannel($channel));
} }
} }

View File

@ -520,7 +520,7 @@ abstract class Entity extends Location implements Metadatable{
public function sendPotionEffects(Player $player){ public function sendPotionEffects(Player $player){
foreach($this->effects as $effect){ foreach($this->effects as $effect){
$pk = new MobEffectPacket(); $pk = new MobEffectPacket();
$pk->eid = $this->getId(); $pk->eid = 0;
$pk->effectId = $effect->getId(); $pk->effectId = $effect->getId();
$pk->amplifier = $effect->getAmplifier(); $pk->amplifier = $effect->getAmplifier();
$pk->particles = $effect->isVisible(); $pk->particles = $effect->isVisible();
@ -543,15 +543,16 @@ abstract class Entity extends Location implements Metadatable{
* @param array $data Properly formatted entity data, defaults to everything * @param array $data Properly formatted entity data, defaults to everything
*/ */
public function sendData($player, array $data = null){ public function sendData($player, array $data = null){
if(!is_array($player)){
$player = [$player];
}
$pk = new SetEntityDataPacket(); $pk = new SetEntityDataPacket();
$pk->eid = $this->id; $pk->eid = ($player === $this ? 0 : $this->getId());
$pk->metadata = $data === null ? $this->dataProperties : $data; $pk->metadata = $data === null ? $this->dataProperties : $data;
if(!is_array($player)){
$player->dataPacket($pk->setChannel(Network::CHANNEL_WORLD_EVENTS));
}else{
Server::broadcastPacket($player, $pk->setChannel(Network::CHANNEL_WORLD_EVENTS)); Server::broadcastPacket($player, $pk->setChannel(Network::CHANNEL_WORLD_EVENTS));
} }
}
/** /**
* @param Player $player * @param Player $player
@ -559,7 +560,7 @@ abstract class Entity extends Location implements Metadatable{
public function despawnFrom(Player $player){ public function despawnFrom(Player $player){
if(isset($this->hasSpawned[$player->getLoaderId()])){ if(isset($this->hasSpawned[$player->getLoaderId()])){
$pk = new RemoveEntityPacket(); $pk = new RemoveEntityPacket();
$pk->eid = $this->id; $pk->eid = $this->getId();
$player->dataPacket($pk->setChannel(Network::CHANNEL_ENTITY_SPAWNING)); $player->dataPacket($pk->setChannel(Network::CHANNEL_ENTITY_SPAWNING));
unset($this->hasSpawned[$player->getLoaderId()]); unset($this->hasSpawned[$player->getLoaderId()]);
} }

View File

@ -51,7 +51,7 @@ class ChestInventory extends ContainerInventory{
$pk->case1 = 1; $pk->case1 = 1;
$pk->case2 = 2; $pk->case2 = 2;
if(($level = $this->getHolder()->getLevel()) instanceof Level){ 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->case1 = 1;
$pk->case2 = 0; $pk->case2 = 0;
if(($level = $this->getHolder()->getLevel()) instanceof Level){ 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); parent::onClose($who);

View File

@ -106,7 +106,7 @@ class DoubleChestInventory extends ChestInventory implements InventoryHolder{
$pk->case1 = 1; $pk->case1 = 1;
$pk->case2 = 2; $pk->case2 = 2;
if(($level = $this->right->getHolder()->getLevel()) instanceof Level){ 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->case1 = 1;
$pk->case2 = 0; $pk->case2 = 0;
if(($level = $this->right->getHolder()->getLevel()) instanceof Level){ 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); parent::onClose($who);

View File

@ -124,22 +124,22 @@ class PlayerInventory extends BaseInventory{
* @param Player|Player[] $target * @param Player|Player[] $target
*/ */
public function sendHeldItem($target){ public function sendHeldItem($target){
if($target instanceof Player){
$target = [$target];
}
$item = $this->getItemInHand(); $item = $this->getItemInHand();
$pk = new PlayerEquipmentPacket(); $pk = new PlayerEquipmentPacket();
$pk->eid = $this->getHolder()->getId(); $pk->eid = ($target === $this->getHolder() ? 0 : $this->getHolder()->getId());
$pk->item = $item->getId(); $pk->item = $item->getId();
$pk->meta = $item->getDamage(); $pk->meta = $item->getDamage();
$pk->slot = $this->getHeldItemSlot(); $pk->slot = $this->getHeldItemSlot();
$pk->selectedSlot = $this->getHeldItemIndex(); $pk->selectedSlot = $this->getHeldItemIndex();
$pk->isEncoded = true;
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)); Server::broadcastPacket($target, $pk->setChannel(Network::CHANNEL_ENTITY_SPAWNING));
foreach($target as $player){ foreach($target as $player){
if($player === $this->getHolder()){ if($player === $this->getHolder()){
$this->sendSlot($this->getHeldItemSlot(), $player); $this->sendSlot($this->getHeldItemSlot(), $player);
@ -147,6 +147,7 @@ class PlayerInventory extends BaseInventory{
} }
} }
} }
}
public function onSlotChange($index, $before){ public function onSlotChange($index, $before){
$holder = $this->getHolder(); $holder = $this->getHolder();
@ -323,10 +324,6 @@ class PlayerInventory extends BaseInventory{
foreach($target as $player){ foreach($target as $player){
if($player === $this->getHolder()){ if($player === $this->getHolder()){
/** @var Player $player */
//$pk2 = clone $pk;
//$pk2->eid = 0;
$pk2 = new ContainerSetContentPacket(); $pk2 = new ContainerSetContentPacket();
$pk2->windowid = ContainerSetContentPacket::SPECIAL_ARMOR; $pk2->windowid = ContainerSetContentPacket::SPECIAL_ARMOR;
$pk2->slots = $armor; $pk2->slots = $armor;

View File

@ -233,7 +233,7 @@ class Explosion{
$pk->z = $this->source->z; $pk->z = $this->source->z;
$pk->radius = $this->size; $pk->radius = $this->size;
$pk->records = $send; $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; return true;
} }

View File

@ -175,6 +175,9 @@ class Level implements ChunkManager, Metadatable{
/** @var Player[][] */ /** @var Player[][] */
private $playerLoaders = []; private $playerLoaders = [];
/** @var DataPacket[] */
private $chunkPackets = [];
/** @var float[] */ /** @var float[] */
private $unloadQueue; private $unloadQueue;
@ -445,9 +448,16 @@ class Level implements ChunkManager, Metadatable{
$pk = $sound->encode(); $pk = $sound->encode();
if($players === null){ if($players === null){
$players = $this->getChunkPlayers($sound->x >> 4, $sound->z >> 4); 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($pk !== null){
if(!is_array($pk)){ if(!is_array($pk)){
Server::broadcastPacket($players, $pk->setChannel(Network::CHANNEL_WORLD_EVENTS)); Server::broadcastPacket($players, $pk->setChannel(Network::CHANNEL_WORLD_EVENTS));
@ -456,14 +466,22 @@ class Level implements ChunkManager, Metadatable{
} }
} }
} }
}
public function addParticle(Particle $particle, array $players = null){ public function addParticle(Particle $particle, array $players = null){
$pk = $particle->encode(); $pk = $particle->encode();
if($players === null){ if($players === null){
$players = $this->getChunkPlayers($particle->x >> 4, $particle->z >> 4); 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($pk !== null){
if(!is_array($pk)){ if(!is_array($pk)){
Server::broadcastPacket($players, $pk->setChannel(Network::CHANNEL_WORLD_EVENTS)); Server::broadcastPacket($players, $pk->setChannel(Network::CHANNEL_WORLD_EVENTS));
@ -472,6 +490,7 @@ class Level implements ChunkManager, Metadatable{
} }
} }
} }
}
/** /**
* @return bool * @return bool
@ -558,6 +577,14 @@ class Level implements ChunkManager, Metadatable{
return isset($this->chunkLoaders[$index = Level::chunkHash($chunkX, $chunkZ)]) ? $this->chunkLoaders[$index] : []; 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){ public function registerChunkLoader(ChunkLoader $loader, $chunkX, $chunkZ, $autoLoad = true){
$hash = $loader->getLoaderId(); $hash = $loader->getLoaderId();
@ -718,7 +745,7 @@ class Level implements ChunkManager, Metadatable{
Level::getXZ($index, $chunkX, $chunkZ); Level::getXZ($index, $chunkX, $chunkZ);
$pk = new MoveEntityPacket(); $pk = new MoveEntityPacket();
$pk->entities = $entry; $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 = []; $this->moveToSend = [];
@ -726,10 +753,22 @@ class Level implements ChunkManager, Metadatable{
Level::getXZ($index, $chunkX, $chunkZ); Level::getXZ($index, $chunkX, $chunkZ);
$pk = new SetEntityMotionPacket(); $pk = new SetEntityMotionPacket();
$pk->entities = $entry; $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 = []; $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(); $this->timings->doTick->stopTiming();
} }