diff --git a/src/pocketmine/level/Level.php b/src/pocketmine/level/Level.php index 13e88fd99..5abce7807 100644 --- a/src/pocketmine/level/Level.php +++ b/src/pocketmine/level/Level.php @@ -1288,7 +1288,7 @@ class Level implements ChunkManager, Metadatable{ } $drops = $target->getDrops($item); //Fixes tile entities being deleted before getting drops - $this->addParticle(new DestroyBlockParticle($target, $target)); + $this->addParticle(new DestroyBlockParticle($target->add(0.5, 0.5, 0.5), $target)); $target->onBreak($item); diff --git a/src/pocketmine/level/particle/BubbleParticle.php b/src/pocketmine/level/particle/BubbleParticle.php new file mode 100644 index 000000000..2aa5751fb --- /dev/null +++ b/src/pocketmine/level/particle/BubbleParticle.php @@ -0,0 +1,30 @@ +x, $pos->y, $pos->z, 1); + } +} diff --git a/src/pocketmine/level/particle/CriticalParticle.php b/src/pocketmine/level/particle/CriticalParticle.php new file mode 100644 index 000000000..c35fd28a7 --- /dev/null +++ b/src/pocketmine/level/particle/CriticalParticle.php @@ -0,0 +1,30 @@ +x, $pos->y, $pos->z, 2); + } +} diff --git a/src/pocketmine/level/particle/DustParticle.php b/src/pocketmine/level/particle/DustParticle.php new file mode 100644 index 000000000..15a96f9e0 --- /dev/null +++ b/src/pocketmine/level/particle/DustParticle.php @@ -0,0 +1,30 @@ +x, $pos->y, $pos->z, 22, (($a & 0xff) << 24) | (($r & 0xff) << 16) | (($g & 0xff) << 8) | ($b & 0xff)); + } +} diff --git a/src/pocketmine/level/particle/EnchantParticle.php b/src/pocketmine/level/particle/EnchantParticle.php new file mode 100644 index 000000000..d9c216961 --- /dev/null +++ b/src/pocketmine/level/particle/EnchantParticle.php @@ -0,0 +1,30 @@ +x, $pos->y, $pos->z, 23); + } +} diff --git a/src/pocketmine/level/particle/EntityFlameParticle.php b/src/pocketmine/level/particle/EntityFlameParticle.php new file mode 100644 index 000000000..37749f09f --- /dev/null +++ b/src/pocketmine/level/particle/EntityFlameParticle.php @@ -0,0 +1,30 @@ +x, $pos->y, $pos->z, 13); + } +} diff --git a/src/pocketmine/level/particle/ExplodeParticle.php b/src/pocketmine/level/particle/ExplodeParticle.php index 7317c5e95..fc8748f8c 100644 --- a/src/pocketmine/level/particle/ExplodeParticle.php +++ b/src/pocketmine/level/particle/ExplodeParticle.php @@ -21,22 +21,10 @@ namespace pocketmine\level\particle; -use pocketmine\network\protocol\ExplodePacket; use pocketmine\math\Vector3; -class ExplodeParticle extends Particle{ - +class ExplodeParticle extends GenericParticle{ public function __construct(Vector3 $pos){ - parent::__construct($pos->x, $pos->y, $pos->z); - } - - public function encode(){ - $pk = new ExplodePacket; - $pk->x = $this->x; - $pk->y = $this->y; - $pk->z = $this->z; - $pk->radius = 0; - - return $pk; + parent::__construct($pos->x, $pos->y, $pos->z, 4); } } diff --git a/src/pocketmine/level/particle/FlameParticle.php b/src/pocketmine/level/particle/FlameParticle.php new file mode 100644 index 000000000..108aa5a77 --- /dev/null +++ b/src/pocketmine/level/particle/FlameParticle.php @@ -0,0 +1,30 @@ +x, $pos->y, $pos->z, 5); + } +} diff --git a/src/pocketmine/level/particle/GenericParticle.php b/src/pocketmine/level/particle/GenericParticle.php new file mode 100644 index 000000000..f0daef681 --- /dev/null +++ b/src/pocketmine/level/particle/GenericParticle.php @@ -0,0 +1,48 @@ +x, $pos->y, $pos->z); + $this->id = $id & 0xFFF; + $this->data = $data; + } + + public function encode(){ + $pk = new LevelEventPacket; + $pk->evid = 0x4000 | $this->id; + $pk->x = $this->x; + $pk->y = $this->y; + $pk->z = $this->z; + $pk->data = $this->data; + + return $pk; + } +} diff --git a/src/pocketmine/level/particle/HeartParticle.php b/src/pocketmine/level/particle/HeartParticle.php index 64a24b58f..79f33978b 100644 --- a/src/pocketmine/level/particle/HeartParticle.php +++ b/src/pocketmine/level/particle/HeartParticle.php @@ -21,43 +21,10 @@ namespace pocketmine\level\particle; -use pocketmine\entity\Entity; -use pocketmine\entity\Wolf; use pocketmine\math\Vector3; -use pocketmine\network\protocol\AddMobPacket; -use pocketmine\network\protocol\EntityEventPacket; -use pocketmine\network\protocol\RemoveEntityPacket; -class HeartParticle extends Particle{ - //TODO: HACK! - //TODO: needs more testing! - - public function __construct(Vector3 $pos){ - parent::__construct($pos->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 - 1; - $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]; +class HeartParticle extends GenericParticle{ + public function __construct(Vector3 $pos, $scale = 0){ + parent::__construct($pos->x, $pos->y, $pos->z, 14, $scale); } } diff --git a/src/pocketmine/level/particle/InkCloudParticle.php b/src/pocketmine/level/particle/InkCloudParticle.php new file mode 100644 index 000000000..61725a7d5 --- /dev/null +++ b/src/pocketmine/level/particle/InkCloudParticle.php @@ -0,0 +1,73 @@ +x, $pos->y, $pos->z); + $this->count = (int) $count; + } + + public function encode(){ + $p = []; + + $entityId = bcadd("1095216660480", mt_rand(0, 0x7fffffff)); //No conflict with other things + $pk = new AddMobPacket(); + $pk->eid = $entityId; + $pk->type = 17; + $pk->x = $this->x; + $pk->y = $this->y - 1; + $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] + ]; + $p[] = $pk; + + for($i = 0; $i < $this->count; ++$i){ + $pk2 = new EntityEventPacket(); + $pk2->eid = $entityId; + $pk2->event = 15; + $p[] = $pk2; + } + + + $pk3 = new RemoveEntityPacket(); + $pk3->eid = $entityId; + $p[] = $pk3; + + return $p; + } +} diff --git a/src/pocketmine/level/particle/InkParticle.php b/src/pocketmine/level/particle/InkParticle.php new file mode 100644 index 000000000..1effda9a7 --- /dev/null +++ b/src/pocketmine/level/particle/InkParticle.php @@ -0,0 +1,30 @@ +x, $pos->y, $pos->z, 25, $scale); + } +} diff --git a/src/pocketmine/level/particle/ItemBreakParticle.php b/src/pocketmine/level/particle/ItemBreakParticle.php new file mode 100644 index 000000000..11108a9df --- /dev/null +++ b/src/pocketmine/level/particle/ItemBreakParticle.php @@ -0,0 +1,31 @@ +x, $pos->y, $pos->z, 9, ($item->getId() << 16) | $item->getDamage()); + } +} diff --git a/src/pocketmine/level/particle/LavaDripParticle.php b/src/pocketmine/level/particle/LavaDripParticle.php new file mode 100644 index 000000000..d95f0a12d --- /dev/null +++ b/src/pocketmine/level/particle/LavaDripParticle.php @@ -0,0 +1,30 @@ +x, $pos->y, $pos->z, 21); + } +} diff --git a/src/pocketmine/level/particle/LavaParticle.php b/src/pocketmine/level/particle/LavaParticle.php new file mode 100644 index 000000000..9ad06b45e --- /dev/null +++ b/src/pocketmine/level/particle/LavaParticle.php @@ -0,0 +1,30 @@ +x, $pos->y, $pos->z, 6); + } +} diff --git a/src/pocketmine/level/particle/MateFailParticle.php b/src/pocketmine/level/particle/MateFailParticle.php new file mode 100644 index 000000000..4c1aa1dd3 --- /dev/null +++ b/src/pocketmine/level/particle/MateFailParticle.php @@ -0,0 +1,73 @@ +x, $pos->y, $pos->z); + $this->count = (int) $count; + } + + public function encode(){ + $p = []; + + $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 - 1; + $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] + ]; + $p[] = $pk; + + for($i = 0; $i < $this->count; ++$i){ + $pk2 = new EntityEventPacket(); + $pk2->eid = $entityId; + $pk2->event = 6; + $p[] = $pk2; + } + + + $pk3 = new RemoveEntityPacket(); + $pk3->eid = $entityId; + $p[] = $pk3; + + return $p; + } +} diff --git a/src/pocketmine/level/particle/MateParticle.php b/src/pocketmine/level/particle/MateParticle.php new file mode 100644 index 000000000..147b9bfec --- /dev/null +++ b/src/pocketmine/level/particle/MateParticle.php @@ -0,0 +1,73 @@ +x, $pos->y, $pos->z); + $this->count = (int) $count; + } + + public function encode(){ + $p = []; + + $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 - 1; + $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] + ]; + $p[] = $pk; + + for($i = 0; $i < $this->count; ++$i){ + $pk2 = new EntityEventPacket(); + $pk2->eid = $entityId; + $pk2->event = 7; + $p[] = $pk2; + } + + + $pk3 = new RemoveEntityPacket(); + $pk3->eid = $entityId; + $p[] = $pk3; + + return $p; + } +} diff --git a/src/pocketmine/level/particle/PortalParticle.php b/src/pocketmine/level/particle/PortalParticle.php new file mode 100644 index 000000000..d1f1706cc --- /dev/null +++ b/src/pocketmine/level/particle/PortalParticle.php @@ -0,0 +1,30 @@ +x, $pos->y, $pos->z, 17); + } +} diff --git a/src/pocketmine/level/particle/RedstoneParticle.php b/src/pocketmine/level/particle/RedstoneParticle.php new file mode 100644 index 000000000..24795bfdc --- /dev/null +++ b/src/pocketmine/level/particle/RedstoneParticle.php @@ -0,0 +1,30 @@ +x, $pos->y, $pos->z, 8, $lifetime); + } +} diff --git a/src/pocketmine/level/particle/SmokeParticle.php b/src/pocketmine/level/particle/SmokeParticle.php new file mode 100644 index 000000000..f98570c55 --- /dev/null +++ b/src/pocketmine/level/particle/SmokeParticle.php @@ -0,0 +1,30 @@ +x, $pos->y, $pos->z, 3, (int) $scale); + } +} diff --git a/src/pocketmine/level/particle/SplashParticle.php b/src/pocketmine/level/particle/SplashParticle.php new file mode 100644 index 000000000..9a9942273 --- /dev/null +++ b/src/pocketmine/level/particle/SplashParticle.php @@ -0,0 +1,30 @@ +x, $pos->y, $pos->z, 18); + } +} diff --git a/src/pocketmine/level/particle/TerrainParticle.php b/src/pocketmine/level/particle/TerrainParticle.php new file mode 100644 index 000000000..3b74c8c67 --- /dev/null +++ b/src/pocketmine/level/particle/TerrainParticle.php @@ -0,0 +1,31 @@ +x, $pos->y, $pos->z, 15, ($b->getId() << 8) | $b->getDamage()); + } +} diff --git a/src/pocketmine/level/particle/WaterDripParticle.php b/src/pocketmine/level/particle/WaterDripParticle.php new file mode 100644 index 000000000..6792114eb --- /dev/null +++ b/src/pocketmine/level/particle/WaterDripParticle.php @@ -0,0 +1,30 @@ +x, $pos->y, $pos->z, 20); + } +} diff --git a/src/pocketmine/level/particle/WaterParticle.php b/src/pocketmine/level/particle/WaterParticle.php new file mode 100644 index 000000000..60b92713a --- /dev/null +++ b/src/pocketmine/level/particle/WaterParticle.php @@ -0,0 +1,30 @@ +x, $pos->y, $pos->z, 19); + } +} diff --git a/src/pocketmine/network/protocol/LevelEventPacket.php b/src/pocketmine/network/protocol/LevelEventPacket.php index d307785f8..1a56943ac 100644 --- a/src/pocketmine/network/protocol/LevelEventPacket.php +++ b/src/pocketmine/network/protocol/LevelEventPacket.php @@ -45,9 +45,9 @@ class LevelEventPacket extends DataPacket{ public function encode(){ $this->reset(); $this->putShort($this->evid); - $this->putInt($this->x); - $this->putByte($this->y); - $this->putInt($this->z); + $this->putFloat($this->x); + $this->putFloat($this->y); + $this->putFloat($this->z); $this->putInt($this->data); }