From 97c267c70cc2e5df25a147482b36e8825250b4c6 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sat, 23 Jun 2018 17:40:01 +0100 Subject: [PATCH] Implemented Punch enchantment --- src/pocketmine/entity/projectile/Arrow.php | 28 +++++++++++++++++++ src/pocketmine/item/Bow.php | 9 ++++-- .../item/enchantment/Enchantment.php | 2 +- 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/src/pocketmine/entity/projectile/Arrow.php b/src/pocketmine/entity/projectile/Arrow.php index 5842149a96..3db4e26a50 100644 --- a/src/pocketmine/entity/projectile/Arrow.php +++ b/src/pocketmine/entity/projectile/Arrow.php @@ -31,6 +31,7 @@ use pocketmine\item\Item; use pocketmine\item\ItemFactory; use pocketmine\level\Level; use pocketmine\math\RayTraceResult; +use pocketmine\math\Vector3; use pocketmine\nbt\tag\CompoundTag; use pocketmine\network\mcpe\protocol\EntityEventPacket; use pocketmine\network\mcpe\protocol\LevelSoundEventPacket; @@ -58,6 +59,9 @@ class Arrow extends Projectile{ /** @var int */ protected $pickupMode = self::PICKUP_ANY; + /** @var float */ + protected $punchKnockback = 0.0; + public function __construct(Level $level, CompoundTag $nbt, ?Entity $shootingEntity = null, bool $critical = false){ parent::__construct($level, $nbt, $shootingEntity); $this->setCritical($critical); @@ -92,6 +96,20 @@ class Arrow extends Projectile{ } } + /** + * @return float + */ + public function getPunchKnockback() : float{ + return $this->punchKnockback; + } + + /** + * @param float $punchKnockback + */ + public function setPunchKnockback(float $punchKnockback) : void{ + $this->punchKnockback = $punchKnockback; + } + public function entityBaseTick(int $tickDiff = 1) : bool{ if($this->closed){ return false; @@ -117,6 +135,16 @@ class Arrow extends Projectile{ $this->broadcastEntityEvent(EntityEventPacket::ARROW_SHAKE, 7); //7 ticks } + protected function onHitEntity(Entity $entityHit, RayTraceResult $hitResult) : void{ + parent::onHitEntity($entityHit, $hitResult); + if($this->punchKnockback > 0){ + $mot = $entityHit->getMotion(); + $multiplier = $this->punchKnockback * 0.6 / $mot->length(); + + $entityHit->setMotion($mot->add($mot->x * $multiplier, 0.1, $mot->z * $multiplier)); + } + } + /** * @return int */ diff --git a/src/pocketmine/item/Bow.php b/src/pocketmine/item/Bow.php index fb0c382043..3e785c71d7 100644 --- a/src/pocketmine/item/Bow.php +++ b/src/pocketmine/item/Bow.php @@ -67,8 +67,13 @@ class Bow extends Tool{ $entity = Entity::createEntity("Arrow", $player->getLevel(), $nbt, $player, $force == 2); if($entity instanceof Projectile){ $infinity = $this->hasEnchantment(Enchantment::INFINITY); - if($infinity and $entity instanceof ArrowEntity){ - $entity->setPickupMode(ArrowEntity::PICKUP_CREATIVE); + if($entity instanceof ArrowEntity){ + if($infinity){ + $entity->setPickupMode(ArrowEntity::PICKUP_CREATIVE); + } + if(($punchLevel = $this->getEnchantmentLevel(Enchantment::PUNCH)) > 0){ + $entity->setPunchKnockback($punchLevel); + } } if(($powerLevel = $this->getEnchantmentLevel(Enchantment::POWER)) > 0){ $entity->setBaseDamage($entity->getBaseDamage() + (($powerLevel + 1) / 2)); diff --git a/src/pocketmine/item/enchantment/Enchantment.php b/src/pocketmine/item/enchantment/Enchantment.php index f92937a79f..9b4e7f461f 100644 --- a/src/pocketmine/item/enchantment/Enchantment.php +++ b/src/pocketmine/item/enchantment/Enchantment.php @@ -122,7 +122,7 @@ class Enchantment{ self::registerEnchantment(new Enchantment(self::UNBREAKING, "%enchantment.durability", self::RARITY_UNCOMMON, self::SLOT_DIG | self::SLOT_ARMOR | self::SLOT_FISHING_ROD | self::SLOT_BOW, self::SLOT_TOOL | self::SLOT_CARROT_STICK | self::SLOT_ELYTRA, 3)); self::registerEnchantment(new Enchantment(self::POWER, "%enchantment.arrowDamage", self::RARITY_COMMON, self::SLOT_BOW, self::SLOT_NONE, 5)); - + self::registerEnchantment(new Enchantment(self::PUNCH, "%enchantment.arrowKnockback", self::RARITY_RARE, self::SLOT_BOW, self::SLOT_NONE, 2)); self::registerEnchantment(new Enchantment(self::FLAME, "%enchantment.arrowFire", self::RARITY_RARE, self::SLOT_BOW, self::SLOT_NONE, 1)); self::registerEnchantment(new Enchantment(self::INFINITY, "%enchantment.arrowInfinite", self::RARITY_MYTHIC, self::SLOT_BOW, self::SLOT_NONE, 1));