Ку-ку всем, я мазохист

я мазохист, но суть не в этом. я так понял, что в pm4 не предусмотрена проверка на существование блока, в определенной области и получение его. только через цикл for?

ой, я что-то сегодня совсем тупой, выразить мысль не могу нормально.

проверка, находится ли блок, в радиусе квадратной области. как я понял, встроенной возможности нет)

Да, встроенной возможности нет

это конечно печально, щас напишу какой-нибудь пробник и сюда тогда скину

class PositionManager
{
    public static function isBlockInArea(Block $block, Position $position1, Position $position2): bool
    {
        $block = $block->getPosition();
        foreach (self::getPositionsInArea($position1, $position2) as $position) 
        {
            if (
                $position[0] == $block->getX() and 
                $position[1] == $block->getY() and 
                $position[2] == $block->getZ()
               ) 
            {
                return true;
            }
        }
        return false;
    }

    public static function getPositionsInArea(Position $position1, Position $position2): array
    {
        $positions = [];
        $min = self::getMinPosition($position1, $position2);
        $max = self::getMaxPosition($position1, $position2);
        for ($x = $min[0]; $x <= $max[0]; $x++)
        {
            for ($y = $min[1]; $y <= $max[1]; $y++)
            {
                for ($z = $min[2]; $z <= $max[2]; $z++)
                {
                    $positions[] = [$x, $y, $z];
                }
            }
        }
        return $positions;
    }
    
    public static function getMinPosition(Position $position1, Position $position2): array
    { 
        return [
            min($position1->getX(), $position2->getX()),
            min($position1->getY(), $position2->getY()),
            min($position1->getZ(), $position2->getZ())
        ];
    }

    public static function getMaxPosition(Position $position1, Position $position2): array
    { 
        return [
            max($position1->getX(), $position2->getX()),
            max($position1->getY(), $position2->getY()),
            max($position1->getZ(), $position2->getZ())
        ];
    }
}

вроде все верно, наверняка кому-то пригодится

так как я в отъезде, не могу проверить код, поэтому пришлось писать все классы, вот если кому нужно для проверки, все работает

Спойлер
<?php

class PositionManager
{
    public static function isBlockInArea(Block $block, Position $position1, Position $position2): bool
    {
        $block = $block->getPosition();
        foreach (self::getPositionsInArea($position1, $position2) as $position) 
        {
            if (
                $position[0] == $block->getX() and 
                $position[1] == $block->getY() and 
                $position[2] == $block->getZ()
               ) 
            {
                return true;
            }
        }
        return false;
    }

    public static function getPositionsInArea(Position $position1, Position $position2): array
    {
        $positions = [];
        $min = self::getMinPosition($position1, $position2);
        $max = self::getMaxPosition($position1, $position2);
        for ($x = $min[0]; $x <= $max[0]; $x++)
        {
            for ($y = $min[1]; $y <= $max[1]; $y++)
            {
                for ($z = $min[2]; $z <= $max[2]; $z++)
                {
                    $positions[] = [$x, $y, $z];
                }
            }
        }
        return $positions;
    }
    
    public static function getMinPosition(Position $position1, Position $position2): array
    { 
        return [
            min($position1->getX(), $position2->getX()),
            min($position1->getY(), $position2->getY()),
            min($position1->getZ(), $position2->getZ())
        ];
    }

    public static function getMaxPosition(Position $position1, Position $position2): array
    { 
        return [
            max($position1->getX(), $position2->getX()),
            max($position1->getY(), $position2->getY()),
            max($position1->getZ(), $position2->getZ())
        ];
    }
}

class Position
{
	public function __construct(public int $x, public int $y, public int $z)
	{}
	
	public function getX() { return $this->x; }
	
	public function getY() { return $this->y; }
	
	public function getZ() { return $this->z; }
}

class Block
{
	private Position $position;
	
	public function __construct(int $x, int $y, int $z)
	{
		$this->position = new Position($x, $y, $z);
	}
	
	public function getPosition(): Position { return $this->position; }
}

$block = new Block(1, 1, 1);
$position1 = new Position(1, 1, 1);
$position2 = new Position(1, 3, 5);

if (PositionManager::isBlockInArea($block, $position1, $position2)) echo "true";
else echo "false";

воу, а что нет ограничения по количеству сообщений подряд? раньше было, только 3 можно было

в своей теме нет ограничения, в чужой - не более 3 сообщений подряд

ааа, тогда понятно, я аж удивился

кароче, вот полностью доработанный класс(в виде плагина, так было удобнее выложить)

Я думал тебе надо проверять есть ли тип такого блока в области)

А так, если тебе надо проверить внутри ли региона блок, то лучшим способом будет

if ($block->collidesWithBB(new AxisAlignedBB($minX, $minY, $minZ, $maxX, $maxY, $maxZ))) {

}

А если тебе надо проверить только кубический блок, то можно $minX <= $blockX && $minY <= $blockY && $minZ <= $blockZ && $maxX >= $blockX && $maxY >= $blockY && $maxZ >= $blockZ && $world === $blockWorld

Ну и в целом

Manager слишком громко-звучит, может Utils или Helper?

getMinPosition и getMaxPosition можно заменить на Vector3::minComponents($position1, $position2) и Vector3::maxComponents($position1, $position2) соответственно

getPositionsInArea лучше будет сделать генератором, иначе на большой области большой жор памяти обеспечен

воу, даже не догадывался. пойду что-ли переделывать всё или удалять нафиг, посмотрим

это тоже самое, что и через цикл фор будет?

я просто по этому фанатею

эт как? я слишком плох в апи пммп…

Не совсем. Это проверит в целом находится ли все коллайдеры блока внутри. Какой-нибудь полублок не занимает всю область, поэтому его коллайдер будет только на половине

а, ну я прост написал заранее, чтобы потом для авто шахты сделать. через фор буду делать

Я имею ввиду генератором из PHP

 public static function getPositionsInArea(Position $position1, Position $position2): \Generator
    {
        $positions = [];
        $min = self::getMinPosition($position1, $position2);
        $max = self::getMaxPosition($position1, $position2);
        for ($x = $min[0]; $x <= $max[0]; $x++)
        {
            for ($y = $min[1]; $y <= $max[1]; $y++)
            {
                for ($z = $min[2]; $z <= $max[2]; $z++)
                {
                   yield [$x, $y, $z];
                }
            }
        }
    }
1 симпатия

У теб есть вк?