Merge 'minor-next' into 'major-next'

Automatic merge performed by: https://github.com/pmmp/RestrictedActions/actions/runs/15243296100
This commit is contained in:
pmmp-admin-bot[bot] 2025-05-26 00:02:56 +00:00
commit dca2665e17
3 changed files with 112 additions and 6 deletions

View File

@ -1191,12 +1191,14 @@ abstract class Entity{
$moveBB->offset(0, 0, $dz); $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; $cx = $dx;
$cy = $dy; $cy = $dy;
$cz = $dz; $cz = $dz;
$dx = $wantedX; $dx = $wantedX;
$dy = $this->stepHeight; $dy = $stepHeight;
$dz = $wantedZ; $dz = $wantedZ;
$stepBB = clone $this->boundingBox; $stepBB = clone $this->boundingBox;
@ -1266,6 +1268,14 @@ abstract class Entity{
Timings::$entityMove->stopTiming(); 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{ protected function checkGroundState(float $wantedX, float $wantedY, float $wantedZ, float $dx, float $dy, float $dz) : void{
$this->isCollidedVertically = $wantedY !== $dy; $this->isCollidedVertically = $wantedY !== $dy;
$this->isCollidedHorizontally = ($wantedX !== $dx || $wantedZ !== $dz); $this->isCollidedHorizontally = ($wantedX !== $dx || $wantedZ !== $dz);

View File

@ -38,6 +38,7 @@ use pocketmine\event\entity\EntityDamageByChildEntityEvent;
use pocketmine\event\entity\EntityDamageByEntityEvent; use pocketmine\event\entity\EntityDamageByEntityEvent;
use pocketmine\event\entity\EntityDamageEvent; use pocketmine\event\entity\EntityDamageEvent;
use pocketmine\event\entity\EntityDeathEvent; use pocketmine\event\entity\EntityDeathEvent;
use pocketmine\event\entity\EntityFrostWalkerEvent;
use pocketmine\inventory\ArmorInventory; use pocketmine\inventory\ArmorInventory;
use pocketmine\inventory\CallbackInventoryListener; use pocketmine\inventory\CallbackInventoryListener;
use pocketmine\inventory\Inventory; use pocketmine\inventory\Inventory;
@ -721,19 +722,30 @@ abstract class Living extends Entity{
$y = $this->location->getFloorY() - 1; $y = $this->location->getFloorY() - 1;
$baseZ = $this->location->getFloorZ(); $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($x = $baseX - $radius; $x <= $baseX + $radius; $x++){
for($z = $baseZ - $radius; $z <= $baseZ + $radius; $z++){ for($z = $baseZ - $radius; $z <= $baseZ + $radius; $z++){
$block = $world->getBlockAt($x, $y, $z); $block = $world->getBlockAt($x, $y, $z);
if( if(
!$block instanceof Water || !$block->isSameState($liquid) ||
!$block->isSource() ||
$world->getBlockAt($x, $y + 1, $z)->getTypeId() !== BlockTypeIds::AIR || $world->getBlockAt($x, $y + 1, $z)->getTypeId() !== BlockTypeIds::AIR ||
count($world->getNearbyEntities(AxisAlignedBB::one()->offset($x, $y, $z))) !== 0 count($world->getNearbyEntities(AxisAlignedBB::one()->offset($x, $y, $z))) !== 0
){ ){
continue; continue;
} }
$world->setBlockAt($x, $y, $z, $frostedIce); $world->setBlockAt($x, $y, $z, $targetBlock);
} }
} }
} }

View File

@ -0,0 +1,84 @@
<?php
/*
*
* ____ _ _ __ __ _ __ __ ____
* | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
* | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
* | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
* |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* @author PocketMine Team
* @link http://www.pocketmine.net/
*
*
*/
declare(strict_types=1);
namespace pocketmine\event\entity;
use pocketmine\block\Block;
use pocketmine\block\Liquid;
use pocketmine\entity\Living;
use pocketmine\event\Cancellable;
use pocketmine\event\CancellableTrait;
/**
* Called when an entity moves horizontally while wearing boots enchanted with Frost Walker.
*
* @phpstan-extends EntityEvent<Living>
*/
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;
}
}