diff --git a/src/item/Egg.php b/src/item/Egg.php index 7d3bece76..2d9391ce2 100644 --- a/src/item/Egg.php +++ b/src/item/Egg.php @@ -23,7 +23,12 @@ declare(strict_types=1); namespace pocketmine\item; +use pocketmine\entity\EntityFactory; +use pocketmine\entity\Location; use pocketmine\entity\projectile\Egg as EggEntity; +use pocketmine\entity\projectile\Throwable; +use pocketmine\math\Vector3; +use pocketmine\player\Player; class Egg extends ProjectileItem{ @@ -31,8 +36,15 @@ class Egg extends ProjectileItem{ return 16; } - public function getProjectileEntityClass() : string{ - return EggEntity::class; + protected function createEntity(EntityFactory $factory, Location $location, Vector3 $velocity, Player $thrower) : Throwable{ + /** @var EggEntity $projectile */ + $projectile = $factory->create( + EggEntity::class, + $location->getWorldNonNull(), + EntityFactory::createBaseNBT($location, $velocity, $location->yaw, $location->pitch), + $thrower + ); + return $projectile; } public function getThrowForce() : float{ diff --git a/src/item/EnderPearl.php b/src/item/EnderPearl.php index 337b30a7f..a61055cc5 100644 --- a/src/item/EnderPearl.php +++ b/src/item/EnderPearl.php @@ -23,7 +23,12 @@ declare(strict_types=1); namespace pocketmine\item; +use pocketmine\entity\EntityFactory; +use pocketmine\entity\Location; use pocketmine\entity\projectile\EnderPearl as EnderPearlEntity; +use pocketmine\entity\projectile\Throwable; +use pocketmine\math\Vector3; +use pocketmine\player\Player; class EnderPearl extends ProjectileItem{ @@ -31,8 +36,15 @@ class EnderPearl extends ProjectileItem{ return 16; } - public function getProjectileEntityClass() : string{ - return EnderPearlEntity::class; + protected function createEntity(EntityFactory $factory, Location $location, Vector3 $velocity, Player $thrower) : Throwable{ + /** @var EnderPearlEntity $projectile */ + $projectile = $factory->create( + EnderPearlEntity::class, + $location->getWorldNonNull(), + EntityFactory::createBaseNBT($location, $velocity, $location->yaw, $location->pitch), + $thrower + ); + return $projectile; } public function getThrowForce() : float{ diff --git a/src/item/ExperienceBottle.php b/src/item/ExperienceBottle.php index 191d932b8..2482e0b0d 100644 --- a/src/item/ExperienceBottle.php +++ b/src/item/ExperienceBottle.php @@ -23,12 +23,24 @@ declare(strict_types=1); namespace pocketmine\item; +use pocketmine\entity\EntityFactory; +use pocketmine\entity\Location; use pocketmine\entity\projectile\ExperienceBottle as ExperienceBottleEntity; +use pocketmine\entity\projectile\Throwable; +use pocketmine\math\Vector3; +use pocketmine\player\Player; class ExperienceBottle extends ProjectileItem{ - public function getProjectileEntityClass() : string{ - return ExperienceBottleEntity::class; + protected function createEntity(EntityFactory $factory, Location $location, Vector3 $velocity, Player $thrower) : Throwable{ + /** @var ExperienceBottleEntity $projectile */ + $projectile = $factory->create( + ExperienceBottleEntity::class, + $location->getWorldNonNull(), + EntityFactory::createBaseNBT($location, $velocity, $location->yaw, $location->pitch), + $thrower + ); + return $projectile; } public function getThrowForce() : float{ diff --git a/src/item/ProjectileItem.php b/src/item/ProjectileItem.php index a881e07ac..305430c5b 100644 --- a/src/item/ProjectileItem.php +++ b/src/item/ProjectileItem.php @@ -24,43 +24,23 @@ declare(strict_types=1); namespace pocketmine\item; use pocketmine\entity\EntityFactory; +use pocketmine\entity\Location; use pocketmine\entity\projectile\Throwable; use pocketmine\event\entity\ProjectileLaunchEvent; use pocketmine\math\Vector3; -use pocketmine\nbt\tag\CompoundTag; use pocketmine\player\Player; -use pocketmine\utils\Utils; use pocketmine\world\sound\ThrowSound; abstract class ProjectileItem extends Item{ - /** - * Returns the entity type that this projectile creates. This should return a ::class extending Throwable. - * - * @return string class extends Throwable - * @phpstan-return class-string - */ - abstract public function getProjectileEntityClass() : string; - abstract public function getThrowForce() : float; - /** - * Helper function to apply extra NBT tags to pass to the created projectile. - */ - protected function addExtraTags(CompoundTag $tag) : void{ - - } + abstract protected function createEntity(EntityFactory $factory, Location $location, Vector3 $velocity, Player $thrower) : Throwable; public function onClickAir(Player $player, Vector3 $directionVector) : ItemUseResult{ $location = $player->getLocation(); - $nbt = EntityFactory::createBaseNBT($player->getEyePos(), $directionVector, $location->yaw, $location->pitch); - $this->addExtraTags($nbt); - $class = $this->getProjectileEntityClass(); - Utils::testValidInstance($class, Throwable::class); - - /** @var Throwable $projectile */ - $projectile = EntityFactory::getInstance()->create($class, $location->getWorldNonNull(), $nbt, $player); + $projectile = $this->createEntity(EntityFactory::getInstance(), Location::fromObject($player->getEyePos(), $player->getWorld(), $location->yaw, $location->pitch), $directionVector, $player); $projectile->setMotion($projectile->getMotion()->multiply($this->getThrowForce())); $projectileEv = new ProjectileLaunchEvent($projectile); diff --git a/src/item/Snowball.php b/src/item/Snowball.php index 8da341c06..da959980a 100644 --- a/src/item/Snowball.php +++ b/src/item/Snowball.php @@ -23,7 +23,12 @@ declare(strict_types=1); namespace pocketmine\item; +use pocketmine\entity\EntityFactory; +use pocketmine\entity\Location; use pocketmine\entity\projectile\Snowball as SnowballEntity; +use pocketmine\entity\projectile\Throwable; +use pocketmine\math\Vector3; +use pocketmine\player\Player; class Snowball extends ProjectileItem{ @@ -31,8 +36,15 @@ class Snowball extends ProjectileItem{ return 16; } - public function getProjectileEntityClass() : string{ - return SnowballEntity::class; + protected function createEntity(EntityFactory $factory, Location $location, Vector3 $velocity, Player $thrower) : Throwable{ + /** @var SnowballEntity $projectile */ + $projectile = $factory->create( + SnowballEntity::class, + $location->getWorldNonNull(), + EntityFactory::createBaseNBT($location, $velocity, $location->yaw, $location->pitch), + $thrower + ); + return $projectile; } public function getThrowForce() : float{ diff --git a/src/item/SplashPotion.php b/src/item/SplashPotion.php index d29f5839b..83748dd74 100644 --- a/src/item/SplashPotion.php +++ b/src/item/SplashPotion.php @@ -23,8 +23,12 @@ declare(strict_types=1); namespace pocketmine\item; +use pocketmine\entity\EntityFactory; +use pocketmine\entity\Location; use pocketmine\entity\projectile\SplashPotion as SplashPotionEntity; -use pocketmine\nbt\tag\CompoundTag; +use pocketmine\entity\projectile\Throwable; +use pocketmine\math\Vector3; +use pocketmine\player\Player; class SplashPotion extends ProjectileItem{ @@ -32,15 +36,20 @@ class SplashPotion extends ProjectileItem{ return 1; } - public function getProjectileEntityClass() : string{ - return SplashPotionEntity::class; + protected function createEntity(EntityFactory $factory, Location $location, Vector3 $velocity, Player $thrower) : Throwable{ + /** @var SplashPotionEntity $projectile */ + $projectile = $factory->create( + SplashPotionEntity::class, + $location->getWorldNonNull(), + EntityFactory::createBaseNBT($location, $velocity, $location->yaw, $location->pitch), + $thrower + ); + + $projectile->setPotionId($this->meta); + return $projectile; } public function getThrowForce() : float{ return 0.5; } - - protected function addExtraTags(CompoundTag $tag) : void{ - $tag->setShort("PotionId", $this->meta); - } }