mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-06-15 16:05:28 +00:00
StructureGrowEvent: added API to get the player who caused the growth (#4445)
This commit is contained in:
parent
ccc881ee58
commit
09715906c8
@ -145,12 +145,12 @@ class Bamboo extends Transparent{
|
|||||||
public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{
|
public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{
|
||||||
if($item instanceof Fertilizer){
|
if($item instanceof Fertilizer){
|
||||||
$top = $this->seekToTop();
|
$top = $this->seekToTop();
|
||||||
if($top->grow(self::getMaxHeight($top->position->getFloorX(), $top->position->getFloorZ()), mt_rand(1, 2))){
|
if($top->grow(self::getMaxHeight($top->position->getFloorX(), $top->position->getFloorZ()), mt_rand(1, 2), $player)){
|
||||||
$item->pop();
|
$item->pop();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}elseif($item instanceof ItemBamboo){
|
}elseif($item instanceof ItemBamboo){
|
||||||
if($this->seekToTop()->grow(PHP_INT_MAX, 1)){
|
if($this->seekToTop()->grow(PHP_INT_MAX, 1, $player)){
|
||||||
$item->pop();
|
$item->pop();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -165,7 +165,7 @@ class Bamboo extends Transparent{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private function grow(int $maxHeight, int $growAmount) : bool{
|
private function grow(int $maxHeight, int $growAmount, ?Player $player) : bool{
|
||||||
$world = $this->position->getWorld();
|
$world = $this->position->getWorld();
|
||||||
if(!$world->getBlock($this->position->up())->canBeReplaced()){
|
if(!$world->getBlock($this->position->up())->canBeReplaced()){
|
||||||
return false;
|
return false;
|
||||||
@ -212,7 +212,7 @@ class Bamboo extends Transparent{
|
|||||||
$tx->addBlock($this->position->subtract(0, $idx - $growAmount, 0), $newBlock);
|
$tx->addBlock($this->position->subtract(0, $idx - $growAmount, 0), $newBlock);
|
||||||
}
|
}
|
||||||
|
|
||||||
$ev = new StructureGrowEvent($this, $tx);
|
$ev = new StructureGrowEvent($this, $tx, $player);
|
||||||
$ev->call();
|
$ev->call();
|
||||||
if($ev->isCancelled()){
|
if($ev->isCancelled()){
|
||||||
return false;
|
return false;
|
||||||
@ -229,7 +229,7 @@ class Bamboo extends Transparent{
|
|||||||
$world = $this->position->getWorld();
|
$world = $this->position->getWorld();
|
||||||
if($this->ready){
|
if($this->ready){
|
||||||
$this->ready = false;
|
$this->ready = false;
|
||||||
if($world->getFullLight($this->position) < 9 || !$this->grow(self::getMaxHeight($this->position->getFloorX(), $this->position->getFloorZ()), 1)){
|
if($world->getFullLight($this->position) < 9 || !$this->grow(self::getMaxHeight($this->position->getFloorX(), $this->position->getFloorZ()), 1, null)){
|
||||||
$world->setBlock($this->position, $this);
|
$world->setBlock($this->position, $this);
|
||||||
}
|
}
|
||||||
}elseif($world->getBlock($this->position->up())->canBeReplaced()){
|
}elseif($world->getBlock($this->position->up())->canBeReplaced()){
|
||||||
|
@ -73,7 +73,7 @@ final class BambooSapling extends Flowable{
|
|||||||
|
|
||||||
public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{
|
public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{
|
||||||
if($item instanceof Fertilizer || $item instanceof ItemBamboo){
|
if($item instanceof Fertilizer || $item instanceof ItemBamboo){
|
||||||
if($this->grow()){
|
if($this->grow($player)){
|
||||||
$item->pop();
|
$item->pop();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -87,7 +87,7 @@ final class BambooSapling extends Flowable{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private function grow() : bool{
|
private function grow(?Player $player) : bool{
|
||||||
$world = $this->position->getWorld();
|
$world = $this->position->getWorld();
|
||||||
if(!$world->getBlock($this->position->up())->canBeReplaced()){
|
if(!$world->getBlock($this->position->up())->canBeReplaced()){
|
||||||
return false;
|
return false;
|
||||||
@ -98,7 +98,7 @@ final class BambooSapling extends Flowable{
|
|||||||
$tx->addBlock($this->position, $bamboo)
|
$tx->addBlock($this->position, $bamboo)
|
||||||
->addBlock($this->position->up(), (clone $bamboo)->setLeafSize(Bamboo::SMALL_LEAVES));
|
->addBlock($this->position->up(), (clone $bamboo)->setLeafSize(Bamboo::SMALL_LEAVES));
|
||||||
|
|
||||||
$ev = new StructureGrowEvent($this, $tx);
|
$ev = new StructureGrowEvent($this, $tx, $player);
|
||||||
$ev->call();
|
$ev->call();
|
||||||
if($ev->isCancelled()){
|
if($ev->isCancelled()){
|
||||||
return false;
|
return false;
|
||||||
@ -115,7 +115,7 @@ final class BambooSapling extends Flowable{
|
|||||||
$world = $this->position->getWorld();
|
$world = $this->position->getWorld();
|
||||||
if($this->ready){
|
if($this->ready){
|
||||||
$this->ready = false;
|
$this->ready = false;
|
||||||
if($world->getFullLight($this->position) < 9 || !$this->grow()){
|
if($world->getFullLight($this->position) < 9 || !$this->grow(null)){
|
||||||
$world->setBlock($this->position, $this);
|
$world->setBlock($this->position, $this);
|
||||||
}
|
}
|
||||||
}elseif($world->getBlock($this->position->up())->canBeReplaced()){
|
}elseif($world->getBlock($this->position->up())->canBeReplaced()){
|
||||||
|
@ -77,7 +77,7 @@ class Sapling extends Flowable{
|
|||||||
|
|
||||||
public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{
|
public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{
|
||||||
if($item instanceof Fertilizer){
|
if($item instanceof Fertilizer){
|
||||||
$this->grow();
|
$this->grow($player);
|
||||||
|
|
||||||
$item->pop();
|
$item->pop();
|
||||||
|
|
||||||
@ -100,7 +100,7 @@ class Sapling extends Flowable{
|
|||||||
public function onRandomTick() : void{
|
public function onRandomTick() : void{
|
||||||
if($this->position->getWorld()->getFullLightAt($this->position->getFloorX(), $this->position->getFloorY(), $this->position->getFloorZ()) >= 8 and mt_rand(1, 7) === 1){
|
if($this->position->getWorld()->getFullLightAt($this->position->getFloorX(), $this->position->getFloorY(), $this->position->getFloorZ()) >= 8 and mt_rand(1, 7) === 1){
|
||||||
if($this->ready){
|
if($this->ready){
|
||||||
$this->grow();
|
$this->grow(null);
|
||||||
}else{
|
}else{
|
||||||
$this->ready = true;
|
$this->ready = true;
|
||||||
$this->position->getWorld()->setBlock($this->position, $this);
|
$this->position->getWorld()->setBlock($this->position, $this);
|
||||||
@ -108,7 +108,7 @@ class Sapling extends Flowable{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private function grow() : void{
|
private function grow(?Player $player) : void{
|
||||||
$random = new Random(mt_rand());
|
$random = new Random(mt_rand());
|
||||||
$tree = TreeFactory::get($random, $this->treeType);
|
$tree = TreeFactory::get($random, $this->treeType);
|
||||||
$transaction = $tree?->getBlockTransaction($this->position->getWorld(), $this->position->getFloorX(), $this->position->getFloorY(), $this->position->getFloorZ(), $random);
|
$transaction = $tree?->getBlockTransaction($this->position->getWorld(), $this->position->getFloorX(), $this->position->getFloorY(), $this->position->getFloorZ(), $random);
|
||||||
@ -116,7 +116,7 @@ class Sapling extends Flowable{
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$ev = new StructureGrowEvent($this, $transaction);
|
$ev = new StructureGrowEvent($this, $transaction, $player);
|
||||||
$ev->call();
|
$ev->call();
|
||||||
if($ev->isCancelled()){
|
if($ev->isCancelled()){
|
||||||
return;
|
return;
|
||||||
|
@ -7,6 +7,7 @@ namespace pocketmine\event\block;
|
|||||||
use pocketmine\block\Block;
|
use pocketmine\block\Block;
|
||||||
use pocketmine\event\Cancellable;
|
use pocketmine\event\Cancellable;
|
||||||
use pocketmine\event\CancellableTrait;
|
use pocketmine\event\CancellableTrait;
|
||||||
|
use pocketmine\player\Player;
|
||||||
use pocketmine\world\BlockTransaction;
|
use pocketmine\world\BlockTransaction;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -17,13 +18,23 @@ class StructureGrowEvent extends BlockEvent implements Cancellable{
|
|||||||
use CancellableTrait;
|
use CancellableTrait;
|
||||||
|
|
||||||
private BlockTransaction $transaction;
|
private BlockTransaction $transaction;
|
||||||
|
private ?Player $player;
|
||||||
|
|
||||||
public function __construct(Block $block, BlockTransaction $transaction){
|
public function __construct(Block $block, BlockTransaction $transaction, ?Player $player){
|
||||||
parent::__construct($block);
|
parent::__construct($block);
|
||||||
$this->transaction = $transaction;
|
$this->transaction = $transaction;
|
||||||
|
$this->player = $player;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getTransaction() : BlockTransaction{
|
public function getTransaction() : BlockTransaction{
|
||||||
return $this->transaction;
|
return $this->transaction;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* It returns the player which grows the structure.
|
||||||
|
* It returns null when the structure grows by itself.
|
||||||
|
*/
|
||||||
|
public function getPlayer() : ?Player{
|
||||||
|
return $this->player;
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user