40 use MultiAnySupportTrait;
55 return SupportType::NONE;
66 return $blockReplace instanceof
GlowLichen ? $blockReplace->faces : [];
69 private function getSpreadBlock(
Block $replace,
int $spreadFace) : ?
Block{
70 if($replace instanceof self && $replace->hasSameTypeId($this)){
71 if($replace->hasFace($spreadFace)){
75 }elseif($replace->getTypeId() === BlockTypeIds::AIR){
76 $result = VanillaBlocks::GLOW_LICHEN();
81 return $result->setFace($spreadFace,
true);
84 private function spread(World $world, Vector3 $replacePos,
int $spreadFace) : bool{
85 $supportBlock = $world->getBlock($replacePos->getSide($spreadFace));
86 $supportFace = Facing::opposite($spreadFace);
88 if($supportBlock->getSupportType($supportFace) !== SupportType::FULL){
92 $replacedBlock = $supportBlock->getSide($supportFace);
93 $replacementBlock = $this->getSpreadBlock($replacedBlock, Facing::opposite($supportFace));
94 if($replacementBlock ===
null){
98 return BlockEventHelper::spread($replacedBlock, $replacementBlock, $this);
104 private static function getShuffledSpreadFaces(
int $sourceFace) : \Generator{
105 $skipAxis = Facing::axis($sourceFace);
107 $faces = Facing::ALL;
109 foreach($faces as $spreadFace){
110 if(Facing::axis($spreadFace) !== $skipAxis){
116 private function spreadAroundSupport(
int $sourceFace) : bool{
117 $world = $this->position->getWorld();
119 $supportPos = $this->position->getSide($sourceFace);
120 foreach(self::getShuffledSpreadFaces($sourceFace) as $spreadFace){
121 $replacePos = $supportPos->getSide($spreadFace);
122 if($this->spread($world, $replacePos, Facing::opposite($spreadFace))){
130 private function spreadAdjacentToSupport(
int $sourceFace) : bool{
131 $world = $this->position->getWorld();
133 foreach(self::getShuffledSpreadFaces($sourceFace) as $spreadFace){
134 $replacePos = $this->position->getSide($spreadFace);
135 if($this->spread($world, $replacePos, $sourceFace)){
142 private function spreadWithinSelf(
int $sourceFace) : bool{
143 foreach(self::getShuffledSpreadFaces($sourceFace) as $spreadFace){
144 if(!$this->hasFace($spreadFace) && $this->spread($this->position->getWorld(), $this->position, $spreadFace)){
153 if($item instanceof
Fertilizer && count($this->faces) > 0){
154 $shuffledFaces = $this->faces;
155 shuffle($shuffledFaces);
158 $this->spreadAroundSupport(...),
159 $this->spreadAdjacentToSupport(...),
160 $this->spreadWithinSelf(...),
162 shuffle($spreadMethods);
164 foreach($shuffledFaces as $sourceFace){
165 foreach($spreadMethods as $spreadMethod){
166 if($spreadMethod($sourceFace)){
179 if(($item->getBlockToolType() &
BlockToolType::SHEARS) !== 0){
180 return $this->getDropsForCompatibleTool($item);