Палесос

Версия Minecraft
1.19.2
API
Forge
84
5
6
Hi

Я вернулся, а значит время странных вопросов настало

Мне нужен блок который будет засасывать в себя предметы только с определенной стороны(front) при условии что есть редстоун сигнал

Контейнер уже есть, а вот с механикой палесоса прошу помочь





Заранее спасибо
 
Решение
Ладно, шутки шутками, Так то ПЫЛЬ, то есть ПЫЛесос. Сосущий пыль. Но тебе ведь не пыль надо было, а Предмето-сос или Блоко-сос.
Всё сводиться к тому что ты проверяешь в RandomTick предметы что лежат рядом с тобой (Item - предмет, ItemBlock - предметы которые блоки или просто блоки). Item класс общий для всех предметов, поэтому проще взять именно его.
Чтобы проверить что вокруг, тебе надо найти все Entity (как ни странно). Потому что когда предмет выброшен это EntityItem, это его новое состояние. Когда в руке это ItemStack (внутри которого уже он как Item или ItemBlock).
Обращаемся к миру и сравниваем все EntityItem по расстоянию (или радиусу). Так как мы будем работать с векторами, то не забудь прочесть эту статью. Линейная...
30
2
5
Посмотри как работает воронка. Далее думаю можно легко что-то с этим сделать. Имея координаты блока, сможешь всасывать предметы на блоках с определённой стороны относительно координат самого блока.
 
1,038
57
229
я в рамочку повешу

1686246781389.png
 
1,038
57
229
Ладно, шутки шутками, Так то ПЫЛЬ, то есть ПЫЛесос. Сосущий пыль. Но тебе ведь не пыль надо было, а Предмето-сос или Блоко-сос.
Всё сводиться к тому что ты проверяешь в RandomTick предметы что лежат рядом с тобой (Item - предмет, ItemBlock - предметы которые блоки или просто блоки). Item класс общий для всех предметов, поэтому проще взять именно его.
Чтобы проверить что вокруг, тебе надо найти все Entity (как ни странно). Потому что когда предмет выброшен это EntityItem, это его новое состояние. Когда в руке это ItemStack (внутри которого уже он как Item или ItemBlock).
Обращаемся к миру и сравниваем все EntityItem по расстоянию (или радиусу). Так как мы будем работать с векторами, то не забудь прочесть эту статью. Линейная алгебра для разработчиков игр
Я 10 лет работал без векторов, считая что раз могу это, то я очень крут. Но изучив их, я очень долго смеялся над собой, ведь вместо того чтобы сесть и прочитать статью, получается, я лишь вставлял себе палки в колёса. Понимание векторов и работа с векторами существенно упрощает понимание и количество кода.
Чтобы получить расстояние между предметами надо вычесть одну позицию из другой и получить вектор. Длинна вектора и будет расстоянием между точками. Всё что останется это сравнить это число с нашим (на сколько далеком мы должно обрабатывать предметы).
Как тебе и сказали выше, стоит посмотреть на воронку. Что я сейчас и сделаю.
Каждый раз блоки для меня находятся в совершенно не предсказуемых местах, а анг. у меня чисто технический, поэтому для начала надо узнать хотя бы как это звучит на анг.
1686331462018.png
Hopper, ок. Вау, победа
1686331518983.png

Нас конечно интересует HopperBlockEntity, скорее всего это как раз TileEntity (из старых версий, но чуть другой).
Отсюда видим две вещи
1) блок на самом деле обрабатывает все блоки рядом
1686331938178.png
UnSided - То есть безсторонний.

Ну и вот вторая финальная проверка на то можем ли мы засосать на основе Direction
1686331900400.png


Как то всё сложно на самом деле, но если разобраться, то наверное было бы круто.
Щас гляну учебник.
 
1,038
57
229
Нашел этот тутор, там есть 22 урок про Block Entity
Плейлист моддинг на 1.19
это плейлист который надо смотреть с начала.
1686334114005.png

Для того кто давно в модинге, можно промотать до нужного, лишь потому что хватает опыта определить разницу между например 1.12 и 1.19, или там 1.7.10 и 1.19. Для новчиков же стоит смотреть с самого начала, ну и включить субтитры на родном языке клавишей C.

