diff --git a/src/pocketmine/entity/Entity.php b/src/pocketmine/entity/Entity.php index 3e5dba9a7..8b2e2a4bb 100644 --- a/src/pocketmine/entity/Entity.php +++ b/src/pocketmine/entity/Entity.php @@ -34,6 +34,7 @@ use pocketmine\entity\object\Painting; use pocketmine\entity\object\PaintingMotive; use pocketmine\entity\projectile\Arrow; use pocketmine\entity\projectile\Egg; +use pocketmine\entity\projectile\EnderPearl; use pocketmine\entity\projectile\Snowball; use pocketmine\entity\projectile\SplashPotion; use pocketmine\event\entity\EntityDamageEvent; @@ -231,6 +232,7 @@ abstract class Entity extends Location implements Metadatable, EntityIds{ Entity::registerEntity(Arrow::class, false, ['Arrow', 'minecraft:arrow']); Entity::registerEntity(Egg::class, false, ['Egg', 'minecraft:egg']); + Entity::registerEntity(EnderPearl::class, false, ['ThrownEnderpearl', 'minecraft:ender_pearl']); Entity::registerEntity(ExperienceOrb::class, false, ['XPOrb', 'minecraft:xp_orb']); Entity::registerEntity(FallingSand::class, false, ['FallingSand', 'minecraft:falling_block']); Entity::registerEntity(Item::class, false, ['Item', 'minecraft:item']); diff --git a/src/pocketmine/entity/projectile/EnderPearl.php b/src/pocketmine/entity/projectile/EnderPearl.php new file mode 100644 index 000000000..0037e3531 --- /dev/null +++ b/src/pocketmine/entity/projectile/EnderPearl.php @@ -0,0 +1,74 @@ +getId() !== Block::AIR and empty($block->getCollisionBoxes())){ + //TODO: remove this once block collision boxes are fixed properly + $bb = new AxisAlignedBB( + $block->x, + $block->y, + $block->z, + $block->x + 1, + $block->y + 1, + $block->z + 1 + ); + + return $bb->calculateIntercept($start, $end); + } + + return parent::calculateInterceptWithBlock($block, $start, $end); + } + + protected function onHit(ProjectileHitEvent $event) : void{ + $owner = $this->getOwningEntity(); + if($owner !== null){ + //TODO: check end gateways (when they are added) + //TODO: spawn endermites at origin + + $this->level->broadcastLevelEvent($owner, LevelEventPacket::EVENT_PARTICLE_ENDERMAN_TELEPORT); + $this->level->addSound(new EndermanTeleportSound($owner)); + $owner->teleport($event->getRayTraceResult()->getHitVector()); + $this->level->addSound(new EndermanTeleportSound($owner)); + + $owner->attack(new EntityDamageEvent($owner, EntityDamageEvent::CAUSE_FALL, 5)); + } + + parent::onHit($event); + + $this->flagForDespawn(); + } +} diff --git a/src/pocketmine/item/EnderPearl.php b/src/pocketmine/item/EnderPearl.php new file mode 100644 index 000000000..d784913e0 --- /dev/null +++ b/src/pocketmine/item/EnderPearl.php @@ -0,0 +1,42 @@ +