diff --git a/src/main/java/com/simibubi/create/AllBogeyStyles.java b/src/main/java/com/simibubi/create/AllBogeyStyles.java index 4f19f70d2..d96ca73de 100644 --- a/src/main/java/com/simibubi/create/AllBogeyStyles.java +++ b/src/main/java/com/simibubi/create/AllBogeyStyles.java @@ -1,6 +1,7 @@ package com.simibubi.create; import com.simibubi.create.content.logistics.trains.BogeyRenderer; +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.StandardBogeyInstance; import com.tterrag.registrate.util.entry.RegistryEntry; @@ -12,9 +13,10 @@ import static com.simibubi.create.Create.REGISTRATE; @SuppressWarnings("unused") public class AllBogeyStyles { public static final RegistryEntry STANDARD = REGISTRATE - .bogeyStyle("standard", new BogeyStyle()) + .bogeyStyle("standard", new BogeyStyle(StandardBogeyInstance.getInstanceFactory())) .block(BogeyRenderer.BogeySize.SMALL, AllBlocks.SMALL_BOGEY) .block(BogeyRenderer.BogeySize.LARGE, AllBlocks.LARGE_BOGEY) + .renderer(new StandardBogeyRenderer()) .register(); public static void register() { 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 559244bf3..8e907c3ad 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 @@ -13,6 +13,8 @@ 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.AllBogeyStyles; +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; @@ -21,6 +23,7 @@ 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.RegisteredObjects; import net.minecraft.client.renderer.MultiBufferSource; @@ -98,8 +101,8 @@ public abstract class AbstractBogeyBlock extends Block implements ITE extends SafeTileEnti protected void renderSafe(T te, float partialTicks, PoseStack ms, MultiBufferSource buffer, int light, int overlay) { BlockState blockState = te.getBlockState(); - float angle = 0; - if (te instanceof StandardBogeyTileEntity sbte) - angle = sbte.getVirtualAngle(partialTicks); - if (blockState.getBlock()instanceof AbstractBogeyBlock bogey) - bogey.render(blockState, angle, ms, partialTicks, buffer, light, overlay, te.getTileData()); + if (te instanceof StandardBogeyTileEntity sbte) { + float angle = sbte.getVirtualAngle(partialTicks); + if (blockState.getBlock() instanceof AbstractBogeyBlock bogey) + bogey.render(blockState, angle, ms, partialTicks, buffer, light, overlay, sbte); + } } } diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/BogeyInstance.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/BogeyInstance.java index 9eb349124..41ac357d3 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/BogeyInstance.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/BogeyInstance.java @@ -39,8 +39,6 @@ public abstract class BogeyInstance { renderer.initialiseContraptionModelData(materialManager, size); } - public abstract BogeyInstanceFactory getInstanceFactory(); - protected void hiddenFrame() { beginFrame(0, null); } diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/BogeyStyle.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/BogeyStyle.java index 857c47354..26100df37 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/BogeyStyle.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/BogeyStyle.java @@ -22,12 +22,16 @@ import java.util.stream.Stream; public final class BogeyStyle extends ForgeRegistryEntry implements IForgeRegistryEntry { public Map blocks = new EnumMap<>(BogeySize.class); - public BogeyInstance.BogeyInstanceFactory instance; + 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()); } @@ -55,6 +59,6 @@ public final class BogeyStyle extends ForgeRegistryEntry implements } public BogeyInstance createInstance(CarriageBogey bogey, BogeySize size, MaterialManager materialManager) { - return instance.create(bogey, size, materialManager); + return instanceFactory.create(bogey, size, materialManager); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageBogey.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageBogey.java index 7c9b1aee7..c6b21a202 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageBogey.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageBogey.java @@ -3,6 +3,8 @@ package com.simibubi.create.content.logistics.trains.entity; import javax.annotation.Nullable; import com.jozufozu.flywheel.api.MaterialManager; +import com.simibubi.create.AllBogeyStyles; +import com.simibubi.create.AllRegistries; import com.simibubi.create.Create; import com.simibubi.create.content.logistics.trains.DimensionPalette; import com.simibubi.create.content.logistics.trains.AbstractBogeyBlock; @@ -10,6 +12,7 @@ import com.simibubi.create.content.logistics.trains.TrackGraph; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.Couple; import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.RegisteredObjects; import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.animation.LerpedFloat; @@ -25,12 +28,16 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.phys.Vec3; import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.NotNull; + public class CarriageBogey { public Carriage carriage; - boolean isLeading; + public BogeyStyle style = AllBogeyStyles.STANDARD.get(); + public CompoundTag bogeyData; + AbstractBogeyBlock type; Couple points; @@ -42,7 +49,14 @@ public class CarriageBogey { int derailAngle; - public CarriageBogey(AbstractBogeyBlock type, TravellingPoint point, TravellingPoint point2) { + public static CarriageBogey fromLocation(AbstractBogeyBlock type, ResourceLocation style, TravellingPoint point, TravellingPoint point2) { + BogeyStyle bogeyStyle = AllRegistries.BOGEY_REGISTRY.get().getValue(style); + return new CarriageBogey(type, bogeyStyle, point, point2); + } + + public CarriageBogey(AbstractBogeyBlock type, BogeyStyle style, TravellingPoint point, TravellingPoint point2) { + if (style != null) + this.style = style; this.type = type; points = Couple.create(point, point2); wheelAngle = LerpedFloat.angular(); @@ -150,6 +164,8 @@ public class CarriageBogey { tag.putString("Type", RegisteredObjects.getKeyOrThrow((Block) type) .toString()); tag.put("Points", points.serializeEach(tp -> tp.write(dimensions))); + if (style.getRegistryName() != null) + NBTHelper.writeResourceLocation(tag, "bogeyStyle", style.getRegistryName()); return tag; } @@ -158,12 +174,12 @@ public class CarriageBogey { AbstractBogeyBlock type = (AbstractBogeyBlock) ForgeRegistries.BLOCKS.getValue(location); Couple points = Couple.deserializeEach(tag.getList("Points", Tag.TAG_COMPOUND), c -> TravellingPoint.read(c, graph, dimensions)); - CarriageBogey carriageBogey = new CarriageBogey(type, points.getFirst(), points.getSecond()); - return carriageBogey; + ResourceLocation styleLocation = NBTHelper.readResourceLocation(tag,"bogeyStyle"); + return CarriageBogey.fromLocation(type, styleLocation, points.getFirst(), points.getSecond()); } public BogeyInstance createInstance(MaterialManager materialManager) { - return type.getStyle().createInstance(this, type.getSize(), materialManager); + return style.createInstance(this, type.getSize(), materialManager); } void setLeading() { diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageContraptionEntityRenderer.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageContraptionEntityRenderer.java index 071e152d6..06a9ce394 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageContraptionEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageContraptionEntityRenderer.java @@ -7,6 +7,8 @@ import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionEntityRenderer; +import com.simibubi.create.content.logistics.trains.track.StandardBogeyTileEntity; + import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.culling.Frustum; @@ -69,7 +71,7 @@ public class CarriageContraptionEntityRenderer extends ContraptionEntityRenderer BlockEntity be = entity.getContraption().presentTileEntities.get(bogeyPos); bogey.type.render(null, bogey.wheelAngle.getValue(partialTicks), ms, partialTicks, buffers, light, - overlay, be.getTileData()); + overlay, (StandardBogeyTileEntity) be); ms.popPose(); } diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/StandardBogeyInstance.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/StandardBogeyInstance.java index 09381c413..c00a6a078 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/StandardBogeyInstance.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/StandardBogeyInstance.java @@ -18,8 +18,7 @@ public class StandardBogeyInstance extends BogeyInstance { return new StandardBogeyInstance(bogey, BogeyRenderer.BogeySize.SMALL, materialManager); } - @Override - public BogeyInstanceFactory getInstanceFactory() { + public static BogeyInstanceFactory getInstanceFactory() { return StandardBogeyInstance::new; } } diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/TrainPacket.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/TrainPacket.java index 3976b5406..86cf2bba0 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/TrainPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/TrainPacket.java @@ -6,6 +6,7 @@ import java.util.Map; import java.util.UUID; import java.util.function.Supplier; +import com.simibubi.create.AllRegistries; import com.simibubi.create.CreateClient; import com.simibubi.create.content.logistics.trains.AbstractBogeyBlock; import com.simibubi.create.foundation.networking.SimplePacketBase; @@ -15,10 +16,13 @@ import com.simibubi.create.foundation.utility.RegisteredObjects; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.Block; import net.minecraftforge.network.NetworkEvent.Context; import net.minecraftforge.registries.ForgeRegistries; +import javax.annotation.Nullable; + public class TrainPacket extends SimplePacketBase { UUID trainId; @@ -44,11 +48,12 @@ public class TrainPacket extends SimplePacketBase { int size = buffer.readVarInt(); for (int i = 0; i < size; i++) { Couple bogies = Couple.create(null, null); - for (boolean first : Iterate.trueAndFalse) { - if (!first && !buffer.readBoolean()) + for (boolean isFirst : Iterate.trueAndFalse) { + if (!isFirst && !buffer.readBoolean()) continue; AbstractBogeyBlock type = (AbstractBogeyBlock) ForgeRegistries.BLOCKS.getValue(buffer.readResourceLocation()); - bogies.set(first, new CarriageBogey(type, new TravellingPoint(), new TravellingPoint())); + BogeyStyle style = AllRegistries.BOGEY_REGISTRY.get().getValue(buffer.readResourceLocation()); + bogies.set(isFirst, new CarriageBogey(type, style, new TravellingPoint(), new TravellingPoint())); } int spacing = buffer.readVarInt(); carriages.add(new Carriage(bogies.getFirst(), bogies.getSecond(), spacing)); @@ -86,6 +91,7 @@ public class TrainPacket extends SimplePacketBase { } CarriageBogey bogey = carriage.bogeys.get(first); buffer.writeResourceLocation(RegisteredObjects.getKeyOrThrow((Block) bogey.type)); + buffer.writeResourceLocation(RegisteredObjects.getKeyOrThrow(AllRegistries.BOGEY_REGISTRY.get(), bogey.style)); } buffer.writeVarInt(carriage.bogeySpacing); } 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 d1122cfeb..514e114af 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,6 +31,7 @@ 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; @@ -38,6 +39,7 @@ import com.simibubi.create.content.logistics.trains.management.edgePoint.EdgePoi import com.simibubi.create.content.logistics.trains.management.edgePoint.TrackTargetingBehaviour; import com.simibubi.create.content.logistics.trains.management.schedule.Schedule; import com.simibubi.create.content.logistics.trains.management.schedule.ScheduleItem; +import com.simibubi.create.content.logistics.trains.track.StandardBogeyTileEntity; import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.block.ProperWaterloggedBlock; import com.simibubi.create.foundation.config.AllConfigs; @@ -65,7 +67,9 @@ import net.minecraft.util.Mth; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; import net.minecraft.world.level.block.SoundType; +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.levelgen.structure.BoundingBox; @@ -592,8 +596,10 @@ public class StationTileEntity extends SmartTileEntity implements ITransformable } AbstractBogeyBlock typeOfFirstBogey = bogeyTypes[bogeyIndex]; + BlockPos firstBogeyPos = contraption.anchor; + StandardBogeyTileEntity firstBogeyTileEntity = (StandardBogeyTileEntity) level.getBlockEntity(firstBogeyPos); CarriageBogey firstBogey = - new CarriageBogey(typeOfFirstBogey, points.get(pointIndex), points.get(pointIndex + 1)); + new CarriageBogey(typeOfFirstBogey, firstBogeyTileEntity.getStyle(), points.get(pointIndex), points.get(pointIndex + 1)); CarriageBogey secondBogey = null; BlockPos secondBogeyPos = contraption.getSecondBogeyPos(); int bogeySpacing = 0; @@ -605,10 +611,11 @@ public class StationTileEntity extends SmartTileEntity implements ITransformable contraptions.size() + 1); return; } - + StandardBogeyTileEntity secondBogeyTileEntity = + (StandardBogeyTileEntity) level.getBlockEntity(secondBogeyPos); bogeySpacing = bogeyLocations[bogeyIndex + 1] - bogeyLocations[bogeyIndex]; - secondBogey = new CarriageBogey(bogeyTypes[bogeyIndex + 1], points.get(pointIndex + 2), - points.get(pointIndex + 3)); + secondBogey = new CarriageBogey(bogeyTypes[bogeyIndex + 1], secondBogeyTileEntity.getStyle(), + points.get(pointIndex + 2), points.get(pointIndex + 3)); bogeyIndex++; } else if (!typeOfFirstBogey.allowsSingleBogeyCarriage()) { 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 39417fd43..a325146e4 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 @@ -1,20 +1,63 @@ package com.simibubi.create.content.logistics.trains.track; +import com.simibubi.create.AllBogeyStyles; +import com.simibubi.create.AllRegistries; +import com.simibubi.create.content.contraptions.processing.BasinTileEntity; import com.simibubi.create.content.logistics.trains.AbstractBogeyBlock; +import com.simibubi.create.content.logistics.trains.entity.BogeyStyle; import com.simibubi.create.foundation.tileEntity.CachedRenderBBTileEntity; +import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.animation.LerpedFloat; import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; public class StandardBogeyTileEntity extends CachedRenderBBTileEntity { + private BogeyStyle style; + public CompoundTag bogeyData; public StandardBogeyTileEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); } + public void setBogeyStyle(BogeyStyle style) { + this.style = style; + markUpdated(); + } + + public BogeyStyle getStyle() { + return this.style; + } + + + @Override + protected void saveAdditional(CompoundTag pTag) { + if (style != null && style.getRegistryName() != null) + NBTHelper.writeResourceLocation(pTag, "bogeyStyle", style.getRegistryName()); + if (bogeyData != null) + pTag.put("bogeyData", bogeyData); + super.saveAdditional(pTag); + } + + @Override + public void load(CompoundTag pTag) { + if (pTag.contains("bogeyStyle")) { + ResourceLocation location = NBTHelper.readResourceLocation(pTag, "bogeyStyle"); + this.style = AllRegistries.BOGEY_REGISTRY.get().getValue(location); + } else { + this.style = AllBogeyStyles.STANDARD.get(); + } + if (pTag.contains("bogeyData")) + this.bogeyData = pTag.getCompound("bogeyData"); + super.load(pTag); + } + @Override protected AABB createRenderBoundingBox() { return super.createRenderBoundingBox().inflate(2); @@ -36,4 +79,10 @@ public class StandardBogeyTileEntity extends CachedRenderBBTileEntity { virtualAnimation.setValue(newWheelAngle); } + private void markUpdated() { + setChanged(); + Level level = getLevel(); + if (level != null) + getLevel().sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), 3); + } } diff --git a/src/main/java/com/simibubi/create/foundation/data/BogeyStyleBuilder.java b/src/main/java/com/simibubi/create/foundation/data/BogeyStyleBuilder.java index ac8c4c5ce..b25048dbc 100644 --- a/src/main/java/com/simibubi/create/foundation/data/BogeyStyleBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/data/BogeyStyleBuilder.java @@ -3,6 +3,7 @@ package com.simibubi.create.foundation.data; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllParticleTypes; import com.simibubi.create.AllRegistries; +import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.logistics.trains.BogeyRenderer; import com.simibubi.create.content.logistics.trains.AbstractBogeyBlock; import com.simibubi.create.content.logistics.trains.entity.BogeyStyle; @@ -34,7 +35,7 @@ import java.util.function.Supplier; public class BogeyStyleBuilder extends AbstractBuilder> { private final T style; private NonNullSupplier renderer; - private Supplier soundType; + private Supplier soundType; private Supplier data; private Supplier> particles; @@ -62,7 +63,6 @@ public class BogeyStyleBuilder extends AbstractBuilder< } public BogeyStyleBuilder soundType(SoundType soundEntry) { - this.soundType = () -> soundEntry; return this; } @@ -82,7 +82,6 @@ public class BogeyStyleBuilder extends AbstractBuilder< @Override protected @NotNull T createEntry() { - style.soundType = soundType.get(); style.defaultData = data.get(); style.renderer = renderer.get(); return style;