А также ссылка на репозиторий в котором можно выбрать номер урока GitHub - Tutorials-By-Kaupenjoe/Forge-Tutorial-1.19 at 22-blockEntities
что очень удобно
1686332478176.png

Ну в видео есть метод tick
а там пишем
1686333700629.png
 

Вложения

  • 1686333892339.png
    1686333892339.png
    46.1 KB · Просмотры: 2
Последнее редактирование:
84
5
6
Теперь мой блок притягивает ItemEnitity
CollectorBlockEnity:
 public static void tick(Level level, BlockPos pos, BlockState blockState, CollectorBlockEntity blockEntity) {
        if (!blockState.getValue(CollectorBlock.TRIGGERED)) {
            return;
        }

        Direction facing = blockState.getValue(CollectorBlock.FACING);

        List<ItemEntity> entities = level.getEntitiesOfClass(ItemEntity.class, blockEntity.getDirection(facing));

            for (ItemEntity itemEntity : entities) {
                double centreX = pos.getX() + 0.5D;
                double centreY = pos.getY() + 0.5D;
                double centreZ = pos.getZ() + 0.5D;
                double diffX = -itemEntity.getX() + centreX;
                double diffY = -itemEntity.getY() + centreY;
                double diffZ = -itemEntity.getZ() + centreZ;
                double speedMultiper = 0.05D;
                double horizDiffSq = Mth.sqrt((float) (diffX * diffX + diffZ * diffZ));
                double angle = Math.asin(diffX / horizDiffSq);
                double d15 = Math.abs(Mth.sin((float) angle) * speedMultiper);
                double d16 = Math.abs(Mth.cos((float) angle) * speedMultiper);
                d15 = diffX <= 0.0D ? -d15 : d15;
                d16 = diffZ <= 0.0D ? -d16 : d16;
                if (itemEntity.getDeltaMovement().dot(itemEntity.getDeltaMovement()) >= 0.2D) {
                    continue;
                }

                itemEntity.setDeltaMovement(d15, diffY >= 0.7 ? speedMultiper * 2 : itemEntity.getDeltaMovement().y(), d16);

            }
        }

CollectorBlock:
  @Nullable
    @Override
    public <T extends BlockEntity> BlockEntityTicker<T> getTicker(Level level, BlockState blockState, BlockEntityType<T> blockEntityType) {
        return createTickerHelper(blockEntityType, EJBlockEntityType.COLLECTOR.get(), CollectorBlockEntity::tick);
    }

Доп.:
public static final double FORWARD_RANGE = 5; //растояние
public static final BooleanProperty TRIGGERED = BlockStateProperties.TRIGGERED;
public static final DirectionProperty FACING = DirectionalBlock.FACING;

public AABB getDirection(Direction facing) {
    BlockPos endPos = this.worldPosition.relative(facing, Mth.floor(CollectorBlock.FORWARD_RANGE));
if (facing == Direction.WEST)
        endPos = endPos.offset(0, 1, 1);
else if (facing == Direction.NORTH)
        endPos = endPos.offset(1, 1, 0);

if (facing == Direction.EAST)
        endPos = endPos.offset(1, 1, 1);
else if (facing == Direction.SOUTH)
        endPos = endPos.offset(1, 1, 1);

if (facing == Direction.UP)
        endPos = endPos.offset(1, 1, 1);
else if (facing == Direction.DOWN)
        endPos = endPos.offset(1, 0, 1);

return new AABB(this.worldPosition, endPos);
}



а вот над тем чтоб он собирал предметы я еще думаю
 
1,038
57
229
с последнего блока
c конца или с начала? Откуда счёт?
1686574760620.png
Java:
ItemEntity itemEntity = null;
//стартовый блок
BlockPos blockPos = null /* blah blah */;
//позиция в виде вектора
Vec3 start_pos = blockPos.getCenter();
//позиция предмета
Vec3 end_pos = itemEntity.position(); /* new Vec3(10, 0, 0) */

//конечная позиция которая тебе нужна
BlockPos endBlockPos = null /* blah blah */;

//если длинна больше чем
//разница векторов, то есть (end_pos - start_pos).length
if( end_pos.subtract(start_pos).length() > 4.5f )
{
 //...
}

//ИЛИ
//если это нужный блок
if(endBlockPos.equals(itemEntity.getOnPos())) {
//...
}
 
Последнее редактирование:
Сверху