package com.simibubi.create.content.contraptions.components.actors; import javax.annotation.Nullable; import com.jozufozu.flywheel.api.MaterialManager; import com.jozufozu.flywheel.core.virtual.VirtualRenderWorld; import com.simibubi.create.AllTags; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionMatrices; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.core.BlockPos; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; public class DrillMovementBehaviour extends BlockBreakingMovementBehaviour { @Override public boolean isActive(MovementContext context) { return !VecHelper.isVecPointingTowards(context.relativeMotion, context.state.getValue(DrillBlock.FACING) .getOpposite()); } @Override public Vec3 getActiveAreaOffset(MovementContext context) { return Vec3.atLowerCornerOf(context.state.getValue(DrillBlock.FACING) .getNormal()).scale(.65f); } @Override @OnlyIn(value = Dist.CLIENT) public void renderInContraption(MovementContext context, VirtualRenderWorld renderWorld, ContraptionMatrices matrices, MultiBufferSource buffer) { if (!ContraptionRenderDispatcher.canInstance()) DrillRenderer.renderInContraption(context, renderWorld, matrices, buffer); } @Override public boolean hasSpecialInstancedRendering() { return true; } @Nullable @Override public ActorInstance createInstance(MaterialManager materialManager, VirtualRenderWorld simulationWorld, MovementContext context) { return new DrillActorInstance(materialManager, simulationWorld, context); } @Override protected DamageSource getDamageSource() { return DrillBlock.damageSourceDrill; } @Override public boolean canBreak(Level world, BlockPos breakingPos, BlockState state) { return super.canBreak(world, breakingPos, state) && !state.getCollisionShape(world, breakingPos) .isEmpty() && !AllTags.AllBlockTags.TRACKS.matches(state); } }