From c00370cfbfcd24ff0f3d31bb4ad02a2ba9abf871 Mon Sep 17 00:00:00 2001 From: Shoghi Cervantes Date: Wed, 18 Mar 2015 08:51:38 +0100 Subject: [PATCH] Added experimental particles --- src/pocketmine/entity/Wolf.php | 5 ++ src/pocketmine/level/Level.php | 11 ++- .../level/particle/FloatingTextParticle.php | 90 +++++++++++++++++++ .../level/particle/HearthParticle.php | 63 +++++++++++++ src/pocketmine/level/particle/Particle.php | 2 +- .../level/particle/WaterParticle.php | 72 +++++++++++++++ src/pocketmine/utils/Binary.php | 2 - 7 files changed, 241 insertions(+), 4 deletions(-) create mode 100644 src/pocketmine/level/particle/FloatingTextParticle.php create mode 100644 src/pocketmine/level/particle/HearthParticle.php create mode 100644 src/pocketmine/level/particle/WaterParticle.php diff --git a/src/pocketmine/entity/Wolf.php b/src/pocketmine/entity/Wolf.php index 481268eba..cfa2c06fe 100644 --- a/src/pocketmine/entity/Wolf.php +++ b/src/pocketmine/entity/Wolf.php @@ -24,4 +24,9 @@ namespace pocketmine\entity; class Wolf extends Animal implements Tameable{ + const NETWORK_ID = 14; + + public function getName(){ + return "Wolf"; + } } \ No newline at end of file diff --git a/src/pocketmine/level/Level.php b/src/pocketmine/level/Level.php index 708c1eb18..68fa8bab1 100644 --- a/src/pocketmine/level/Level.php +++ b/src/pocketmine/level/Level.php @@ -371,7 +371,14 @@ class Level implements ChunkManager, Metadatable{ public function addParticle(Particle $particle){ $pk = $particle->encode(); if($pk !== null){ - Server::broadcastPacket($this->getUsingChunk($particle->x >> 4, $particle->z >> 4), $pk); + if(!is_array($pk)){ + Server::broadcastPacket($this->getUsingChunk($particle->x >> 4, $particle->z >> 4), $pk); + }else{ + $players = $this->getUsingChunk($particle->x >> 4, $particle->z >> 4); + foreach($pk as $p){ + Server::broadcastPacket($players, $p); + } + } } } @@ -1335,6 +1342,8 @@ class Level implements ChunkManager, Metadatable{ $target = $this->getBlock($vector); $block = $target->getSide($face); + $this->addParticle(new \pocketmine\level\particle\FloatingTextParticle($target->add(0.5, 1.5, 0.5), "TESTTTTT\nSssass")); + if($block->y > 127 or $block->y < 0){ return false; } diff --git a/src/pocketmine/level/particle/FloatingTextParticle.php b/src/pocketmine/level/particle/FloatingTextParticle.php new file mode 100644 index 000000000..ff683b63d --- /dev/null +++ b/src/pocketmine/level/particle/FloatingTextParticle.php @@ -0,0 +1,90 @@ +x, $pos->y, $pos->z); + $this->text = $text; + $this->title = $title; + } + + public function setText($text){ + $this->text = $text; + } + + public function setTitle($title){ + $this->title = $title; + } + + public function encode(){ + $p = []; + + if($this->entityId === null){ + $this->entityId = bcadd("1095216660480", mt_rand(0, 0x7fffffff)); //No conflict with other things + }else{ + $pk0 = new RemovePlayerPacket(); + $pk0->eid = $this->entityId; + $pk0->clientID = $this->entityId; + + $p[] = $pk0; + } + + $pk = new AddPlayerPacket(); + $pk->eid = $this->entityId; + $pk->username = $this->title . "\n" . $this->text; + $pk->clientID = $this->entityId; + $pk->x = $this->x; + $pk->y = $this->y - 2; + $pk->z = $this->z; + $pk->yaw = 0; + $pk->pitch = 0; + $pk->item = 0; + $pk->meta = 0; + $pk->metadata = [ + Entity::DATA_FLAGS => [Entity::DATA_TYPE_BYTE, 1 << Entity::DATA_FLAG_INVISIBLE], + Entity::DATA_AIR => [Entity::DATA_TYPE_SHORT, 300], + Entity::DATA_SHOW_NAMETAG => [Entity::DATA_TYPE_BYTE, 1] + ]; + + $p[] = $pk; + + return $pk; + } +} diff --git a/src/pocketmine/level/particle/HearthParticle.php b/src/pocketmine/level/particle/HearthParticle.php new file mode 100644 index 000000000..0dc2fc234 --- /dev/null +++ b/src/pocketmine/level/particle/HearthParticle.php @@ -0,0 +1,63 @@ +x, $pos->y, $pos->z); + } + + public function encode(){ + $entityId = bcadd("1095216660480", mt_rand(0, 0x7fffffff)); //No conflict with other things + $pk = new AddMobPacket(); + $pk->eid = $entityId; + $pk->type = Wolf::NETWORK_ID; + $pk->x = $this->x; + $pk->y = $this->y; + $pk->z = $this->z; + $pk->pitch = 0; + $pk->yaw = 0; + $pk->metadata = [ + Entity::DATA_FLAGS => [Entity::DATA_TYPE_BYTE, 1 << Entity::DATA_FLAG_INVISIBLE], + Entity::DATA_AIR => [Entity::DATA_TYPE_SHORT, 300] + ]; + + $pk2 = new EntityEventPacket(); + $pk2->eid = $entityId; + $pk2->event = 7; + + $pk3 = new RemoveEntityPacket(); + $pk3->eid = $entityId; + + return [$pk, $pk2, $pk3]; + } +} diff --git a/src/pocketmine/level/particle/Particle.php b/src/pocketmine/level/particle/Particle.php index 66ce268ee..82323b08a 100644 --- a/src/pocketmine/level/particle/Particle.php +++ b/src/pocketmine/level/particle/Particle.php @@ -27,7 +27,7 @@ use pocketmine\network\protocol\DataPacket; abstract class Particle extends Vector3{ /** - * @return DataPacket + * @return DataPacket|DataPacket[] */ abstract public function encode(); diff --git a/src/pocketmine/level/particle/WaterParticle.php b/src/pocketmine/level/particle/WaterParticle.php new file mode 100644 index 000000000..9d1bee9ed --- /dev/null +++ b/src/pocketmine/level/particle/WaterParticle.php @@ -0,0 +1,72 @@ +x, $pos->y, $pos->z); + $this->angle = $angle; + } + + public function encode(){ + $entityId = bcadd("1095216660480", mt_rand(0, 0x7fffffff)); //No conflict with other things + $pk = new AddEntityPacket(); + $pk->eid = $entityId; + $pk->type = 77; + $pk->x = $this->x; + $pk->y = $this->y; + $pk->z = $this->z; + $pk->did = 0; + + $pk2 = new SetEntityDataPacket(); + $pk2->eid = $entityId; + $pk2->metadata = [ + Entity::DATA_FLAGS => [Entity::DATA_TYPE_BYTE, 1 << Entity::DATA_FLAG_INVISIBLE], + Entity::DATA_AIR => [Entity::DATA_TYPE_SHORT, 300], + 2 => [Entity::DATA_TYPE_FLOAT, $this->x], + 4 => [Entity::DATA_TYPE_FLOAT, $this->z], + 8 => [Entity::DATA_TYPE_FLOAT, $this->angle] + ]; + + $pk3 = new EntityEventPacket(); + $pk3->eid = $entityId; + $pk3->event = 12; + + $pk4 = new RemoveEntityPacket(); + $pk4->eid = $entityId; + + return [$pk, $pk2, $pk3, $pk4]; + } +} diff --git a/src/pocketmine/utils/Binary.php b/src/pocketmine/utils/Binary.php index a06a80a7b..d0528c04d 100644 --- a/src/pocketmine/utils/Binary.php +++ b/src/pocketmine/utils/Binary.php @@ -80,7 +80,6 @@ class Binary{ /** * Writes a coded metadata string - * TODO: Replace and move this to entity * * @param array $data * @@ -128,7 +127,6 @@ class Binary{ /** * Reads a metadata coded string - * TODO: Change * * @param $value * @param bool $types