diff --git a/plugin.yml b/plugin.yml new file mode 100755 index 0000000..7536a70 --- /dev/null +++ b/plugin.yml @@ -0,0 +1,7 @@ +name: BowFix +main: ARTulloss\BowFix\BowFix +api: [3.0.0] +version: 1.0.0 +author: ARTulloss +website: github.com/artulloss +description: Bow patch \ No newline at end of file diff --git a/src/.DS_Store b/src/.DS_Store new file mode 100644 index 0000000..c8e8130 Binary files /dev/null and b/src/.DS_Store differ diff --git a/src/ARTulloss/.DS_Store b/src/ARTulloss/.DS_Store new file mode 100644 index 0000000..b7db2ac Binary files /dev/null and b/src/ARTulloss/.DS_Store differ diff --git a/src/ARTulloss/BowFix/.DS_Store b/src/ARTulloss/BowFix/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/src/ARTulloss/BowFix/.DS_Store differ diff --git a/src/ARTulloss/BowFix/BowFix.php b/src/ARTulloss/BowFix/BowFix.php new file mode 100755 index 0000000..0cca369 --- /dev/null +++ b/src/ARTulloss/BowFix/BowFix.php @@ -0,0 +1,21 @@ +isSurvival() and !$player->getInventory()->contains(ItemFactory::get(Item::ARROW, 0, 1))){ + $player->getInventory()->sendContents($player); + return false; + } + $nbt = Entity::createBaseNBT( + $player->add(0, $player->getEyeHeight(), 0), + $player->getDirectionVector(), + ($player->yaw > 180 ? 360 : 0) - $player->yaw, + -$player->pitch + ); + $nbt->setShort("Fire", $player->isOnFire() ? 45 * 60 : 0); + $diff = $player->getItemUseDuration(); + $p = $diff / 20; + $baseForce = min((($p ** 2) + $p * 2) / 3, 1); + $entity = Entity::createEntity("Arrow", $player->getLevel(), $nbt, $player, $baseForce >= 1); + if($entity instanceof Projectile){ + $infinity = $this->hasEnchantment(Enchantment::INFINITY); + 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)); + } + if($this->hasEnchantment(Enchantment::FLAME)){ + $entity->setOnFire(intdiv($entity->getFireTicks(), 20) + 100); + } + $ev = new EntityShootBowEvent($player, $this, $entity, $baseForce * 3); + if($baseForce < 0.1 or $diff < 5){ + $ev->setCancelled(); + } + $ev->call(); + $entity = $ev->getProjectile(); //This might have been changed by plugins + if($ev->isCancelled()){ + $entity->flagForDespawn(); + $player->getInventory()->sendContents($player); + }else{ + $entity->setMotion($entity->getMotion()->multiply($ev->getForce())); + if($player->isSurvival()){ + if(!$infinity){ //TODO: tipped arrows are still consumed when Infinity is applied + $player->getInventory()->removeItem(ItemFactory::get(Item::ARROW, 0, 1)); + } + $this->applyDamage(1); + } + if($entity instanceof Projectile){ + $projectileEv = new ProjectileLaunchEvent($entity); + $projectileEv->call(); + if($projectileEv->isCancelled()){ + $ev->getProjectile()->flagForDespawn(); + }else{ + $ev->getProjectile()->spawnToAll(); + $player->getLevel()->broadcastLevelSoundEvent($player, LevelSoundEventPacket::SOUND_BOW); + } + }else{ + $entity->spawnToAll(); + } + } + }else{ + $entity->spawnToAll(); + } + return true; + } +} \ No newline at end of file