diff --git a/src/main/java/com/simibubi/create/AllBogeyStyles.java b/src/main/java/com/simibubi/create/AllBogeyStyles.java index d96ca73de..24ceb65d5 100644 --- a/src/main/java/com/simibubi/create/AllBogeyStyles.java +++ b/src/main/java/com/simibubi/create/AllBogeyStyles.java @@ -2,8 +2,8 @@ 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.TestBogeyRenderer; 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; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; @@ -13,12 +13,26 @@ import static com.simibubi.create.Create.REGISTRATE; @SuppressWarnings("unused") public class AllBogeyStyles { public static final RegistryEntry STANDARD = REGISTRATE - .bogeyStyle("standard", new BogeyStyle(StandardBogeyInstance.getInstanceFactory())) + .bogeyStyle("standard", new BogeyStyle()) .block(BogeyRenderer.BogeySize.SMALL, AllBlocks.SMALL_BOGEY) .block(BogeyRenderer.BogeySize.LARGE, AllBlocks.LARGE_BOGEY) .renderer(new StandardBogeyRenderer()) .register(); + public static final RegistryEntry TEST = REGISTRATE + .bogeyStyle("test", new BogeyStyle()) + .block(BogeyRenderer.BogeySize.SMALL, AllBlocks.SMALL_BOGEY) + .block(BogeyRenderer.BogeySize.LARGE, AllBlocks.LARGE_BOGEY) + .renderer(new TestBogeyRenderer()) + .register(); + + public static final RegistryEntry TEST_TWO = REGISTRATE + .bogeyStyle("test_two", new BogeyStyle()) + .block(BogeyRenderer.BogeySize.SMALL, AllBlocks.SMALL_BOGEY) + .block(BogeyRenderer.BogeySize.LARGE, AllBlocks.LARGE_BOGEY) + .renderer(new TestBogeyRenderer()) + .register(); + public static void register() { LOGGER.info("Registered bogey styles from " + Create.ID); AllRegistries.DEFERRED_BOGEY_REGISTRY.register(FMLJavaModLoadingContext.get().getModEventBus()); 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 f5d6a13a8..6380c076b 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 @@ -116,7 +116,7 @@ public abstract class AbstractBogeyBlock extends Block implements ITE 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()); @@ -181,7 +182,6 @@ public abstract class AbstractBogeyBlock extends Block implements ITE tp.write(dimensions))); - if (style.getRegistryName() != null) - NBTHelper.writeResourceLocation(tag, "bogeyStyle", style.getRegistryName()); + tag.put(BOGEY_STYLE_KEY, bogeyData); return tag; } @@ -174,12 +171,23 @@ 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)); - ResourceLocation styleLocation = NBTHelper.readResourceLocation(tag,"bogeyStyle"); - return CarriageBogey.fromLocation(type, styleLocation, points.getFirst(), points.getSecond()); + CompoundTag data = tag.getCompound(StandardBogeyTileEntity.BOGEY_DATA_KEY); + return new CarriageBogey(type, data, points.getFirst(), points.getSecond()); } public BogeyInstance createInstance(MaterialManager materialManager) { - return style.createInstance(this, type.getSize(), materialManager); + return this.getStyle().createInstance(this, type.getSize(), materialManager); + } + + public BogeyStyle getStyle() { + ResourceLocation location = NBTHelper.readResourceLocation(this.bogeyData, BOGEY_STYLE_KEY); + return AllRegistries.BOGEY_REGISTRY.get().getValue(location); + } + + private CompoundTag createBogeyData() { + CompoundTag nbt = new CompoundTag(); + NBTHelper.writeResourceLocation(nbt, BOGEY_STYLE_KEY, AllBogeyStyles.STANDARD.getId()); + return nbt; } void setLeading() { 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 bad27cb9d..f9f4eb7ae 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 @@ -32,7 +32,7 @@ public class CarriageContraptionInstance extends EntityInstance - bogey.style.createInstance(bogey, bogey.type.getSize(), manager), materialManager); + bogey.getStyle().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 280061901..c56137ff8 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 @@ -735,7 +735,7 @@ public class Train { BlockEntity be = level.getBlockEntity(new BlockPos(bogeyPosition)); if (!(be instanceof StandardBogeyTileEntity sbte)) continue; - sbte.setBogeyStyle(bogey.style); + sbte.setBogeyData(bogey.bogeyData); } offset += carriage.bogeySpacing; 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 86cf2bba0..73ed8b505 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 @@ -14,6 +14,7 @@ import com.simibubi.create.foundation.utility.Couple; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.RegisteredObjects; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; @@ -52,8 +53,8 @@ public class TrainPacket extends SimplePacketBase { if (!isFirst && !buffer.readBoolean()) continue; AbstractBogeyBlock type = (AbstractBogeyBlock) ForgeRegistries.BLOCKS.getValue(buffer.readResourceLocation()); - BogeyStyle style = AllRegistries.BOGEY_REGISTRY.get().getValue(buffer.readResourceLocation()); - bogies.set(isFirst, new CarriageBogey(type, style, new TravellingPoint(), new TravellingPoint())); + CompoundTag data = buffer.readNbt(); + bogies.set(isFirst, new CarriageBogey(type, data, new TravellingPoint(), new TravellingPoint())); } int spacing = buffer.readVarInt(); carriages.add(new Carriage(bogies.getFirst(), bogies.getSecond(), spacing)); @@ -91,7 +92,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.writeNbt(bogey.bogeyData); } 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 c7b269475..3fd50bbb8 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 @@ -598,7 +598,7 @@ public class StationTileEntity extends SmartTileEntity implements ITransformable BlockPos firstBogeyPos = contraption.anchor; StandardBogeyTileEntity firstBogeyTileEntity = (StandardBogeyTileEntity) level.getBlockEntity(firstBogeyPos); CarriageBogey firstBogey = - new CarriageBogey(typeOfFirstBogey, firstBogeyTileEntity.getStyle(), points.get(pointIndex), points.get(pointIndex + 1)); + new CarriageBogey(typeOfFirstBogey, firstBogeyTileEntity.getBogeyData(), points.get(pointIndex), points.get(pointIndex + 1)); CarriageBogey secondBogey = null; BlockPos secondBogeyPos = contraption.getSecondBogeyPos(); int bogeySpacing = 0; @@ -613,7 +613,7 @@ public class StationTileEntity extends SmartTileEntity implements ITransformable StandardBogeyTileEntity secondBogeyTileEntity = (StandardBogeyTileEntity) level.getBlockEntity(secondBogeyPos); bogeySpacing = bogeyLocations[bogeyIndex + 1] - bogeyLocations[bogeyIndex]; - secondBogey = new CarriageBogey(bogeyTypes[bogeyIndex + 1], secondBogeyTileEntity.getStyle(), + secondBogey = new CarriageBogey(bogeyTypes[bogeyIndex + 1], secondBogeyTileEntity.getBogeyData(), points.get(pointIndex + 2), points.get(pointIndex + 3)); bogeyIndex++; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/track/StandardBogeyBlock.java b/src/main/java/com/simibubi/create/content/logistics/trains/track/StandardBogeyBlock.java index b5e2f4707..a4124189f 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/track/StandardBogeyBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/track/StandardBogeyBlock.java @@ -20,9 +20,9 @@ import net.minecraft.world.phys.Vec3; public class StandardBogeyBlock extends AbstractBogeyBlock implements ITE, ProperWaterloggedBlock, ISpecialBlockItemRequirement { private final BogeyRenderer.BogeySize size; - public StandardBogeyBlock(Properties props, BogeyRenderer.BogeySize large) { + public StandardBogeyBlock(Properties props, BogeyRenderer.BogeySize size) { super(props); - this.size = large; + this.size = size; registerDefaultState(defaultBlockState().setValue(WATERLOGGED, false)); } 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 5ff5e713d..8077152e5 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 @@ -7,62 +7,81 @@ 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.RegisteredObjects; 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; - +; import org.jetbrains.annotations.NotNull; public class StandardBogeyTileEntity extends CachedRenderBBTileEntity { - private BogeyStyle style; - public CompoundTag bogeyData; + public static String BOGEY_STYLE_KEY = "BogeyStyle"; + public static String BOGEY_DATA_KEY = "BogeyData"; + + private CompoundTag bogeyData; public StandardBogeyTileEntity(BlockEntityType type, BlockPos pos, BlockState state) { super(type, pos, state); } + public CompoundTag getBogeyData() { + if (this.bogeyData == null || !this.bogeyData.contains(BOGEY_STYLE_KEY)) + this.bogeyData = this.createBogeyData(); + return this.bogeyData; + } + + public void setBogeyData(@NotNull CompoundTag newData) { + if (!newData.contains(BOGEY_STYLE_KEY)) { + ResourceLocation style = AllBogeyStyles.STANDARD.getId(); + NBTHelper.writeResourceLocation(newData, BOGEY_STYLE_KEY, style); + } + this.bogeyData = newData; + } + public void setBogeyStyle(@NotNull BogeyStyle style) { - this.style = style; + ResourceLocation location = RegisteredObjects.getKeyOrThrow(AllRegistries.BOGEY_REGISTRY.get(), style); + CompoundTag data = this.getBogeyData(); + NBTHelper.writeResourceLocation(data, BOGEY_STYLE_KEY, location); markUpdated(); } @NotNull public BogeyStyle getStyle() { - if (this.style == null) - setBogeyStyle(AllBogeyStyles.STANDARD.get()); - return this.style; + CompoundTag data = this.getBogeyData(); + ResourceLocation currentStyle = NBTHelper.readResourceLocation(data, BOGEY_STYLE_KEY); + BogeyStyle style = AllRegistries.BOGEY_REGISTRY.get().getValue(currentStyle); + if (style == null) setBogeyStyle(AllBogeyStyles.STANDARD.get()); + return 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); + protected void saveAdditional(@NotNull CompoundTag pTag) { + CompoundTag data = this.getBogeyData(); + if (data != null) pTag.put(BOGEY_DATA_KEY, data); // Now contains style 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"); + if (pTag.contains(BOGEY_DATA_KEY)) + this.bogeyData = pTag.getCompound(BOGEY_DATA_KEY); + else + this.bogeyData = this.createBogeyData(); super.load(pTag); } + private CompoundTag createBogeyData() { + CompoundTag nbt = new CompoundTag(); + NBTHelper.writeResourceLocation(nbt, BOGEY_STYLE_KEY, AllBogeyStyles.STANDARD.getId()); + return nbt; + } + @Override protected AABB createRenderBoundingBox() { return super.createRenderBoundingBox().inflate(2);