CreateMod/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxBlock.java
2022-01-11 13:04:08 -05:00

110 lines
3.6 KiB
Java

package com.simibubi.create.content.contraptions.relays.gearbox;
import java.util.Arrays;
import java.util.List;
import com.simibubi.create.AllItems;
import com.simibubi.create.AllTileEntities;
import com.simibubi.create.content.contraptions.base.RotatedPillarKineticBlock;
import com.simibubi.create.content.contraptions.solver.AllConnections;
import com.simibubi.create.content.contraptions.solver.ConnectionsBuilder;
import com.simibubi.create.content.contraptions.solver.KineticConnections;
import com.simibubi.create.foundation.block.ITE;
import com.simibubi.create.foundation.utility.DirectionHelper;
import com.simibubi.create.foundation.utility.Iterate;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.Direction.Axis;
import net.minecraft.core.NonNullList;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.CreativeModeTab;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.material.PushReaction;
import net.minecraft.world.level.storage.loot.LootContext.Builder;
import net.minecraft.world.phys.HitResult;
public class GearboxBlock extends RotatedPillarKineticBlock implements ITE<GearboxTileEntity> {
public GearboxBlock(Properties properties) {
super(properties);
}
@Override
public PushReaction getPistonPushReaction(BlockState state) {
return PushReaction.PUSH_ONLY;
}
@Override
public void fillItemCategory(CreativeModeTab group, NonNullList<ItemStack> items) {
super.fillItemCategory(group, items);
items.add(AllItems.VERTICAL_GEARBOX.asStack());
}
@SuppressWarnings("deprecation")
@Override
public List<ItemStack> getDrops(BlockState state, Builder builder) {
if (state.getValue(AXIS).isVertical())
return super.getDrops(state, builder);
return Arrays.asList(new ItemStack(AllItems.VERTICAL_GEARBOX.get()));
}
@Override
public ItemStack getCloneItemStack(BlockState state, HitResult target, BlockGetter world, BlockPos pos,
Player player) {
if (state.getValue(AXIS).isVertical())
return super.getCloneItemStack(state, target, world, pos, player);
return new ItemStack(AllItems.VERTICAL_GEARBOX.get());
}
@Override
public BlockState getStateForPlacement(BlockPlaceContext context) {
return defaultBlockState().setValue(AXIS, Axis.Y);
}
// IRotate:
@Override
public boolean hasShaftTowards(BlockState state, Direction face) {
return face.getAxis() != state.getValue(AXIS);
}
@Override
public Axis getRotationAxis(BlockState state) {
return state.getValue(AXIS);
}
private static float getModifier(Direction from, Direction to) {
if (from == to) return 1;
Axis fromAxis = from.getAxis(), toAxis = to.getAxis();
if (fromAxis == toAxis) return -1;
return AllConnections.perpendicularRatios(to.getNormal().subtract(from.getNormal()), fromAxis, toAxis);
}
@Override
public ConnectionsBuilder buildInitialConnections(ConnectionsBuilder builder, BlockState state) {
Axis axis = state.getValue(AXIS);
Direction start = DirectionHelper.getPositivePerpendicular(axis);
for (Direction cur : Iterate.directionsPerpendicularTo(axis)) {
builder = builder.withHalfShaft(cur, getModifier(start, cur));
}
return builder;
}
@Override
public Class<GearboxTileEntity> getTileEntityClass() {
return GearboxTileEntity.class;
}
@Override
public BlockEntityType<? extends GearboxTileEntity> getTileEntityType() {
return AllTileEntities.GEARBOX.get();
}
}