mirror of
https://github.com/Creators-of-Create/Create.git
synced 2024-11-11 12:32:05 +01:00
Refactored IBogeyBlock to AbstractBogeyBlock and extracted relevant StandardBogeyBlock implementations
This commit is contained in:
parent
17432c9113
commit
da593fccb1
10 changed files with 212 additions and 315 deletions
|
@ -63,7 +63,7 @@ import com.simibubi.create.content.curiosities.deco.SlidingDoorBlock;
|
||||||
import com.simibubi.create.content.logistics.block.inventories.CreativeCrateTileEntity;
|
import com.simibubi.create.content.logistics.block.inventories.CreativeCrateTileEntity;
|
||||||
import com.simibubi.create.content.logistics.block.redstone.RedstoneContactBlock;
|
import com.simibubi.create.content.logistics.block.redstone.RedstoneContactBlock;
|
||||||
import com.simibubi.create.content.logistics.block.vault.ItemVaultTileEntity;
|
import com.simibubi.create.content.logistics.block.vault.ItemVaultTileEntity;
|
||||||
import com.simibubi.create.content.logistics.trains.IBogeyBlock;
|
import com.simibubi.create.content.logistics.trains.AbstractBogeyBlock;
|
||||||
import com.simibubi.create.foundation.config.AllConfigs;
|
import com.simibubi.create.foundation.config.AllConfigs;
|
||||||
import com.simibubi.create.foundation.tileEntity.IMultiTileContainer;
|
import com.simibubi.create.foundation.tileEntity.IMultiTileContainer;
|
||||||
import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour;
|
import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour;
|
||||||
|
@ -342,7 +342,7 @@ public abstract class Contraption {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bogeys tend to have sticky sides
|
// Bogeys tend to have sticky sides
|
||||||
if (state.getBlock()instanceof IBogeyBlock bogey)
|
if (state.getBlock()instanceof AbstractBogeyBlock bogey)
|
||||||
for (Direction d : bogey.getStickySurfaces(world, pos, state))
|
for (Direction d : bogey.getStickySurfaces(world, pos, state))
|
||||||
if (!visited.contains(pos.relative(d)))
|
if (!visited.contains(pos.relative(d)))
|
||||||
frontier.add(pos.relative(d));
|
frontier.add(pos.relative(d));
|
||||||
|
@ -1006,7 +1006,7 @@ public abstract class Contraption {
|
||||||
if (disassembled)
|
if (disassembled)
|
||||||
return;
|
return;
|
||||||
disassembled = true;
|
disassembled = true;
|
||||||
|
|
||||||
for (boolean nonBrittles : Iterate.trueAndFalse) {
|
for (boolean nonBrittles : Iterate.trueAndFalse) {
|
||||||
for (StructureBlockInfo block : blocks.values()) {
|
for (StructureBlockInfo block : blocks.values()) {
|
||||||
if (nonBrittles == BlockMovementChecks.isBrittle(block.state))
|
if (nonBrittles == BlockMovementChecks.isBrittle(block.state))
|
||||||
|
|
|
@ -0,0 +1,178 @@
|
||||||
|
package com.simibubi.create.content.logistics.trains;
|
||||||
|
|
||||||
|
import static com.simibubi.create.content.logistics.trains.track.StandardBogeyBlock.AXIS;
|
||||||
|
import static net.minecraft.world.level.block.state.properties.BlockStateProperties.WATERLOGGED;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.EnumSet;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
|
import com.mojang.blaze3d.vertex.PoseStack;
|
||||||
|
import com.mojang.blaze3d.vertex.VertexConsumer;
|
||||||
|
import com.mojang.math.Vector3f;
|
||||||
|
import com.simibubi.create.AllBlocks;
|
||||||
|
import com.simibubi.create.AllTileEntities;
|
||||||
|
import com.simibubi.create.content.contraptions.wrench.IWrenchable;
|
||||||
|
import com.simibubi.create.content.logistics.trains.entity.BogeyStyle;
|
||||||
|
import com.simibubi.create.content.logistics.trains.track.StandardBogeyTileEntity;
|
||||||
|
import com.simibubi.create.content.schematics.ISpecialBlockItemRequirement;
|
||||||
|
import com.simibubi.create.content.schematics.ItemRequirement;
|
||||||
|
import com.simibubi.create.foundation.block.ITE;
|
||||||
|
import com.simibubi.create.foundation.block.ProperWaterloggedBlock;
|
||||||
|
import com.simibubi.create.foundation.utility.RegisteredObjects;
|
||||||
|
|
||||||
|
import net.minecraft.client.renderer.MultiBufferSource;
|
||||||
|
import net.minecraft.client.renderer.RenderType;
|
||||||
|
import net.minecraft.core.BlockPos;
|
||||||
|
import net.minecraft.core.Direction;
|
||||||
|
import net.minecraft.nbt.CompoundTag;
|
||||||
|
import net.minecraft.resources.ResourceLocation;
|
||||||
|
import net.minecraft.world.level.BlockGetter;
|
||||||
|
import net.minecraft.world.level.Level;
|
||||||
|
import net.minecraft.world.level.LevelAccessor;
|
||||||
|
import net.minecraft.world.level.block.Block;
|
||||||
|
import net.minecraft.world.level.block.Rotation;
|
||||||
|
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||||
|
import net.minecraft.world.level.block.entity.BlockEntityType;
|
||||||
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
|
import net.minecraft.world.level.block.state.StateDefinition;
|
||||||
|
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
|
||||||
|
import net.minecraft.world.level.block.state.properties.EnumProperty;
|
||||||
|
import net.minecraft.world.level.material.FluidState;
|
||||||
|
import net.minecraft.world.phys.Vec3;
|
||||||
|
import net.minecraftforge.api.distmarker.Dist;
|
||||||
|
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||||
|
import net.minecraftforge.registries.ForgeRegistries;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
public abstract class AbstractBogeyBlock extends Block implements ITE<StandardBogeyTileEntity>, ProperWaterloggedBlock, ISpecialBlockItemRequirement, IWrenchable {
|
||||||
|
public static final EnumProperty<Direction.Axis> AXIS = BlockStateProperties.HORIZONTAL_AXIS;
|
||||||
|
static final List<ResourceLocation> BOGEYS = new ArrayList<>();
|
||||||
|
|
||||||
|
public AbstractBogeyBlock(Properties pProperties) {
|
||||||
|
super(pProperties);
|
||||||
|
registerDefaultState(defaultBlockState().setValue(WATERLOGGED, false));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void register(ResourceLocation block) {
|
||||||
|
BOGEYS.add(block);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
|
||||||
|
builder.add(AXIS, WATERLOGGED);
|
||||||
|
super.createBlockStateDefinition(builder);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BlockState updateShape(BlockState pState, Direction pDirection, BlockState pNeighborState,
|
||||||
|
LevelAccessor pLevel, BlockPos pCurrentPos, BlockPos pNeighborPos) {
|
||||||
|
updateWater(pLevel, pState, pCurrentPos);
|
||||||
|
return pState;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FluidState getFluidState(BlockState pState) {
|
||||||
|
return fluidState(pState);
|
||||||
|
}
|
||||||
|
|
||||||
|
static final EnumSet<Direction> STICKY_X = EnumSet.of(Direction.EAST, Direction.WEST);
|
||||||
|
static final EnumSet<Direction> STICKY_Z = EnumSet.of(Direction.SOUTH, Direction.NORTH);
|
||||||
|
|
||||||
|
public EnumSet<Direction> getStickySurfaces(BlockGetter world, BlockPos pos, BlockState state) {
|
||||||
|
return state.getValue(BlockStateProperties.HORIZONTAL_AXIS) == Direction.Axis.X ? STICKY_X : STICKY_Z;
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract double getWheelPointSpacing();
|
||||||
|
|
||||||
|
public abstract double getWheelRadius();
|
||||||
|
|
||||||
|
public abstract Vec3 getConnectorAnchorOffset();
|
||||||
|
|
||||||
|
public boolean allowsSingleBogeyCarriage() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@OnlyIn(Dist.CLIENT)
|
||||||
|
public void render(@Nullable BlockState state, float wheelAngle, PoseStack ms, float partialTicks,
|
||||||
|
MultiBufferSource buffers, int light, int overlay, CompoundTag bogeyData) {
|
||||||
|
final BogeyRenderer renderer = getStyle().renderer;
|
||||||
|
if (state != null) {
|
||||||
|
ms.translate(.5f, .5f, .5f);
|
||||||
|
if (state.getValue(AXIS) == Direction.Axis.X)
|
||||||
|
ms.mulPose(Vector3f.YP.rotationDegrees(90));
|
||||||
|
}
|
||||||
|
ms.translate(0, -1.5 - 1 / 128f, 0);
|
||||||
|
VertexConsumer vb = buffers.getBuffer(RenderType.cutoutMipped());
|
||||||
|
renderer.render(bogeyData, wheelAngle, ms, light, vb, getSize());
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract BogeyRenderer.BogeySize getSize();
|
||||||
|
|
||||||
|
public Direction getBogeyUpDirection() {
|
||||||
|
return Direction.UP;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isTrackAxisAlongFirstCoordinate(BlockState state) {
|
||||||
|
return state.getValue(AXIS) == Direction.Axis.X;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public BlockState getMatchingBogey(Direction upDirection, boolean axisAlongFirst) {
|
||||||
|
if (upDirection != Direction.UP)
|
||||||
|
return null;
|
||||||
|
return defaultBlockState().setValue(AXIS, axisAlongFirst ? Direction.Axis.X : Direction.Axis.Z);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BlockState getRotatedBlockState(BlockState state, Direction targetedFace) {
|
||||||
|
Block block = state.getBlock();
|
||||||
|
int indexOf = BOGEYS.indexOf(RegisteredObjects.getKeyOrThrow(block));
|
||||||
|
if (indexOf == -1)
|
||||||
|
return state;
|
||||||
|
|
||||||
|
int index = (indexOf + 1) % BOGEYS.size();
|
||||||
|
Direction bogeyUpDirection = getBogeyUpDirection();
|
||||||
|
boolean trackAxisAlongFirstCoordinate = isTrackAxisAlongFirstCoordinate(state);
|
||||||
|
|
||||||
|
while (index != indexOf) {
|
||||||
|
ResourceLocation id = BOGEYS.get(index);
|
||||||
|
Block newBlock = ForgeRegistries.BLOCKS.getValue(id);
|
||||||
|
if (newBlock instanceof AbstractBogeyBlock bogey) {
|
||||||
|
BlockState matchingBogey = bogey.getMatchingBogey(bogeyUpDirection, trackAxisAlongFirstCoordinate);
|
||||||
|
if (matchingBogey != null)
|
||||||
|
return matchingBogey.hasProperty(WATERLOGGED)
|
||||||
|
? matchingBogey.setValue(WATERLOGGED, state.getValue(WATERLOGGED))
|
||||||
|
: matchingBogey;
|
||||||
|
}
|
||||||
|
index = (index + 1) % BOGEYS.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull BlockState rotate(@NotNull BlockState pState, Rotation pRotation) {
|
||||||
|
return switch (pRotation) {
|
||||||
|
case COUNTERCLOCKWISE_90, CLOCKWISE_90 -> pState.cycle(AXIS);
|
||||||
|
default -> pState;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemRequirement getRequiredItems(BlockState state, BlockEntity te) {
|
||||||
|
return new ItemRequirement(ItemRequirement.ItemUseType.CONSUME, AllBlocks.RAILWAY_CASING.asStack());
|
||||||
|
}
|
||||||
|
|
||||||
|
public CompoundTag getBogeyData(@NotNull Level level, BlockPos pos) {
|
||||||
|
BlockEntity te = level.getBlockEntity(pos);
|
||||||
|
if (te == null) return new CompoundTag();
|
||||||
|
return te.getTileData();
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract BogeyStyle getStyle();
|
||||||
|
}
|
|
@ -1,94 +0,0 @@
|
||||||
package com.simibubi.create.content.logistics.trains;
|
|
||||||
|
|
||||||
import static net.minecraft.world.level.block.state.properties.BlockStateProperties.WATERLOGGED;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.EnumSet;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
|
|
||||||
import com.jozufozu.flywheel.api.MaterialManager;
|
|
||||||
import com.mojang.blaze3d.vertex.PoseStack;
|
|
||||||
import com.simibubi.create.content.contraptions.wrench.IWrenchable;
|
|
||||||
import com.simibubi.create.content.logistics.trains.entity.BogeyInstance;
|
|
||||||
import com.simibubi.create.content.logistics.trains.entity.CarriageBogey;
|
|
||||||
import com.simibubi.create.foundation.utility.RegisteredObjects;
|
|
||||||
|
|
||||||
import net.minecraft.client.renderer.MultiBufferSource;
|
|
||||||
import net.minecraft.core.BlockPos;
|
|
||||||
import net.minecraft.core.Direction;
|
|
||||||
import net.minecraft.resources.ResourceLocation;
|
|
||||||
import net.minecraft.world.level.BlockGetter;
|
|
||||||
import net.minecraft.world.level.block.Block;
|
|
||||||
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;
|
|
||||||
import net.minecraftforge.registries.ForgeRegistries;
|
|
||||||
|
|
||||||
public interface IBogeyBlock extends IWrenchable {
|
|
||||||
|
|
||||||
static final List<ResourceLocation> BOGEYS = new ArrayList<>();
|
|
||||||
|
|
||||||
public static void register(ResourceLocation block) {
|
|
||||||
BOGEYS.add(block);
|
|
||||||
}
|
|
||||||
|
|
||||||
public EnumSet<Direction> getStickySurfaces(BlockGetter world, BlockPos pos, BlockState state);
|
|
||||||
|
|
||||||
public double getWheelPointSpacing();
|
|
||||||
|
|
||||||
public double getWheelRadius();
|
|
||||||
|
|
||||||
public boolean allowsSingleBogeyCarriage();
|
|
||||||
|
|
||||||
public Vec3 getConnectorAnchorOffset();
|
|
||||||
|
|
||||||
@OnlyIn(Dist.CLIENT)
|
|
||||||
public void render(@Nullable BlockState state, float wheelAngle, PoseStack ms, float partialTicks,
|
|
||||||
MultiBufferSource buffers, int light, int overlay);
|
|
||||||
|
|
||||||
@OnlyIn(Dist.CLIENT)
|
|
||||||
public BogeyInstance createInstance(MaterialManager materialManager, CarriageBogey bogey);
|
|
||||||
|
|
||||||
public default Direction getBogeyUpDirection() {
|
|
||||||
return Direction.UP;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isTrackAxisAlongFirstCoordinate(BlockState state);
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
public BlockState getMatchingBogey(Direction upDirection, boolean axisAlongFirst);
|
|
||||||
|
|
||||||
@Override
|
|
||||||
default BlockState getRotatedBlockState(BlockState state, Direction targetedFace) {
|
|
||||||
Block block = state.getBlock();
|
|
||||||
int indexOf = BOGEYS.indexOf(RegisteredObjects.getKeyOrThrow(block));
|
|
||||||
if (indexOf == -1)
|
|
||||||
return state;
|
|
||||||
|
|
||||||
int index = (indexOf + 1) % BOGEYS.size();
|
|
||||||
Direction bogeyUpDirection = getBogeyUpDirection();
|
|
||||||
boolean trackAxisAlongFirstCoordinate = isTrackAxisAlongFirstCoordinate(state);
|
|
||||||
|
|
||||||
while (index != indexOf) {
|
|
||||||
ResourceLocation id = BOGEYS.get(index);
|
|
||||||
Block newBlock = ForgeRegistries.BLOCKS.getValue(id);
|
|
||||||
if (newBlock instanceof IBogeyBlock bogey) {
|
|
||||||
BlockState matchingBogey = bogey.getMatchingBogey(bogeyUpDirection, trackAxisAlongFirstCoordinate);
|
|
||||||
if (matchingBogey != null)
|
|
||||||
return matchingBogey.hasProperty(WATERLOGGED)
|
|
||||||
? matchingBogey.setValue(WATERLOGGED, state.getValue(WATERLOGGED))
|
|
||||||
: matchingBogey;
|
|
||||||
}
|
|
||||||
index = (index + 1) % BOGEYS.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
return state;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Class<? extends BogeyRenderer> getRendererClass();
|
|
||||||
|
|
||||||
public BogeyRenderer getRenderer();
|
|
||||||
}
|
|
|
@ -5,7 +5,7 @@ import javax.annotation.Nullable;
|
||||||
import com.jozufozu.flywheel.api.MaterialManager;
|
import com.jozufozu.flywheel.api.MaterialManager;
|
||||||
import com.simibubi.create.Create;
|
import com.simibubi.create.Create;
|
||||||
import com.simibubi.create.content.logistics.trains.DimensionPalette;
|
import com.simibubi.create.content.logistics.trains.DimensionPalette;
|
||||||
import com.simibubi.create.content.logistics.trains.IBogeyBlock;
|
import com.simibubi.create.content.logistics.trains.AbstractBogeyBlock;
|
||||||
import com.simibubi.create.content.logistics.trains.TrackGraph;
|
import com.simibubi.create.content.logistics.trains.TrackGraph;
|
||||||
import com.simibubi.create.foundation.utility.AngleHelper;
|
import com.simibubi.create.foundation.utility.AngleHelper;
|
||||||
import com.simibubi.create.foundation.utility.Couple;
|
import com.simibubi.create.foundation.utility.Couple;
|
||||||
|
@ -31,7 +31,7 @@ public class CarriageBogey {
|
||||||
|
|
||||||
boolean isLeading;
|
boolean isLeading;
|
||||||
|
|
||||||
IBogeyBlock type;
|
AbstractBogeyBlock type;
|
||||||
Couple<TravellingPoint> points;
|
Couple<TravellingPoint> points;
|
||||||
|
|
||||||
LerpedFloat wheelAngle;
|
LerpedFloat wheelAngle;
|
||||||
|
@ -42,7 +42,7 @@ public class CarriageBogey {
|
||||||
|
|
||||||
int derailAngle;
|
int derailAngle;
|
||||||
|
|
||||||
public CarriageBogey(IBogeyBlock type, TravellingPoint point, TravellingPoint point2) {
|
public CarriageBogey(AbstractBogeyBlock type, TravellingPoint point, TravellingPoint point2) {
|
||||||
this.type = type;
|
this.type = type;
|
||||||
points = Couple.create(point, point2);
|
points = Couple.create(point, point2);
|
||||||
wheelAngle = LerpedFloat.angular();
|
wheelAngle = LerpedFloat.angular();
|
||||||
|
@ -155,7 +155,7 @@ public class CarriageBogey {
|
||||||
|
|
||||||
public static CarriageBogey read(CompoundTag tag, TrackGraph graph, DimensionPalette dimensions) {
|
public static CarriageBogey read(CompoundTag tag, TrackGraph graph, DimensionPalette dimensions) {
|
||||||
ResourceLocation location = new ResourceLocation(tag.getString("Type"));
|
ResourceLocation location = new ResourceLocation(tag.getString("Type"));
|
||||||
IBogeyBlock type = (IBogeyBlock) ForgeRegistries.BLOCKS.getValue(location);
|
AbstractBogeyBlock type = (AbstractBogeyBlock) ForgeRegistries.BLOCKS.getValue(location);
|
||||||
Couple<TravellingPoint> points = Couple.deserializeEach(tag.getList("Points", Tag.TAG_COMPOUND),
|
Couple<TravellingPoint> points = Couple.deserializeEach(tag.getList("Points", Tag.TAG_COMPOUND),
|
||||||
c -> TravellingPoint.read(c, graph, dimensions));
|
c -> TravellingPoint.read(c, graph, dimensions));
|
||||||
CarriageBogey carriageBogey = new CarriageBogey(type, points.getFirst(), points.getSecond());
|
CarriageBogey carriageBogey = new CarriageBogey(type, points.getFirst(), points.getSecond());
|
||||||
|
@ -163,7 +163,7 @@ public class CarriageBogey {
|
||||||
}
|
}
|
||||||
|
|
||||||
public BogeyInstance createInstance(MaterialManager materialManager) {
|
public BogeyInstance createInstance(MaterialManager materialManager) {
|
||||||
return type.createInstance(materialManager, this);
|
return type.getStyle().createInstance(this, type.getSize(), materialManager);
|
||||||
}
|
}
|
||||||
|
|
||||||
void setLeading() {
|
void setLeading() {
|
||||||
|
|
|
@ -22,7 +22,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.ren
|
||||||
import com.simibubi.create.content.contraptions.components.structureMovement.train.TrainCargoManager;
|
import com.simibubi.create.content.contraptions.components.structureMovement.train.TrainCargoManager;
|
||||||
import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock;
|
import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock;
|
||||||
import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel;
|
import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel;
|
||||||
import com.simibubi.create.content.logistics.trains.IBogeyBlock;
|
import com.simibubi.create.content.logistics.trains.AbstractBogeyBlock;
|
||||||
import com.simibubi.create.foundation.utility.Couple;
|
import com.simibubi.create.foundation.utility.Couple;
|
||||||
import com.simibubi.create.foundation.utility.Iterate;
|
import com.simibubi.create.foundation.utility.Iterate;
|
||||||
import com.simibubi.create.foundation.utility.Lang;
|
import com.simibubi.create.foundation.utility.Lang;
|
||||||
|
@ -71,7 +71,7 @@ public class CarriageContraption extends Contraption {
|
||||||
// render
|
// render
|
||||||
public int portalCutoffMin;
|
public int portalCutoffMin;
|
||||||
public int portalCutoffMax;
|
public int portalCutoffMax;
|
||||||
|
|
||||||
static final IItemHandlerModifiable fallbackItems = new ItemStackHandler();
|
static final IItemHandlerModifiable fallbackItems = new ItemStackHandler();
|
||||||
static final IFluidHandler fallbackFluids = new FluidTank(0);
|
static final IFluidHandler fallbackFluids = new FluidTank(0);
|
||||||
|
|
||||||
|
@ -162,7 +162,7 @@ public class CarriageContraption extends Contraption {
|
||||||
.getStep(), toLocalPos(pos));
|
.getStep(), toLocalPos(pos));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (blockState.getBlock() instanceof IBogeyBlock) {
|
if (blockState.getBlock() instanceof AbstractBogeyBlock) {
|
||||||
bogeys++;
|
bogeys++;
|
||||||
if (bogeys == 2)
|
if (bogeys == 2)
|
||||||
secondBogeyPos = pos;
|
secondBogeyPos = pos;
|
||||||
|
@ -235,7 +235,7 @@ public class CarriageContraption extends Contraption {
|
||||||
protected MountedStorageManager getStorageForSpawnPacket() {
|
protected MountedStorageManager getStorageForSpawnPacket() {
|
||||||
return storageProxy;
|
return storageProxy;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected ContraptionType getType() {
|
protected ContraptionType getType() {
|
||||||
return ContraptionType.CARRIAGE;
|
return ContraptionType.CARRIAGE;
|
||||||
|
|
|
@ -7,7 +7,7 @@ import java.util.UUID;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
import com.simibubi.create.CreateClient;
|
import com.simibubi.create.CreateClient;
|
||||||
import com.simibubi.create.content.logistics.trains.IBogeyBlock;
|
import com.simibubi.create.content.logistics.trains.AbstractBogeyBlock;
|
||||||
import com.simibubi.create.foundation.networking.SimplePacketBase;
|
import com.simibubi.create.foundation.networking.SimplePacketBase;
|
||||||
import com.simibubi.create.foundation.utility.Couple;
|
import com.simibubi.create.foundation.utility.Couple;
|
||||||
import com.simibubi.create.foundation.utility.Iterate;
|
import com.simibubi.create.foundation.utility.Iterate;
|
||||||
|
@ -47,7 +47,7 @@ public class TrainPacket extends SimplePacketBase {
|
||||||
for (boolean first : Iterate.trueAndFalse) {
|
for (boolean first : Iterate.trueAndFalse) {
|
||||||
if (!first && !buffer.readBoolean())
|
if (!first && !buffer.readBoolean())
|
||||||
continue;
|
continue;
|
||||||
IBogeyBlock type = (IBogeyBlock) ForgeRegistries.BLOCKS.getValue(buffer.readResourceLocation());
|
AbstractBogeyBlock type = (AbstractBogeyBlock) ForgeRegistries.BLOCKS.getValue(buffer.readResourceLocation());
|
||||||
bogies.set(first, new CarriageBogey(type, new TravellingPoint(), new TravellingPoint()));
|
bogies.set(first, new CarriageBogey(type, new TravellingPoint(), new TravellingPoint()));
|
||||||
}
|
}
|
||||||
int spacing = buffer.readVarInt();
|
int spacing = buffer.readVarInt();
|
||||||
|
|
|
@ -21,7 +21,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.ITr
|
||||||
import com.simibubi.create.content.contraptions.components.structureMovement.StructureTransform;
|
import com.simibubi.create.content.contraptions.components.structureMovement.StructureTransform;
|
||||||
import com.simibubi.create.content.logistics.block.depot.DepotBehaviour;
|
import com.simibubi.create.content.logistics.block.depot.DepotBehaviour;
|
||||||
import com.simibubi.create.content.logistics.block.display.DisplayLinkBlock;
|
import com.simibubi.create.content.logistics.block.display.DisplayLinkBlock;
|
||||||
import com.simibubi.create.content.logistics.trains.IBogeyBlock;
|
import com.simibubi.create.content.logistics.trains.AbstractBogeyBlock;
|
||||||
import com.simibubi.create.content.logistics.trains.ITrackBlock;
|
import com.simibubi.create.content.logistics.trains.ITrackBlock;
|
||||||
import com.simibubi.create.content.logistics.trains.TrackEdge;
|
import com.simibubi.create.content.logistics.trains.TrackEdge;
|
||||||
import com.simibubi.create.content.logistics.trains.TrackGraph;
|
import com.simibubi.create.content.logistics.trains.TrackGraph;
|
||||||
|
@ -189,7 +189,7 @@ public class StationTileEntity extends SmartTileEntity implements ITransformable
|
||||||
Direction assemblyDirection;
|
Direction assemblyDirection;
|
||||||
int assemblyLength;
|
int assemblyLength;
|
||||||
int[] bogeyLocations;
|
int[] bogeyLocations;
|
||||||
IBogeyBlock[] bogeyTypes;
|
AbstractBogeyBlock[] bogeyTypes;
|
||||||
int bogeyCount;
|
int bogeyCount;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -272,7 +272,7 @@ public class StationTileEntity extends SmartTileEntity implements ITransformable
|
||||||
BlockPos bogeyPos = pos.relative(assemblyDirection, i)
|
BlockPos bogeyPos = pos.relative(assemblyDirection, i)
|
||||||
.offset(up);
|
.offset(up);
|
||||||
BlockState blockState = level.getBlockState(bogeyPos);
|
BlockState blockState = level.getBlockState(bogeyPos);
|
||||||
if (blockState.getBlock() instanceof IBogeyBlock bogey) {
|
if (blockState.getBlock() instanceof AbstractBogeyBlock bogey) {
|
||||||
level.setBlock(bogeyPos, bogey.getRotatedBlockState(blockState, Direction.DOWN), 3);
|
level.setBlock(bogeyPos, bogey.getRotatedBlockState(blockState, Direction.DOWN), 3);
|
||||||
bogey.playRotateSound(level, bogeyPos);
|
bogey.playRotateSound(level, bogeyPos);
|
||||||
return true;
|
return true;
|
||||||
|
@ -370,7 +370,7 @@ public class StationTileEntity extends SmartTileEntity implements ITransformable
|
||||||
if (bogeyLocations == null)
|
if (bogeyLocations == null)
|
||||||
bogeyLocations = new int[maxBogeyCount];
|
bogeyLocations = new int[maxBogeyCount];
|
||||||
if (bogeyTypes == null)
|
if (bogeyTypes == null)
|
||||||
bogeyTypes = new IBogeyBlock[maxBogeyCount];
|
bogeyTypes = new AbstractBogeyBlock[maxBogeyCount];
|
||||||
Arrays.fill(bogeyLocations, -1);
|
Arrays.fill(bogeyLocations, -1);
|
||||||
Arrays.fill(bogeyTypes, null);
|
Arrays.fill(bogeyTypes, null);
|
||||||
|
|
||||||
|
@ -385,7 +385,7 @@ public class StationTileEntity extends SmartTileEntity implements ITransformable
|
||||||
}
|
}
|
||||||
|
|
||||||
BlockState potentialBogeyState = level.getBlockState(bogeyOffset.offset(currentPos));
|
BlockState potentialBogeyState = level.getBlockState(bogeyOffset.offset(currentPos));
|
||||||
if (potentialBogeyState.getBlock() instanceof IBogeyBlock bogey && bogeyIndex < bogeyLocations.length) {
|
if (potentialBogeyState.getBlock() instanceof AbstractBogeyBlock bogey && bogeyIndex < bogeyLocations.length) {
|
||||||
bogeyTypes[bogeyIndex] = bogey;
|
bogeyTypes[bogeyIndex] = bogey;
|
||||||
bogeyLocations[bogeyIndex] = i;
|
bogeyLocations[bogeyIndex] = i;
|
||||||
bogeyIndex++;
|
bogeyIndex++;
|
||||||
|
@ -591,7 +591,7 @@ public class StationTileEntity extends SmartTileEntity implements ITransformable
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
IBogeyBlock typeOfFirstBogey = bogeyTypes[bogeyIndex];
|
AbstractBogeyBlock typeOfFirstBogey = bogeyTypes[bogeyIndex];
|
||||||
CarriageBogey firstBogey =
|
CarriageBogey firstBogey =
|
||||||
new CarriageBogey(typeOfFirstBogey, points.get(pointIndex), points.get(pointIndex + 1));
|
new CarriageBogey(typeOfFirstBogey, points.get(pointIndex), points.get(pointIndex + 1));
|
||||||
CarriageBogey secondBogey = null;
|
CarriageBogey secondBogey = null;
|
||||||
|
|
|
@ -2,95 +2,34 @@ package com.simibubi.create.content.logistics.trains.track;
|
||||||
|
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
|
|
||||||
import com.jozufozu.flywheel.api.MaterialManager;
|
|
||||||
import com.mojang.blaze3d.vertex.PoseStack;
|
|
||||||
import com.mojang.blaze3d.vertex.VertexConsumer;
|
|
||||||
import com.mojang.math.Vector3f;
|
|
||||||
import com.simibubi.create.AllBlockPartials;
|
|
||||||
import com.simibubi.create.AllBlocks;
|
import com.simibubi.create.AllBlocks;
|
||||||
|
import com.simibubi.create.AllBogeyStyles;
|
||||||
import com.simibubi.create.AllTileEntities;
|
import com.simibubi.create.AllTileEntities;
|
||||||
import com.simibubi.create.content.contraptions.relays.elementary.ShaftBlock;
|
|
||||||
import com.simibubi.create.content.logistics.trains.BogeyRenderer;
|
import com.simibubi.create.content.logistics.trains.BogeyRenderer;
|
||||||
import com.simibubi.create.content.logistics.trains.IBogeyBlock;
|
import com.simibubi.create.content.logistics.trains.AbstractBogeyBlock;
|
||||||
import com.simibubi.create.content.logistics.trains.StandardBogeyRenderer;
|
import com.simibubi.create.content.logistics.trains.entity.BogeyStyle;
|
||||||
import com.simibubi.create.content.logistics.trains.entity.BogeyInstance;
|
|
||||||
import com.simibubi.create.content.logistics.trains.entity.CarriageBogey;
|
|
||||||
import com.simibubi.create.content.logistics.trains.entity.StandardBogeyInstance;
|
|
||||||
import com.simibubi.create.content.schematics.ISpecialBlockItemRequirement;
|
import com.simibubi.create.content.schematics.ISpecialBlockItemRequirement;
|
||||||
import com.simibubi.create.content.schematics.ItemRequirement;
|
|
||||||
import com.simibubi.create.content.schematics.ItemRequirement.ItemUseType;
|
|
||||||
import com.simibubi.create.foundation.block.ITE;
|
import com.simibubi.create.foundation.block.ITE;
|
||||||
import com.simibubi.create.foundation.block.ProperWaterloggedBlock;
|
import com.simibubi.create.foundation.block.ProperWaterloggedBlock;
|
||||||
import com.simibubi.create.foundation.render.CachedBufferer;
|
|
||||||
import com.simibubi.create.foundation.utility.AngleHelper;
|
|
||||||
import com.simibubi.create.foundation.utility.Iterate;
|
|
||||||
|
|
||||||
import net.minecraft.client.renderer.MultiBufferSource;
|
|
||||||
import net.minecraft.client.renderer.RenderType;
|
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.core.Direction;
|
|
||||||
import net.minecraft.core.Direction.Axis;
|
|
||||||
import net.minecraft.nbt.CompoundTag;
|
|
||||||
import net.minecraft.world.entity.player.Player;
|
import net.minecraft.world.entity.player.Player;
|
||||||
import net.minecraft.world.item.ItemStack;
|
import net.minecraft.world.item.ItemStack;
|
||||||
import net.minecraft.world.level.BlockGetter;
|
import net.minecraft.world.level.BlockGetter;
|
||||||
import net.minecraft.world.level.LevelAccessor;
|
|
||||||
import net.minecraft.world.level.block.Block;
|
|
||||||
import net.minecraft.world.level.block.Blocks;
|
|
||||||
import net.minecraft.world.level.block.Rotation;
|
|
||||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
|
||||||
import net.minecraft.world.level.block.entity.BlockEntityType;
|
import net.minecraft.world.level.block.entity.BlockEntityType;
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
import net.minecraft.world.level.block.state.StateDefinition.Builder;
|
|
||||||
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
|
|
||||||
import net.minecraft.world.level.block.state.properties.EnumProperty;
|
|
||||||
import net.minecraft.world.level.material.FluidState;
|
|
||||||
import net.minecraft.world.phys.HitResult;
|
import net.minecraft.world.phys.HitResult;
|
||||||
import net.minecraft.world.phys.Vec3;
|
import net.minecraft.world.phys.Vec3;
|
||||||
import net.minecraftforge.api.distmarker.Dist;
|
|
||||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
|
||||||
|
|
||||||
public class StandardBogeyBlock extends Block
|
public class StandardBogeyBlock extends AbstractBogeyBlock implements ITE<StandardBogeyTileEntity>, ProperWaterloggedBlock, ISpecialBlockItemRequirement {
|
||||||
implements IBogeyBlock, ITE<StandardBogeyTileEntity>, ProperWaterloggedBlock, ISpecialBlockItemRequirement {
|
|
||||||
|
|
||||||
public static final EnumProperty<Axis> AXIS = BlockStateProperties.HORIZONTAL_AXIS;
|
|
||||||
private final boolean large;
|
private final boolean large;
|
||||||
|
|
||||||
private final BogeyRenderer renderer;
|
|
||||||
|
|
||||||
public StandardBogeyBlock(Properties p_i48440_1_, boolean large) {
|
public StandardBogeyBlock(Properties p_i48440_1_, boolean large) {
|
||||||
super(p_i48440_1_);
|
super(p_i48440_1_);
|
||||||
this.large = large;
|
this.large = large;
|
||||||
this.renderer = new StandardBogeyRenderer();
|
|
||||||
registerDefaultState(defaultBlockState().setValue(WATERLOGGED, false));
|
registerDefaultState(defaultBlockState().setValue(WATERLOGGED, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void createBlockStateDefinition(Builder<Block, BlockState> builder) {
|
|
||||||
builder.add(AXIS, WATERLOGGED);
|
|
||||||
super.createBlockStateDefinition(builder);
|
|
||||||
}
|
|
||||||
|
|
||||||
static final EnumSet<Direction> STICKY_X = EnumSet.of(Direction.EAST, Direction.WEST);
|
|
||||||
static final EnumSet<Direction> STICKY_Z = EnumSet.of(Direction.SOUTH, Direction.NORTH);
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public EnumSet<Direction> getStickySurfaces(BlockGetter world, BlockPos pos, BlockState state) {
|
|
||||||
return state.getValue(BlockStateProperties.HORIZONTAL_AXIS) == Axis.X ? STICKY_X : STICKY_Z;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BlockState updateShape(BlockState pState, Direction pDirection, BlockState pNeighborState,
|
|
||||||
LevelAccessor pLevel, BlockPos pCurrentPos, BlockPos pNeighborPos) {
|
|
||||||
updateWater(pLevel, pState, pCurrentPos);
|
|
||||||
return pState;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public FluidState getFluidState(BlockState pState) {
|
|
||||||
return fluidState(pState);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getWheelPointSpacing() {
|
public double getWheelPointSpacing() {
|
||||||
return 2;
|
return 2;
|
||||||
|
@ -107,132 +46,13 @@ public class StandardBogeyBlock extends Block
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean allowsSingleBogeyCarriage() {
|
public BogeyStyle getStyle() {
|
||||||
return true;
|
return AllBogeyStyles.STANDARD.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BlockState getMatchingBogey(Direction upDirection, boolean axisAlongFirst) {
|
public BogeyRenderer.BogeySize getSize() {
|
||||||
if (upDirection != Direction.UP)
|
return large ? BogeyRenderer.BogeySize.LARGE : BogeyRenderer.BogeySize.SMALL;
|
||||||
return null;
|
|
||||||
return defaultBlockState().setValue(AXIS, axisAlongFirst ? Axis.X : Axis.Z);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Class<? extends BogeyRenderer> getRendererClass() {
|
|
||||||
return StandardBogeyRenderer.class;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BogeyRenderer getRenderer() {
|
|
||||||
return this.renderer;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isTrackAxisAlongFirstCoordinate(BlockState state) {
|
|
||||||
return state.getValue(AXIS) == Axis.X;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@OnlyIn(Dist.CLIENT)
|
|
||||||
public void render(BlockState state, float wheelAngle, PoseStack ms, float partialTicks, MultiBufferSource buffers,
|
|
||||||
int light, int overlay) {
|
|
||||||
if (state != null) {
|
|
||||||
ms.translate(.5f, .5f, .5f);
|
|
||||||
if (state.getValue(AXIS) == Axis.X)
|
|
||||||
ms.mulPose(Vector3f.YP.rotationDegrees(90));
|
|
||||||
}
|
|
||||||
|
|
||||||
ms.translate(0, -1.5 - 1 / 128f, 0);
|
|
||||||
|
|
||||||
VertexConsumer vb = buffers.getBuffer(RenderType.cutoutMipped());
|
|
||||||
BlockState air = Blocks.AIR.defaultBlockState();
|
|
||||||
|
|
||||||
for (int i : Iterate.zeroAndOne)
|
|
||||||
CachedBufferer.block(AllBlocks.SHAFT.getDefaultState()
|
|
||||||
.setValue(ShaftBlock.AXIS, Axis.Z))
|
|
||||||
.translate(-.5f, .25f, i * -1)
|
|
||||||
.centre()
|
|
||||||
.rotateZ(wheelAngle)
|
|
||||||
.unCentre()
|
|
||||||
.light(light)
|
|
||||||
.renderInto(ms, vb);
|
|
||||||
|
|
||||||
if (large) {
|
|
||||||
renderer.render(new CompoundTag(), wheelAngle, ms, light, vb, BogeyRenderer.BogeySize.LARGE);
|
|
||||||
} else {
|
|
||||||
renderer.render(new CompoundTag(), wheelAngle, ms, light, vb, BogeyRenderer.BogeySize.SMALL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void renderBogey(float wheelAngle, PoseStack ms, int light, VertexConsumer vb, BlockState air) {
|
|
||||||
CachedBufferer.partial(AllBlockPartials.BOGEY_FRAME, air)
|
|
||||||
.scale(1 - 1 / 512f)
|
|
||||||
.light(light)
|
|
||||||
.renderInto(ms, vb);
|
|
||||||
|
|
||||||
for (int side : Iterate.positiveAndNegative) {
|
|
||||||
ms.pushPose();
|
|
||||||
CachedBufferer.partial(AllBlockPartials.SMALL_BOGEY_WHEELS, air)
|
|
||||||
.translate(0, 12 / 16f, side)
|
|
||||||
.rotateX(wheelAngle)
|
|
||||||
.light(light)
|
|
||||||
.renderInto(ms, vb);
|
|
||||||
ms.popPose();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void renderLargeBogey(float wheelAngle, PoseStack ms, int light, VertexConsumer vb, BlockState air) {
|
|
||||||
for (int i : Iterate.zeroAndOne)
|
|
||||||
CachedBufferer.block(AllBlocks.SHAFT.getDefaultState()
|
|
||||||
.setValue(ShaftBlock.AXIS, Axis.X))
|
|
||||||
.translate(-.5f, .25f, .5f + i * -2)
|
|
||||||
.centre()
|
|
||||||
.rotateX(wheelAngle)
|
|
||||||
.unCentre()
|
|
||||||
.light(light)
|
|
||||||
.renderInto(ms, vb);
|
|
||||||
|
|
||||||
CachedBufferer.partial(AllBlockPartials.BOGEY_DRIVE, air)
|
|
||||||
.scale(1 - 1 / 512f)
|
|
||||||
.light(light)
|
|
||||||
.renderInto(ms, vb);
|
|
||||||
CachedBufferer.partial(AllBlockPartials.BOGEY_PISTON, air)
|
|
||||||
.translate(0, 0, 1 / 4f * Math.sin(AngleHelper.rad(wheelAngle)))
|
|
||||||
.light(light)
|
|
||||||
.renderInto(ms, vb);
|
|
||||||
|
|
||||||
ms.pushPose();
|
|
||||||
CachedBufferer.partial(AllBlockPartials.LARGE_BOGEY_WHEELS, air)
|
|
||||||
.translate(0, 1, 0)
|
|
||||||
.rotateX(wheelAngle)
|
|
||||||
.light(light)
|
|
||||||
.renderInto(ms, vb);
|
|
||||||
CachedBufferer.partial(AllBlockPartials.BOGEY_PIN, air)
|
|
||||||
.translate(0, 1, 0)
|
|
||||||
.rotateX(wheelAngle)
|
|
||||||
.translate(0, 1 / 4f, 0)
|
|
||||||
.rotateX(-wheelAngle)
|
|
||||||
.light(light)
|
|
||||||
.renderInto(ms, vb);
|
|
||||||
ms.popPose();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BogeyInstance createInstance(MaterialManager materialManager, CarriageBogey bogey) {
|
|
||||||
if (large) {
|
|
||||||
return StandardBogeyInstance.drive(bogey, materialManager);
|
|
||||||
} else {
|
|
||||||
return StandardBogeyInstance.frame(bogey, materialManager);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public BlockState rotate(BlockState pState, Rotation pRotation) {
|
|
||||||
return switch (pRotation) {
|
|
||||||
case COUNTERCLOCKWISE_90, CLOCKWISE_90 -> pState.cycle(AXIS);
|
|
||||||
default -> pState;
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -250,10 +70,4 @@ public class StandardBogeyBlock extends Block
|
||||||
public BlockEntityType<? extends StandardBogeyTileEntity> getTileEntityType() {
|
public BlockEntityType<? extends StandardBogeyTileEntity> getTileEntityType() {
|
||||||
return AllTileEntities.BOGEY.get();
|
return AllTileEntities.BOGEY.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public ItemRequirement getRequiredItems(BlockState state, BlockEntity te) {
|
|
||||||
return new ItemRequirement(ItemUseType.CONSUME, AllBlocks.RAILWAY_CASING.asStack());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
package com.simibubi.create.content.logistics.trains.track;
|
package com.simibubi.create.content.logistics.trains.track;
|
||||||
|
|
||||||
import com.simibubi.create.content.logistics.trains.IBogeyBlock;
|
import com.simibubi.create.content.logistics.trains.AbstractBogeyBlock;
|
||||||
import com.simibubi.create.foundation.tileEntity.CachedRenderBBTileEntity;
|
import com.simibubi.create.foundation.tileEntity.CachedRenderBBTileEntity;
|
||||||
import com.simibubi.create.foundation.utility.animation.LerpedFloat;
|
import com.simibubi.create.foundation.utility.animation.LerpedFloat;
|
||||||
|
|
||||||
|
@ -21,16 +21,15 @@ public class StandardBogeyTileEntity extends CachedRenderBBTileEntity {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ponder
|
// Ponder
|
||||||
|
|
||||||
LerpedFloat virtualAnimation = LerpedFloat.angular();
|
LerpedFloat virtualAnimation = LerpedFloat.angular();
|
||||||
|
|
||||||
public float getVirtualAngle(float partialTicks) {
|
public float getVirtualAngle(float partialTicks) {
|
||||||
return virtualAnimation.getValue(partialTicks);
|
return virtualAnimation.getValue(partialTicks);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void animate(float distanceMoved) {
|
public void animate(float distanceMoved) {
|
||||||
BlockState blockState = getBlockState();
|
BlockState blockState = getBlockState();
|
||||||
if (!(blockState.getBlock() instanceof IBogeyBlock type))
|
if (!(blockState.getBlock() instanceof AbstractBogeyBlock type))
|
||||||
return;
|
return;
|
||||||
double angleDiff = 360 * distanceMoved / (Math.PI * 2 * type.getWheelRadius());
|
double angleDiff = 360 * distanceMoved / (Math.PI * 2 * type.getWheelRadius());
|
||||||
double newWheelAngle = (virtualAnimation.getValue() - angleDiff) % 360;
|
double newWheelAngle = (virtualAnimation.getValue() - angleDiff) % 360;
|
||||||
|
|
|
@ -33,7 +33,7 @@ import com.simibubi.create.content.curiosities.deco.SlidingDoorMovementBehaviour
|
||||||
import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock;
|
import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock;
|
||||||
import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock.Shape;
|
import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock.Shape;
|
||||||
import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelItem;
|
import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelItem;
|
||||||
import com.simibubi.create.content.logistics.trains.IBogeyBlock;
|
import com.simibubi.create.content.logistics.trains.AbstractBogeyBlock;
|
||||||
import com.simibubi.create.content.logistics.trains.track.StandardBogeyBlock;
|
import com.simibubi.create.content.logistics.trains.track.StandardBogeyBlock;
|
||||||
import com.simibubi.create.foundation.block.BlockStressDefaults;
|
import com.simibubi.create.foundation.block.BlockStressDefaults;
|
||||||
import com.simibubi.create.foundation.block.ItemUseOverrides;
|
import com.simibubi.create.foundation.block.ItemUseOverrides;
|
||||||
|
@ -88,7 +88,7 @@ public class BuilderTransformers {
|
||||||
.blockstate((c, p) -> BlockStateGen.horizontalAxisBlock(c, p, s -> p.models()
|
.blockstate((c, p) -> BlockStateGen.horizontalAxisBlock(c, p, s -> p.models()
|
||||||
.getExistingFile(p.modLoc("block/track/bogey/top"))))
|
.getExistingFile(p.modLoc("block/track/bogey/top"))))
|
||||||
.loot((p, l) -> p.dropOther(l, AllBlocks.RAILWAY_CASING.get()))
|
.loot((p, l) -> p.dropOther(l, AllBlocks.RAILWAY_CASING.get()))
|
||||||
.onRegister(block -> IBogeyBlock.register(RegisteredObjects.getKeyOrThrow(block)));
|
.onRegister(block -> AbstractBogeyBlock.register(RegisteredObjects.getKeyOrThrow(block)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <B extends TrapDoorBlock, P> NonNullUnaryOperator<BlockBuilder<B, P>> trapdoor(boolean orientable) {
|
public static <B extends TrapDoorBlock, P> NonNullUnaryOperator<BlockBuilder<B, P>> trapdoor(boolean orientable) {
|
||||||
|
|
Loading…
Reference in a new issue