Skip to content

Add EntityFreezeWaterEvent #6673

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 10 commits into
base: minor-next
Choose a base branch
from
20 changes: 16 additions & 4 deletions src/entity/Living.php
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
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;
Expand Down Expand Up @@ -721,19 +722,30 @@ protected function applyFrostWalker(int $level) : void{
$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);
}
}
}
Expand Down
84 changes: 84 additions & 0 deletions src/event/entity/EntityFrostWalkerEvent.php
Original file line number Diff line number Diff line change
@@ -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;
}
}