From 68ca0974c6867e61980990a345634963079faf10 Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Sun, 2 Apr 2023 16:47:58 +0100 Subject: [PATCH] Implemented Style Cycling & Default Values --- .../logistics/trains/AbstractBogeyBlock.java | 98 ++++++++++++++++--- .../logistics/trains/entity/BogeyStyle.java | 7 +- .../entity/CarriageContraptionInstance.java | 3 +- .../logistics/trains/entity/Train.java | 21 +++- .../edgePoint/station/StationTileEntity.java | 1 - .../trains/track/StandardBogeyTileEntity.java | 7 +- .../create/foundation/utility/Iterate.java | 9 ++ 7 files changed, 119 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/AbstractBogeyBlock.java b/src/main/java/com/simibubi/create/content/logistics/trains/AbstractBogeyBlock.java index 8e907c3ad..f5d6a13a8 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/AbstractBogeyBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/AbstractBogeyBlock.java @@ -1,11 +1,11 @@ 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.Collection; +import java.util.Comparator; import java.util.EnumSet; import java.util.List; +import java.util.Optional; import javax.annotation.Nullable; @@ -14,8 +14,8 @@ import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.math.Vector3f; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBogeyStyles; +import com.simibubi.create.AllItems; import com.simibubi.create.AllRegistries; -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; @@ -23,27 +23,33 @@ 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.NBTHelper; +import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.utility.Lang; 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.network.chat.TranslatableComponent; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; 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.BlockHitResult; import net.minecraft.world.phys.Vec3; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -102,7 +108,7 @@ public abstract class AbstractBogeyBlock extends Block implements ITE styles = AllRegistries.BOGEY_REGISTRY.get().getValues(); + + if (styles.size() <= 1) + return InteractionResult.SUCCESS; + + BlockEntity be = level.getBlockEntity(pos); + + if (!(be instanceof StandardBogeyTileEntity sbte)) + return InteractionResult.FAIL; + + player.getCooldowns().addCooldown(stack.getItem(), 20); + BogeyStyle currentStyle = sbte.getStyle(); + + Optional style = styles.stream() + .map(s -> getNextStyle(currentStyle)) + .filter(s -> s.validSizes().contains(getSize())) + .findFirst(); + if (style.isPresent()) { + player.displayClientMessage(Lang.translateDirect("create.bogey.style.updated_style"), true); + sbte.setBogeyStyle(style.get()); + return InteractionResult.CONSUME; + } else { + player.displayClientMessage(Lang.translateDirect("create.bogey.style.no_other_sizes"), true); + return InteractionResult.FAIL; + } + } + + return InteractionResult.PASS; + } @Override public BlockState getRotatedBlockState(BlockState state, Direction targetedFace) { @@ -137,8 +180,8 @@ public abstract class AbstractBogeyBlock extends Block implements ITE allStyles = AllRegistries.BOGEY_REGISTRY.get().getValues(); + if (allStyles.size() <= 1) + return style; + List list = new ArrayList<>(allStyles); + list.sort(Comparator.comparing(BogeyStyle::getRegistryName)); + return Iterate.cycleValue(list, style); + } + @Override public @NotNull BlockState rotate(@NotNull BlockState pState, Rotation pRotation) { return switch (pRotation) { @@ -170,9 +245,4 @@ public abstract class AbstractBogeyBlock extends Block implements ITE implements IForgeRegistryEntry { public Map blocks = new EnumMap<>(BogeySize.class); - public BogeyInstance.BogeyInstanceFactory instanceFactory; public Component displayName; public SoundType soundType; public CompoundTag defaultData; public BogeyRenderer renderer; - public BogeyStyle(BogeyInstance.BogeyInstanceFactory factory) { - this.instanceFactory = factory; - } - public void addBlockForSize(BogeySize size, T block) { this.addBlockForSize(size, block.getRegistryName()); } @@ -59,6 +54,6 @@ public final class BogeyStyle extends ForgeRegistryEntry implements } public BogeyInstance createInstance(CarriageBogey bogey, BogeySize size, MaterialManager materialManager) { - return instanceFactory.create(bogey, size, materialManager); + return new BogeyInstance(bogey, this.renderer.newInstance(), size, materialManager); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageContraptionInstance.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageContraptionInstance.java index 7701ad5e8..bad27cb9d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageContraptionInstance.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageContraptionInstance.java @@ -31,7 +31,8 @@ public class CarriageContraptionInstance extends EntityInstance + bogey.style.createInstance(bogey, bogey.type.getSize(), manager), materialManager); updateLight(); } diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/Train.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/Train.java index a5a371013..280061901 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/Train.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/Train.java @@ -17,6 +17,10 @@ import java.util.function.Consumer; import javax.annotation.Nullable; +import com.simibubi.create.content.logistics.trains.track.StandardBogeyTileEntity; + +import net.minecraft.world.level.block.entity.BlockEntity; + import org.apache.commons.lang3.mutable.MutableBoolean; import org.apache.commons.lang3.mutable.MutableObject; @@ -124,7 +128,7 @@ public class Train { public int honkPitch; public float accumulatedSteamRelease; - + int tickOffset; double[] stress; @@ -277,7 +281,7 @@ public class Train { int carriageCount = carriages.size(); boolean stalled = false; double maxStress = 0; - + if (carriageWaitingForChunks != -1) distance = 0; @@ -317,7 +321,7 @@ public class Train { entries++; } } - + if (entries > 0) actual = total / entries; @@ -369,7 +373,7 @@ public class Train { .getLeadingPoint(); double totalStress = derailed ? 0 : leadingStress + trailingStress; - + boolean first = i == 0; boolean last = i == carriageCount - 1; int carriageType = first ? last ? Carriage.BOTH : Carriage.FIRST : last ? Carriage.LAST : Carriage.MIDDLE; @@ -725,6 +729,15 @@ public class Train { .atLowerCornerOf(pos.relative(assemblyDirection, backwards ? offset + carriage.bogeySpacing : offset))); entity.disassemble(); + for (CarriageBogey bogey : carriage.bogeys) { + Vec3 bogeyPosition = bogey.getAnchorPosition(); + if (bogeyPosition == null) continue; + BlockEntity be = level.getBlockEntity(new BlockPos(bogeyPosition)); + if (!(be instanceof StandardBogeyTileEntity sbte)) + continue; + sbte.setBogeyStyle(bogey.style); + } + offset += carriage.bogeySpacing; if (i < carriageSpacing.size()) diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationTileEntity.java index 514e114af..c7b269475 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/management/edgePoint/station/StationTileEntity.java @@ -31,7 +31,6 @@ import com.simibubi.create.content.logistics.trains.TrackNodeLocation.Discovered import com.simibubi.create.content.logistics.trains.entity.Carriage; import com.simibubi.create.content.logistics.trains.entity.CarriageBogey; import com.simibubi.create.content.logistics.trains.entity.CarriageContraption; -import com.simibubi.create.content.logistics.trains.entity.StandardBogeyInstance; import com.simibubi.create.content.logistics.trains.entity.Train; import com.simibubi.create.content.logistics.trains.entity.TrainPacket; import com.simibubi.create.content.logistics.trains.entity.TravellingPoint; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/track/StandardBogeyTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/trains/track/StandardBogeyTileEntity.java index a325146e4..5ff5e713d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/track/StandardBogeyTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/track/StandardBogeyTileEntity.java @@ -18,6 +18,8 @@ import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; +import org.jetbrains.annotations.NotNull; + public class StandardBogeyTileEntity extends CachedRenderBBTileEntity { private BogeyStyle style; public CompoundTag bogeyData; @@ -26,12 +28,15 @@ public class StandardBogeyTileEntity extends CachedRenderBBTileEntity { super(type, pos, state); } - public void setBogeyStyle(BogeyStyle style) { + public void setBogeyStyle(@NotNull BogeyStyle style) { this.style = style; markUpdated(); } + @NotNull public BogeyStyle getStyle() { + if (this.style == null) + setBogeyStyle(AllBogeyStyles.STANDARD.get()); return this.style; } diff --git a/src/main/java/com/simibubi/create/foundation/utility/Iterate.java b/src/main/java/com/simibubi/create/foundation/utility/Iterate.java index e8e541aa1..0e072cf38 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/Iterate.java +++ b/src/main/java/com/simibubi/create/foundation/utility/Iterate.java @@ -45,4 +45,13 @@ public class Iterate { public static List hereBelowAndAbove(BlockPos pos) { return Arrays.asList(pos, pos.below(), pos.above()); } + + public static T cycleValue(List list, T current) { + int currentIndex = list.indexOf(current); + if (currentIndex == -1) { + throw new IllegalArgumentException("Current value not found in list"); + } + int nextIndex = (currentIndex + 1) % list.size(); + return list.get(nextIndex); + } }