From eee2e62d81b6aeec02e668b2f36680bffdf39af7 Mon Sep 17 00:00:00 2001 From: zSALLAZAR <59490940+zSALLAZAR@users.noreply.github.com> Date: Sun, 25 May 2025 10:01:46 +0200 Subject: [PATCH 1/4] Add EntityFrostWalkerEvent (#6673) --- src/entity/Living.php | 20 ++++- src/event/entity/EntityFrostWalkerEvent.php | 84 +++++++++++++++++++++ 2 files changed, 100 insertions(+), 4 deletions(-) create mode 100644 src/event/entity/EntityFrostWalkerEvent.php diff --git a/src/entity/Living.php b/src/entity/Living.php index 852344784a..6d62c85d25 100644 --- a/src/entity/Living.php +++ b/src/entity/Living.php @@ -38,6 +38,7 @@ use pocketmine\event\entity\EntityDamageByChildEntityEvent; use pocketmine\event\entity\EntityDamageByEntityEvent; use pocketmine\event\entity\EntityDamageEvent; use pocketmine\event\entity\EntityDeathEvent; +use pocketmine\event\entity\EntityFrostWalkerEvent; use pocketmine\inventory\ArmorInventory; use pocketmine\inventory\CallbackInventoryListener; use pocketmine\inventory\Inventory; @@ -721,19 +722,30 @@ abstract class Living extends Entity{ $y = $this->location->getFloorY() - 1; $baseZ = $this->location->getFloorZ(); - $frostedIce = VanillaBlocks::FROSTED_ICE(); + $liquid = VanillaBlocks::WATER(); + $targetBlock = VanillaBlocks::FROSTED_ICE(); + if(EntityFrostWalkerEvent::hasHandlers()){ + $ev = new EntityFrostWalkerEvent($this, $radius, $liquid, $targetBlock); + $ev->call(); + if($ev->isCancelled()){ + return; + } + $radius = $ev->getRadius(); + $liquid = $ev->getLiquid(); + $targetBlock = $ev->getTargetBlock(); + } + for($x = $baseX - $radius; $x <= $baseX + $radius; $x++){ for($z = $baseZ - $radius; $z <= $baseZ + $radius; $z++){ $block = $world->getBlockAt($x, $y, $z); if( - !$block instanceof Water || - !$block->isSource() || + !$block->isSameState($liquid) || $world->getBlockAt($x, $y + 1, $z)->getTypeId() !== BlockTypeIds::AIR || count($world->getNearbyEntities(AxisAlignedBB::one()->offset($x, $y, $z))) !== 0 ){ continue; } - $world->setBlockAt($x, $y, $z, $frostedIce); + $world->setBlockAt($x, $y, $z, $targetBlock); } } } diff --git a/src/event/entity/EntityFrostWalkerEvent.php b/src/event/entity/EntityFrostWalkerEvent.php new file mode 100644 index 0000000000..15ba282681 --- /dev/null +++ b/src/event/entity/EntityFrostWalkerEvent.php @@ -0,0 +1,84 @@ + + */ +class EntityFrostWalkerEvent extends EntityEvent implements Cancellable{ + use CancellableTrait; + + public function __construct( + Living $entity, + private int $radius, + private Liquid $liquid, + private Block $targetBlock + ){ + $this->entity = $entity; + } + + public function getRadius() : int{ + return $this->radius; + } + + public function setRadius(int $radius) : void{ + $this->radius = $radius; + } + + /** + * Returns the liquid that gets frozen + */ + public function getLiquid() : Liquid{ + return $this->liquid; + } + + /** + * Sets the liquid that gets frozen + */ + public function setLiquid(Liquid $liquid) : void{ + $this->liquid = $liquid; + } + + /** + * Returns the block that replaces the liquid + */ + public function getTargetBlock() : Block{ + return $this->targetBlock; + } + + /** + * Sets the block that replaces the liquid + */ + public function setTargetBlock(Block $targetBlock) : void{ + $this->targetBlock = $targetBlock; + } +} From 5527a0c6bf4343b39cd6ed4526f75539ac6ddf19 Mon Sep 17 00:00:00 2001 From: ItzxDwi <107537435+ItzxDwi@users.noreply.github.com> Date: Sun, 25 May 2025 16:07:41 +0800 Subject: [PATCH 2/4] Entity: make stepHeight accessable (#6702) --- src/entity/Entity.php | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/entity/Entity.php b/src/entity/Entity.php index 6681558ada..eb7098f1e7 100644 --- a/src/entity/Entity.php +++ b/src/entity/Entity.php @@ -1187,12 +1187,14 @@ abstract class Entity{ $moveBB->offset(0, 0, $dz); - if($this->stepHeight > 0 && $fallingFlag && ($wantedX !== $dx || $wantedZ !== $dz)){ + $stepHeight = $this->getStepHeight(); + + if($stepHeight > 0 && $fallingFlag && ($wantedX !== $dx || $wantedZ !== $dz)){ $cx = $dx; $cy = $dy; $cz = $dz; $dx = $wantedX; - $dy = $this->stepHeight; + $dy = $stepHeight; $dz = $wantedZ; $stepBB = clone $this->boundingBox; @@ -1262,6 +1264,14 @@ abstract class Entity{ Timings::$entityMove->stopTiming(); } + public function setStepHeight(float $stepHeight) : void{ + $this->stepHeight = $stepHeight; + } + + public function getStepHeight() : float{ + return $this->stepHeight; + } + protected function checkGroundState(float $wantedX, float $wantedY, float $wantedZ, float $dx, float $dy, float $dz) : void{ $this->isCollidedVertically = $wantedY !== $dy; $this->isCollidedHorizontally = ($wantedX !== $dx || $wantedZ !== $dz); From a554d2acf5db00f577493517e36bb3ad07a6bdd0 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 25 May 2025 11:32:20 +0100 Subject: [PATCH 3/4] Revert change that can't go on stable API additions need to wait for the next minor release Revert "Entity: make stepHeight accessable (#6702)" This reverts commit 5527a0c6bf4343b39cd6ed4526f75539ac6ddf19. --- src/entity/Entity.php | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/src/entity/Entity.php b/src/entity/Entity.php index eb7098f1e7..6681558ada 100644 --- a/src/entity/Entity.php +++ b/src/entity/Entity.php @@ -1187,14 +1187,12 @@ abstract class Entity{ $moveBB->offset(0, 0, $dz); - $stepHeight = $this->getStepHeight(); - - if($stepHeight > 0 && $fallingFlag && ($wantedX !== $dx || $wantedZ !== $dz)){ + if($this->stepHeight > 0 && $fallingFlag && ($wantedX !== $dx || $wantedZ !== $dz)){ $cx = $dx; $cy = $dy; $cz = $dz; $dx = $wantedX; - $dy = $stepHeight; + $dy = $this->stepHeight; $dz = $wantedZ; $stepBB = clone $this->boundingBox; @@ -1264,14 +1262,6 @@ abstract class Entity{ Timings::$entityMove->stopTiming(); } - public function setStepHeight(float $stepHeight) : void{ - $this->stepHeight = $stepHeight; - } - - public function getStepHeight() : float{ - return $this->stepHeight; - } - protected function checkGroundState(float $wantedX, float $wantedY, float $wantedZ, float $dx, float $dy, float $dz) : void{ $this->isCollidedVertically = $wantedY !== $dy; $this->isCollidedHorizontally = ($wantedX !== $dx || $wantedZ !== $dz); From dd17adeaaf96745ff78dd39107adc9f9f9a43c6d Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Sun, 25 May 2025 11:33:47 +0100 Subject: [PATCH 4/4] Reintroduce step height additions for minor-next Revert "Revert change that can't go on stable" This reverts commit a554d2acf5db00f577493517e36bb3ad07a6bdd0. --- src/entity/Entity.php | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/entity/Entity.php b/src/entity/Entity.php index d73356df86..73a0b3a9c7 100644 --- a/src/entity/Entity.php +++ b/src/entity/Entity.php @@ -1191,12 +1191,14 @@ abstract class Entity{ $moveBB->offset(0, 0, $dz); - if($this->stepHeight > 0 && $fallingFlag && ($wantedX !== $dx || $wantedZ !== $dz)){ + $stepHeight = $this->getStepHeight(); + + if($stepHeight > 0 && $fallingFlag && ($wantedX !== $dx || $wantedZ !== $dz)){ $cx = $dx; $cy = $dy; $cz = $dz; $dx = $wantedX; - $dy = $this->stepHeight; + $dy = $stepHeight; $dz = $wantedZ; $stepBB = clone $this->boundingBox; @@ -1266,6 +1268,14 @@ abstract class Entity{ Timings::$entityMove->stopTiming(); } + public function setStepHeight(float $stepHeight) : void{ + $this->stepHeight = $stepHeight; + } + + public function getStepHeight() : float{ + return $this->stepHeight; + } + protected function checkGroundState(float $wantedX, float $wantedY, float $wantedZ, float $dx, float $dy, float $dz) : void{ $this->isCollidedVertically = $wantedY !== $dy; $this->isCollidedHorizontally = ($wantedX !== $dx || $wantedZ !== $dz);