Advertisement
Guest User

Untitled

a guest
Dec 15th, 2019
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.48 KB | None | 0 0
  1. class BetterEnderPearl extends EPearl
  2. {
  3. public $level;
  4.  
  5.  
  6. /**
  7. * BetterEnderPearl constructor.
  8. * @param Level $level
  9. * @param CompoundTag $nbt
  10. * @param Entity|null $shootingEntity
  11. */
  12. public function __construct(Level $level, CompoundTag $nbt, Entity $shootingEntity = null)
  13. {
  14. parent::__construct($level, $nbt, $shootingEntity);
  15. $this->level = $level;
  16. }
  17.  
  18. protected function calculateInterceptWithBlock(Block $block, Vector3 $start, Vector3 $end) : ?RayTraceResult{ //Editing this to make the bounding box smaller so you can pearl through Gates/slabs
  19. if($block->getId() !== Block::AIR and empty($block->getCollisionBoxes())){
  20. $bb = new AxisAlignedBB(
  21. $block->x,
  22. $block->y,
  23. $block->z,
  24. $block->x + 0.2,
  25. $block->y + 0.2,
  26. $block->z + 0.2
  27. );
  28. return $bb->calculateIntercept($start, $end);
  29. }
  30. return parent::calculateInterceptWithBlock($block, $start, $end);
  31. }
  32.  
  33.  
  34. private function generateTestingZombie(Vector3 $pos): Entity
  35. {
  36. $nbt = Entity::createBaseNBT($pos);
  37. $zombie = new Zombie($this->level, $nbt);
  38. return $zombie;
  39. }
  40.  
  41. private function isInsideOfBlock(Entity $entity)
  42. {
  43. $block = $entity->level->getBlockAt((int)floor($entity->x), (int)floor($y = ($entity->y + $entity->getEyeHeight())), (int)floor($entity->z));
  44.  
  45. return $block->isSolid() and $block->collidesWithBB($entity->getBoundingBox());
  46. }
  47.  
  48.  
  49. protected function onHit(ProjectileHitEvent $event) : void
  50. {
  51. $result = $event->getRayTraceResult();
  52. $owner = $this->getOwningEntity();
  53. $facing = $result->getHitFace();
  54. $hit = $result->getHitVector();
  55. if ($event instanceof ProjectileHitBlockEvent) {
  56. $pos = $event->getBlockHit();
  57. } elseif ($event instanceof ProjectileHitEntityEventct) {
  58. $pos = $event->getEntityHit();
  59. } else $hit = null;
  60. if (!$owner instanceof Player|| $hit === null) {
  61. return;
  62. }
  63. $distance = sqrt((($owner->x - $hit->x) ** 2) + ((($owner->y + 1) - $hit->y) ** 2) + (($owner->z - $hit->z) ** 2));
  64. if (!$hit instanceof Air and $distance < 2.25 and $facing !== 1) {
  65. $owner->sendMessage(TextFormat::RED . "You cannot pearl inside this block");
  66. $owner->getInventory()->addItem(Item::get(Item::ENDER_PEARL, 0, 1));
  67. // reset cooldown
  68. return;
  69. }
  70. if($facing === 2) $pos = $pos->subtract(0, 0, 0.2);
  71. if($facing === 4) $pos = $pos->subtract(0.2);
  72. $zombie = $this->generateTestingZombie($pos);
  73. if($this->isInsideOfBlock($zombie) && $hit instanceof Block){
  74. $zombie->flagForDespawn();
  75. $owner->sendMessage(TextFormat::RED . "You cannot pearl inside this block");
  76. $owner->getInventory()->addItem(Item::get(Item::ENDER_PEARL, 0, 1));
  77. // reset cooldown
  78. return;
  79. }
  80. $zombie->flagForDespawn();
  81. $this->level->broadcastLevelEvent($owner, LevelEventPacket::EVENT_PARTICLE_ENDERMAN_TELEPORT);
  82. $this->level->addSound(new EndermanTeleportSound($owner));
  83. $owner->teleport($pos);
  84. $this->level->addSound(new EndermanTeleportSound($owner));
  85. $owner->attack(new EntityDamageEvent($owner, EntityDamageEvent::CAUSE_FALL, 2));
  86. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement