From a8a9491fa07777218c7de3fe780ae17e05d5ac03 Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Tue, 21 Mar 2023 22:34:54 +0000 Subject: [PATCH 01/53] Implemented Proof Of Concept Generic Bogey Renderer --- .../logistics/trains/BogeyRenderer.java | 111 ++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 src/main/java/com/simibubi/create/content/logistics/trains/BogeyRenderer.java diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/BogeyRenderer.java b/src/main/java/com/simibubi/create/content/logistics/trains/BogeyRenderer.java new file mode 100644 index 000000000..33b23bac7 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/BogeyRenderer.java @@ -0,0 +1,111 @@ +package com.simibubi.create.content.logistics.trains; + +import com.jozufozu.flywheel.core.PartialModel; +import com.jozufozu.flywheel.core.materials.model.ModelData; +import com.jozufozu.flywheel.util.transform.Transform; +import com.mojang.blaze3d.vertex.PoseStack; + +import com.mojang.blaze3d.vertex.VertexConsumer; + +import com.simibubi.create.foundation.render.CachedBufferer; +import com.simibubi.create.foundation.render.SuperByteBuffer; + +import net.minecraft.nbt.CompoundTag; + +import net.minecraft.world.level.block.Blocks; + +import net.minecraft.world.level.block.state.BlockState; + +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import org.jetbrains.annotations.Nullable; + +import java.util.Arrays; +import java.util.Collections; +import java.util.EnumMap; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +/* + * Proof of concept implementation of a common and generic bogey render + * - Model data is handled as a generic Transform which allows them to be modified in a common manner and then + * "finalised" seperately + * - Model instances (used for contraptions) are stored in a map keyed by the partial type, this should probably + * be replaced as it has a few drawbacks notably all model data is the same between sizes for the same type + * - Lighting and removal is automatically handled by collecting values from the map + * - Renderers are stored by type so they can be easily added or removed for specific sizes without individual + * overriden methods for each size + */ + +public abstract class BogeyRenderer { + Map renderers = new EnumMap<>(BogeySize.class); + Map contraptionModelData = new HashMap<>(); + + public Transform[] getTransformsFromPartial(PartialModel model, boolean inContraption, int size) { + return inContraption ? contraptionModelData.get(model) : createModelData(model, size); + } + + private Transform[] createModelData(PartialModel model, int size) { + BlockState air = Blocks.AIR.defaultBlockState(); + SuperByteBuffer[] data = { CachedBufferer.partial(model, air) }; + return Arrays.stream(Collections.nCopies(size, data).toArray()) + .flatMap(inner -> Arrays.stream((SuperByteBuffer[]) inner)) + .toArray(SuperByteBuffer[]::new); + } + + public Transform getTransformFromPartial(PartialModel model, boolean inContraption) { + BlockState air = Blocks.AIR.defaultBlockState(); + return inContraption ? contraptionModelData.get(model)[0] + : CachedBufferer.partial(model, air); + } + + @OnlyIn(Dist.CLIENT) + public void render(CompoundTag bogeyData, float wheelAngle, PoseStack ms, int light, @Nullable VertexConsumer vb, + BogeySize size) { + renderers.get(size).render(bogeyData, wheelAngle, ms, light, vb); + } + + @OnlyIn(Dist.CLIENT) + public void render(CompoundTag bogeyData, float wheelAngle, PoseStack ms, BogeySize size) { + this.render(bogeyData, wheelAngle, ms, 0, null, size); + } + + public static > void finalize(B b, PoseStack ms, int light, @Nullable VertexConsumer vb) { + b.scale(1 - 1/512f); + if (b instanceof SuperByteBuffer byteBuf && vb != null) + byteBuf.light(light).renderInto(ms, vb); + } + + public boolean styleImplementsSize(BogeySize size) { + return this.renderers.containsKey(size); + } + + public Set implementedSizes() { + return renderers.keySet(); + } + + public void updateLight(int blockLight, int skyLight) { + for (ModelData[] data : contraptionModelData.values()) + for (ModelData model : data) + model.setBlockLight(blockLight).setSkyLight(skyLight); + } + + public void remove() { + for (ModelData[] data : contraptionModelData.values()) + for (ModelData model : data) + model.delete(); + contraptionModelData.clear(); + } + + @FunctionalInterface + interface Renderer { + void render(CompoundTag bogeyData, float wheelAngle, PoseStack ms, int light, VertexConsumer vb); + } + + // TODO: REPLACE THIS SO THAT IT CAN BE ADDED TO + public enum BogeySize { + SMALL, LARGE; + } +} From 6672c49649026e6a6f9a71d9a0bc9411016bcfce Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Tue, 21 Mar 2023 22:37:36 +0000 Subject: [PATCH 02/53] Re-created standard bogey with test api --- .../trains/StandardBogeyRenderer.java | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 src/main/java/com/simibubi/create/content/logistics/trains/StandardBogeyRenderer.java diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/StandardBogeyRenderer.java b/src/main/java/com/simibubi/create/content/logistics/trains/StandardBogeyRenderer.java new file mode 100644 index 000000000..1a6f0a072 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/StandardBogeyRenderer.java @@ -0,0 +1,68 @@ +package com.simibubi.create.content.logistics.trains; + +import com.jozufozu.flywheel.util.transform.Transform; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; + +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.Iterate; + +import net.minecraft.nbt.CompoundTag; + +import org.jetbrains.annotations.Nullable; + +public class StandardBogeyRenderer extends BogeyRenderer { + + public StandardBogeyRenderer() { + renderers.put(BogeySize.SMALL, this::renderSmall); + renderers.put(BogeySize.LARGE, this::renderLarge); + } + + public void renderSmall(CompoundTag bogeyData, float wheelAngle, PoseStack ms, int light, + @Nullable VertexConsumer vb) { + boolean inContraption = vb != null; + Transform transform = getTransformFromPartial(AllBlockPartials.BOGEY_FRAME, inContraption); + finalize(transform, ms, light, vb); + + Transform[] wheels = getTransformsFromPartial(AllBlockPartials.SMALL_BOGEY_WHEELS, inContraption, 2); + for (int side : Iterate.positiveAndNegative) { + if (!inContraption) + ms.pushPose(); + Transform wheel = wheels[(side + 1)/2]; + wheel.translate(0, 12 / 16f, side) + .rotateX(wheelAngle); + finalize(wheel, ms, light, vb); + if (!inContraption) + ms.popPose(); + } + } + + public void renderLarge(CompoundTag bogeyData, float wheelAngle, PoseStack ms, int light, + @Nullable VertexConsumer vb) { + boolean inContraption = vb != null; + + Transform bogeyDrive = getTransformFromPartial(AllBlockPartials.BOGEY_DRIVE, inContraption); + finalize(bogeyDrive, ms, light, vb); + + Transform bogeyPiston = getTransformFromPartial(AllBlockPartials.BOGEY_PISTON, inContraption) + .translate(0, 0, 1 / 4f * Math.sin(AngleHelper.rad(wheelAngle))); + finalize(bogeyPiston, ms, light, vb); + + if (!inContraption) + ms.pushPose(); + + Transform bogeyWheels = getTransformFromPartial(AllBlockPartials.LARGE_BOGEY_WHEELS, inContraption) + .translate(0, 1, 0) + .rotateX(wheelAngle); + finalize(bogeyWheels, ms, light, vb); + + Transform bogeyPin = getTransformFromPartial(AllBlockPartials.BOGEY_PIN, inContraption) + .translate(0, 1, 0) + .rotateX(wheelAngle) + .translate(0, 1 / 4f, 0) + .rotateX(-wheelAngle); + finalize(bogeyPin, ms, light, vb); + ms.popPose(); + } +} From 3c02fe6ecc0c20f1c8ba6bd2ffd2334c2d9d9d73 Mon Sep 17 00:00:00 2001 From: Rabbitminers <79579164+Rabbitminers@users.noreply.github.com> Date: Tue, 21 Mar 2023 22:45:34 +0000 Subject: [PATCH 03/53] Added missing render type check --- .../content/logistics/trains/StandardBogeyRenderer.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/StandardBogeyRenderer.java b/src/main/java/com/simibubi/create/content/logistics/trains/StandardBogeyRenderer.java index 1a6f0a072..5d75ee5a4 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/StandardBogeyRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/StandardBogeyRenderer.java @@ -63,6 +63,8 @@ public class StandardBogeyRenderer extends BogeyRenderer { .translate(0, 1 / 4f, 0) .rotateX(-wheelAngle); finalize(bogeyPin, ms, light, vb); - ms.popPose(); + + if (!inContraption) + ms.popPose(); } } From 6d98a1f46942d319729c2d61451da462f4188167 Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Wed, 22 Mar 2023 17:03:00 +0000 Subject: [PATCH 04/53] Added Contraption Model Instance Initializer --- .../content/logistics/trains/BogeyRenderer.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/BogeyRenderer.java b/src/main/java/com/simibubi/create/content/logistics/trains/BogeyRenderer.java index 33b23bac7..447982088 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/BogeyRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/BogeyRenderer.java @@ -1,5 +1,7 @@ package com.simibubi.create.content.logistics.trains; +import com.jozufozu.flywheel.api.MaterialManager; +import com.jozufozu.flywheel.core.Materials; import com.jozufozu.flywheel.core.PartialModel; import com.jozufozu.flywheel.core.materials.model.ModelData; import com.jozufozu.flywheel.util.transform.Transform; @@ -61,6 +63,21 @@ public abstract class BogeyRenderer { : CachedBufferer.partial(model, air); } + @OnlyIn(Dist.CLIENT) + public abstract void initialiseContraptionModelData(MaterialManager materialManager, BogeySize size); + + public void createModelInstances(MaterialManager materialManager, PartialModel model, int count) { + ModelData[] modelData = new ModelData[count]; + materialManager.defaultSolid().material(Materials.TRANSFORMED) + .getModel(model).createInstances(modelData); + contraptionModelData.put(model, modelData); + } + + public void createModelInstances(MaterialManager materialManager, PartialModel... models) { + for (PartialModel model : models) + createModelInstances(materialManager, model, 1); + } + @OnlyIn(Dist.CLIENT) public void render(CompoundTag bogeyData, float wheelAngle, PoseStack ms, int light, @Nullable VertexConsumer vb, BogeySize size) { From 91727cc84a12b2fd27b1ce6e0d67bd182e34880b Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Wed, 22 Mar 2023 17:03:28 +0000 Subject: [PATCH 05/53] Implemented Model Data Initializer to StandardBogeyRenderer --- .../trains/StandardBogeyRenderer.java | 29 +++++++++++++++---- 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/StandardBogeyRenderer.java b/src/main/java/com/simibubi/create/content/logistics/trains/StandardBogeyRenderer.java index 1a6f0a072..0ff224d49 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/StandardBogeyRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/StandardBogeyRenderer.java @@ -1,5 +1,6 @@ package com.simibubi.create.content.logistics.trains; +import com.jozufozu.flywheel.api.MaterialManager; import com.jozufozu.flywheel.util.transform.Transform; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; @@ -12,6 +13,13 @@ import net.minecraft.nbt.CompoundTag; import org.jetbrains.annotations.Nullable; +import static com.simibubi.create.AllBlockPartials.LARGE_BOGEY_WHEELS; +import static com.simibubi.create.AllBlockPartials.BOGEY_PIN; +import static com.simibubi.create.AllBlockPartials.BOGEY_DRIVE; +import static com.simibubi.create.AllBlockPartials.BOGEY_PISTON; +import static com.simibubi.create.AllBlockPartials.SMALL_BOGEY_WHEELS; +import static com.simibubi.create.AllBlockPartials.BOGEY_FRAME; + public class StandardBogeyRenderer extends BogeyRenderer { public StandardBogeyRenderer() { @@ -19,13 +27,22 @@ public class StandardBogeyRenderer extends BogeyRenderer { renderers.put(BogeySize.LARGE, this::renderLarge); } + @Override + public void initialiseContraptionModelData(MaterialManager materialManager, BogeySize size) { + // Large + createModelInstances(materialManager, LARGE_BOGEY_WHEELS, BOGEY_DRIVE, BOGEY_PISTON, BOGEY_PIN); + // Small + createModelInstances(materialManager, SMALL_BOGEY_WHEELS, 2); + createModelInstances(materialManager, BOGEY_FRAME); + } + public void renderSmall(CompoundTag bogeyData, float wheelAngle, PoseStack ms, int light, @Nullable VertexConsumer vb) { boolean inContraption = vb != null; - Transform transform = getTransformFromPartial(AllBlockPartials.BOGEY_FRAME, inContraption); + Transform transform = getTransformFromPartial(BOGEY_FRAME, inContraption); finalize(transform, ms, light, vb); - Transform[] wheels = getTransformsFromPartial(AllBlockPartials.SMALL_BOGEY_WHEELS, inContraption, 2); + Transform[] wheels = getTransformsFromPartial(SMALL_BOGEY_WHEELS, inContraption, 2); for (int side : Iterate.positiveAndNegative) { if (!inContraption) ms.pushPose(); @@ -42,22 +59,22 @@ public class StandardBogeyRenderer extends BogeyRenderer { @Nullable VertexConsumer vb) { boolean inContraption = vb != null; - Transform bogeyDrive = getTransformFromPartial(AllBlockPartials.BOGEY_DRIVE, inContraption); + Transform bogeyDrive = getTransformFromPartial(BOGEY_DRIVE, inContraption); finalize(bogeyDrive, ms, light, vb); - Transform bogeyPiston = getTransformFromPartial(AllBlockPartials.BOGEY_PISTON, inContraption) + Transform bogeyPiston = getTransformFromPartial(BOGEY_PISTON, inContraption) .translate(0, 0, 1 / 4f * Math.sin(AngleHelper.rad(wheelAngle))); finalize(bogeyPiston, ms, light, vb); if (!inContraption) ms.pushPose(); - Transform bogeyWheels = getTransformFromPartial(AllBlockPartials.LARGE_BOGEY_WHEELS, inContraption) + Transform bogeyWheels = getTransformFromPartial(LARGE_BOGEY_WHEELS, inContraption) .translate(0, 1, 0) .rotateX(wheelAngle); finalize(bogeyWheels, ms, light, vb); - Transform bogeyPin = getTransformFromPartial(AllBlockPartials.BOGEY_PIN, inContraption) + Transform bogeyPin = getTransformFromPartial(BOGEY_PIN, inContraption) .translate(0, 1, 0) .rotateX(wheelAngle) .translate(0, 1 / 4f, 0) From 7238fb93f3d0fed43b091f44fd30814e505c544c Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Thu, 23 Mar 2023 17:39:51 +0000 Subject: [PATCH 06/53] Added Renderer To IBogeyBlock --- .../simibubi/create/content/logistics/trains/IBogeyBlock.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/IBogeyBlock.java b/src/main/java/com/simibubi/create/content/logistics/trains/IBogeyBlock.java index dea2966aa..bb57140e7 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/IBogeyBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/IBogeyBlock.java @@ -88,4 +88,7 @@ public interface IBogeyBlock extends IWrenchable { return state; } + public Class getRendererClass(); + + public BogeyRenderer getRenderer(); } From 4a82fcbca1002267fc70998e7ac9c22cd92de52e Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Thu, 23 Mar 2023 17:40:13 +0000 Subject: [PATCH 07/53] Implemented Changes To StandardBogeyBlock --- .../trains/track/StandardBogeyBlock.java | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) 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 9db10db41..b19953706 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 @@ -10,9 +10,12 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlocks; 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.IBogeyBlock; +import com.simibubi.create.content.logistics.trains.StandardBogeyRenderer; 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.ItemRequirement; import com.simibubi.create.content.schematics.ItemRequirement.ItemUseType; @@ -27,6 +30,7 @@ import net.minecraft.client.renderer.RenderType; 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.item.ItemStack; import net.minecraft.world.level.BlockGetter; @@ -52,9 +56,12 @@ public class StandardBogeyBlock extends Block public static final EnumProperty AXIS = BlockStateProperties.HORIZONTAL_AXIS; private final boolean large; + private final BogeyRenderer renderer; + public StandardBogeyBlock(Properties p_i48440_1_, boolean large) { super(p_i48440_1_); this.large = large; + this.renderer = new StandardBogeyRenderer(); registerDefaultState(defaultBlockState().setValue(WATERLOGGED, false)); } @@ -111,6 +118,16 @@ public class StandardBogeyBlock extends Block return defaultBlockState().setValue(AXIS, axisAlongFirst ? Axis.X : Axis.Z); } + @Override + public Class getRendererClass() { + return StandardBogeyRenderer.class; + } + + @Override + public BogeyRenderer getRenderer() { + return this.renderer; + } + @Override public boolean isTrackAxisAlongFirstCoordinate(BlockState state) { return state.getValue(AXIS) == Axis.X; @@ -142,9 +159,9 @@ public class StandardBogeyBlock extends Block .renderInto(ms, vb); if (large) { - renderLargeBogey(wheelAngle, ms, light, vb, air); + renderer.render(new CompoundTag(), wheelAngle, ms, light, vb, BogeyRenderer.BogeySize.LARGE); } else { - renderBogey(wheelAngle, ms, light, vb, air); + renderer.render(new CompoundTag(), wheelAngle, ms, light, vb, BogeyRenderer.BogeySize.SMALL); } } @@ -204,9 +221,9 @@ public class StandardBogeyBlock extends Block @Override public BogeyInstance createInstance(MaterialManager materialManager, CarriageBogey bogey) { if (large) { - return new BogeyInstance.Drive(bogey, materialManager); + return StandardBogeyInstance.drive(bogey, materialManager); } else { - return new BogeyInstance.Frame(bogey, materialManager); + return StandardBogeyInstance.frame(bogey, materialManager); } } From 9ded16fbabb38e3415cc7b5452cbaea1bef98f61 Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Thu, 23 Mar 2023 17:41:15 +0000 Subject: [PATCH 08/53] Integrated BogeyRenderer To BogeyInstance (Also Corrected Rendering In Contraption) --- .../logistics/trains/BogeyRenderer.java | 23 +- .../trains/entity/BogeyInstance.java | 215 ++---------------- 2 files changed, 41 insertions(+), 197 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/BogeyRenderer.java b/src/main/java/com/simibubi/create/content/logistics/trains/BogeyRenderer.java index 447982088..f5e0d9e16 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/BogeyRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/BogeyRenderer.java @@ -41,12 +41,20 @@ import java.util.Set; * overriden methods for each size */ +// Seperate From BogeyInstance So It Can Be Used Inworld + public abstract class BogeyRenderer { Map renderers = new EnumMap<>(BogeySize.class); Map contraptionModelData = new HashMap<>(); - public Transform[] getTransformsFromPartial(PartialModel model, boolean inContraption, int size) { - return inContraption ? contraptionModelData.get(model) : createModelData(model, size); + public Transform[] getTransformsFromPartial(PartialModel model, PoseStack ms, boolean inContraption, int size) { + return (inContraption) ? transformContraptionModelData(model, ms) : createModelData(model, size); + } + + private Transform[] transformContraptionModelData(PartialModel model, PoseStack ms) { + ModelData[] modelData = contraptionModelData.get(model); + Arrays.stream(modelData).forEach(modelDataElement -> modelDataElement.setTransform(ms)); + return modelData; } private Transform[] createModelData(PartialModel model, int size) { @@ -57,9 +65,10 @@ public abstract class BogeyRenderer { .toArray(SuperByteBuffer[]::new); } - public Transform getTransformFromPartial(PartialModel model, boolean inContraption) { + public Transform getTransformFromPartial(PartialModel model, PoseStack ms, boolean inContraption) { BlockState air = Blocks.AIR.defaultBlockState(); - return inContraption ? contraptionModelData.get(model)[0] + System.out.println(CachedBufferer.partial(model, air)); + return inContraption ? contraptionModelData.get(model)[0].setTransform(ms) : CachedBufferer.partial(model, air); } @@ -103,6 +112,12 @@ public abstract class BogeyRenderer { return renderers.keySet(); } + public void emptyTransforms() { + for (ModelData[] data : contraptionModelData.values()) + for (ModelData model : data) + model.setEmptyTransform(); + } + public void updateLight(int blockLight, int skyLight) { for (ModelData[] data : contraptionModelData.values()) for (ModelData model : data) 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 9a8a6c9c1..eacc51ada 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 @@ -6,230 +6,59 @@ import com.jozufozu.flywheel.core.Materials; import com.jozufozu.flywheel.core.materials.model.ModelData; import com.jozufozu.flywheel.util.AnimationTickHolder; import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.relays.elementary.ShaftBlock; +import com.simibubi.create.content.logistics.trains.BogeyRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.Iterate; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.LightLayer; import net.minecraft.world.phys.Vec3; -public sealed class BogeyInstance { +import java.util.EnumMap; +import java.util.Map; + +public abstract class BogeyInstance { public final CarriageBogey bogey; - private final ModelData[] shafts; + public final BogeyRenderer renderer; + private final BogeyRenderer.BogeySize size; - protected BogeyInstance(CarriageBogey bogey, MaterialManager materialManager) { + public BogeyInstance(CarriageBogey bogey, BogeyRenderer renderer, BogeyRenderer.BogeySize size, MaterialManager materialManager) { this.bogey = bogey; + this.renderer = renderer; + this.size = size; - shafts = new ModelData[2]; - - materialManager.defaultSolid() - .material(Materials.TRANSFORMED) - .getModel(AllBlocks.SHAFT.getDefaultState() - .setValue(ShaftBlock.AXIS, Direction.Axis.Z)) - .createInstances(shafts); - + renderer.initialiseContraptionModelData(materialManager, size); } - public void remove() { - for (ModelData shaft : shafts) - shaft.delete(); - } - - public void hiddenFrame() { + protected void hiddenFrame() { beginFrame(0, null); } - + public void beginFrame(float wheelAngle, PoseStack ms) { if (ms == null) { - for (int i : Iterate.zeroAndOne) - shafts[i].setEmptyTransform(); + renderer.emptyTransforms(); return; } - for (int i : Iterate.zeroAndOne) - shafts[i].setTransform(ms) - .translate(-.5f, .25f, i * -1) - .centre() - .rotateZ(wheelAngle) - .unCentre(); - } + renderer.render(new CompoundTag(), wheelAngle, ms, this.size); + }; public void updateLight(BlockAndTintGetter world, CarriageContraptionEntity entity) { var lightPos = new BlockPos(getLightPos(entity)); - - updateLight(world.getBrightness(LightLayer.BLOCK, lightPos), world.getBrightness(LightLayer.SKY, lightPos)); + renderer.updateLight(world.getBrightness(LightLayer.BLOCK, lightPos), + world.getBrightness(LightLayer.SKY, lightPos)); } private Vec3 getLightPos(CarriageContraptionEntity entity) { - if (bogey.getAnchorPosition() != null) { - return bogey.getAnchorPosition(); - } else { - return entity.getLightProbePosition(AnimationTickHolder.getPartialTicks()); - } - } - - public void updateLight(int blockLight, int skyLight) { - for (ModelData shaft : shafts) { - shaft.setBlockLight(blockLight) - .setSkyLight(skyLight); - } - } - - public static final class Frame extends BogeyInstance { - - private final ModelData frame; - private final ModelData[] wheels; - - public Frame(CarriageBogey bogey, MaterialManager materialManager) { - super(bogey, materialManager); - - frame = materialManager.defaultSolid() - .material(Materials.TRANSFORMED) - .getModel(AllBlockPartials.BOGEY_FRAME) - .createInstance(); - - wheels = new ModelData[2]; - - materialManager.defaultSolid() - .material(Materials.TRANSFORMED) - .getModel(AllBlockPartials.SMALL_BOGEY_WHEELS) - .createInstances(wheels); - } - - @Override - public void beginFrame(float wheelAngle, PoseStack ms) { - super.beginFrame(wheelAngle, ms); - - if (ms == null) { - frame.setEmptyTransform(); - for (int side : Iterate.positiveAndNegative) - wheels[(side + 1) / 2].setEmptyTransform(); - return; - } - - frame.setTransform(ms); - - for (int side : Iterate.positiveAndNegative) { - wheels[(side + 1) / 2].setTransform(ms) - .translate(0, 12 / 16f, side) - .rotateX(wheelAngle); - } - } - - @Override - public void updateLight(int blockLight, int skyLight) { - super.updateLight(blockLight, skyLight); - frame.setBlockLight(blockLight) - .setSkyLight(skyLight); - for (ModelData wheel : wheels) - wheel.setBlockLight(blockLight) - .setSkyLight(skyLight); - } - - @Override - public void remove() { - super.remove(); - frame.delete(); - for (ModelData wheel : wheels) - wheel.delete(); - } - } - - public static final class Drive extends BogeyInstance { - - private final ModelData[] secondShaft; - private final ModelData drive; - private final ModelData piston; - private final ModelData wheels; - private final ModelData pin; - - public Drive(CarriageBogey bogey, MaterialManager materialManager) { - super(bogey, materialManager); - Material mat = materialManager.defaultSolid() - .material(Materials.TRANSFORMED); - - secondShaft = new ModelData[2]; - - mat.getModel(AllBlocks.SHAFT.getDefaultState() - .setValue(ShaftBlock.AXIS, Direction.Axis.X)) - .createInstances(secondShaft); - - drive = mat.getModel(AllBlockPartials.BOGEY_DRIVE) - .createInstance(); - piston = mat.getModel(AllBlockPartials.BOGEY_PISTON) - .createInstance(); - wheels = mat.getModel(AllBlockPartials.LARGE_BOGEY_WHEELS) - .createInstance(); - pin = mat.getModel(AllBlockPartials.BOGEY_PIN) - .createInstance(); - } - - @Override - public void beginFrame(float wheelAngle, PoseStack ms) { - super.beginFrame(wheelAngle, ms); - - if (ms == null) { - for (int i : Iterate.zeroAndOne) - secondShaft[i].setEmptyTransform(); - drive.setEmptyTransform(); - piston.setEmptyTransform(); - wheels.setEmptyTransform(); - pin.setEmptyTransform(); - return; - } - - for (int i : Iterate.zeroAndOne) - secondShaft[i].setTransform(ms) - .translate(-.5f, .25f, .5f + i * -2) - .centre() - .rotateX(wheelAngle) - .unCentre(); - - drive.setTransform(ms); - piston.setTransform(ms) - .translate(0, 0, 1 / 4f * Math.sin(AngleHelper.rad(wheelAngle))); - - wheels.setTransform(ms) - .translate(0, 1, 0) - .rotateX(wheelAngle); - pin.setTransform(ms) - .translate(0, 1, 0) - .rotateX(wheelAngle) - .translate(0, 1 / 4f, 0) - .rotateX(-wheelAngle); - } - - @Override - public void updateLight(int blockLight, int skyLight) { - super.updateLight(blockLight, skyLight); - for (ModelData shaft : secondShaft) - shaft.setBlockLight(blockLight) - .setSkyLight(skyLight); - drive.setBlockLight(blockLight) - .setSkyLight(skyLight); - piston.setBlockLight(blockLight) - .setSkyLight(skyLight); - wheels.setBlockLight(blockLight) - .setSkyLight(skyLight); - pin.setBlockLight(blockLight) - .setSkyLight(skyLight); - } - - @Override - public void remove() { - super.remove(); - for (ModelData shaft : secondShaft) - shaft.delete(); - drive.delete(); - piston.delete(); - wheels.delete(); - pin.delete(); - } + return bogey.getAnchorPosition() != null ? bogey.getAnchorPosition() + : entity.getLightProbePosition(AnimationTickHolder.getPartialTicks()); } } From 2661d260d8c21e57df751b17812d89919713120f Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Thu, 23 Mar 2023 17:42:06 +0000 Subject: [PATCH 09/53] Refactored Changes To Existing Methods --- .../trains/StandardBogeyRenderer.java | 20 ++++++++++--------- .../entity/CarriageContraptionInstance.java | 2 +- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/StandardBogeyRenderer.java b/src/main/java/com/simibubi/create/content/logistics/trains/StandardBogeyRenderer.java index e102ad5c0..5c3772121 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/StandardBogeyRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/StandardBogeyRenderer.java @@ -1,6 +1,7 @@ package com.simibubi.create.content.logistics.trains; import com.jozufozu.flywheel.api.MaterialManager; +import com.jozufozu.flywheel.core.materials.model.ModelData; import com.jozufozu.flywheel.util.transform.Transform; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; @@ -38,11 +39,11 @@ public class StandardBogeyRenderer extends BogeyRenderer { public void renderSmall(CompoundTag bogeyData, float wheelAngle, PoseStack ms, int light, @Nullable VertexConsumer vb) { - boolean inContraption = vb != null; - Transform transform = getTransformFromPartial(BOGEY_FRAME, inContraption); + boolean inContraption = vb == null; + Transform transform = getTransformFromPartial(BOGEY_FRAME, ms, inContraption); finalize(transform, ms, light, vb); - Transform[] wheels = getTransformsFromPartial(SMALL_BOGEY_WHEELS, inContraption, 2); + Transform[] wheels = getTransformsFromPartial(SMALL_BOGEY_WHEELS, ms, inContraption, 2); for (int side : Iterate.positiveAndNegative) { if (!inContraption) ms.pushPose(); @@ -57,30 +58,31 @@ public class StandardBogeyRenderer extends BogeyRenderer { public void renderLarge(CompoundTag bogeyData, float wheelAngle, PoseStack ms, int light, @Nullable VertexConsumer vb) { - boolean inContraption = vb != null; - Transform bogeyDrive = getTransformFromPartial(BOGEY_DRIVE, inContraption); + boolean inContraption = vb == null; + + Transform bogeyDrive = getTransformFromPartial(BOGEY_DRIVE, ms, inContraption); finalize(bogeyDrive, ms, light, vb); - Transform bogeyPiston = getTransformFromPartial(BOGEY_PISTON, inContraption) + Transform bogeyPiston = getTransformFromPartial(BOGEY_PISTON, ms, inContraption) .translate(0, 0, 1 / 4f * Math.sin(AngleHelper.rad(wheelAngle))); finalize(bogeyPiston, ms, light, vb); if (!inContraption) ms.pushPose(); - Transform bogeyWheels = getTransformFromPartial(LARGE_BOGEY_WHEELS, inContraption) + Transform bogeyWheels = getTransformFromPartial(LARGE_BOGEY_WHEELS, ms, inContraption) .translate(0, 1, 0) .rotateX(wheelAngle); finalize(bogeyWheels, ms, light, vb); - Transform bogeyPin = getTransformFromPartial(BOGEY_PIN, inContraption) + Transform bogeyPin = getTransformFromPartial(BOGEY_PIN, ms, inContraption) .translate(0, 1, 0) .rotateX(wheelAngle) .translate(0, 1 / 4f, 0) .rotateX(-wheelAngle); finalize(bogeyPin, ms, light, vb); - + if (!inContraption) ms.popPose(); } 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 4d18e2525..7701ad5e8 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 @@ -99,7 +99,7 @@ public class CarriageContraptionInstance extends EntityInstance { if (instance != null) - instance.remove(); + instance.renderer.remove(); }); } From 469d9d592b9aa925b26b1206a4ad03d73d422a92 Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Thu, 23 Mar 2023 17:42:28 +0000 Subject: [PATCH 10/53] Added Standard Bogey Instance (Might be redundant) --- .../trains/entity/StandardBogeyInstance.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/main/java/com/simibubi/create/content/logistics/trains/entity/StandardBogeyInstance.java 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 new file mode 100644 index 000000000..74d9ec556 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/StandardBogeyInstance.java @@ -0,0 +1,20 @@ +package com.simibubi.create.content.logistics.trains.entity; + +import com.jozufozu.flywheel.api.MaterialManager; +import com.simibubi.create.content.logistics.trains.BogeyRenderer; +import com.simibubi.create.content.logistics.trains.StandardBogeyRenderer; + +public class StandardBogeyInstance extends BogeyInstance { + public StandardBogeyInstance(CarriageBogey bogey, BogeyRenderer.BogeySize bogeySize, MaterialManager materialManager) { + super(bogey, new StandardBogeyRenderer(), bogeySize, materialManager); + } + + public static StandardBogeyInstance drive(CarriageBogey bogey, MaterialManager materialManager) { + return new StandardBogeyInstance(bogey, BogeyRenderer.BogeySize.LARGE, materialManager); + } + + + public static StandardBogeyInstance frame(CarriageBogey bogey, MaterialManager materialManager) { + return new StandardBogeyInstance(bogey, BogeyRenderer.BogeySize.SMALL, materialManager); + } +} From 96a0623dab84d7062a0871ddacabf4342e568867 Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Thu, 23 Mar 2023 18:38:29 +0000 Subject: [PATCH 11/53] Implemented BlockState Models For Rendering --- .../logistics/trains/BogeyRenderer.java | 41 ++++++++++++++++--- 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/BogeyRenderer.java b/src/main/java/com/simibubi/create/content/logistics/trains/BogeyRenderer.java index f5e0d9e16..ef780e846 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/BogeyRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/BogeyRenderer.java @@ -45,14 +45,18 @@ import java.util.Set; public abstract class BogeyRenderer { Map renderers = new EnumMap<>(BogeySize.class); - Map contraptionModelData = new HashMap<>(); + Map contraptionModelData = new HashMap<>(); public Transform[] getTransformsFromPartial(PartialModel model, PoseStack ms, boolean inContraption, int size) { - return (inContraption) ? transformContraptionModelData(model, ms) : createModelData(model, size); + return (inContraption) ? transformContraptionModelData(keyFromModel(model), ms) : createModelData(model, size); } - private Transform[] transformContraptionModelData(PartialModel model, PoseStack ms) { - ModelData[] modelData = contraptionModelData.get(model); + public Transform[] getTransformsFromBlockState(BlockState state, PoseStack ms, boolean inContraption, int size) { + return (inContraption) ? transformContraptionModelData(keyFromModel(state), ms) : createModelData(state, size); + } + + private Transform[] transformContraptionModelData(String key, PoseStack ms) { + ModelData[] modelData = contraptionModelData.get(key); Arrays.stream(modelData).forEach(modelDataElement -> modelDataElement.setTransform(ms)); return modelData; } @@ -60,6 +64,15 @@ public abstract class BogeyRenderer { private Transform[] createModelData(PartialModel model, int size) { BlockState air = Blocks.AIR.defaultBlockState(); SuperByteBuffer[] data = { CachedBufferer.partial(model, air) }; + return expandArrayToLength(data, size); + } + + private Transform[] createModelData(BlockState state, int size) { + SuperByteBuffer[] data = { CachedBufferer.block(state) }; + return expandArrayToLength(data, size); + } + + private Transform[] expandArrayToLength(SuperByteBuffer[] data, int size) { return Arrays.stream(Collections.nCopies(size, data).toArray()) .flatMap(inner -> Arrays.stream((SuperByteBuffer[]) inner)) .toArray(SuperByteBuffer[]::new); @@ -68,7 +81,7 @@ public abstract class BogeyRenderer { public Transform getTransformFromPartial(PartialModel model, PoseStack ms, boolean inContraption) { BlockState air = Blocks.AIR.defaultBlockState(); System.out.println(CachedBufferer.partial(model, air)); - return inContraption ? contraptionModelData.get(model)[0].setTransform(ms) + return inContraption ? contraptionModelData.get(keyFromModel(model))[0].setTransform(ms) : CachedBufferer.partial(model, air); } @@ -79,7 +92,14 @@ public abstract class BogeyRenderer { ModelData[] modelData = new ModelData[count]; materialManager.defaultSolid().material(Materials.TRANSFORMED) .getModel(model).createInstances(modelData); - contraptionModelData.put(model, modelData); + contraptionModelData.put(keyFromModel(model), modelData); + } + + public void createModelInstances(MaterialManager materialManager, BlockState state, int count) { + ModelData[] modelData = new ModelData[count]; + materialManager.defaultSolid().material(Materials.TRANSFORMED) + .getModel(state).createInstances(modelData); + contraptionModelData.put(keyFromModel(state), modelData); } public void createModelInstances(MaterialManager materialManager, PartialModel... models) { @@ -90,6 +110,7 @@ public abstract class BogeyRenderer { @OnlyIn(Dist.CLIENT) public void render(CompoundTag bogeyData, float wheelAngle, PoseStack ms, int light, @Nullable VertexConsumer vb, BogeySize size) { + renderCommon(bogeyData, wheelAngle, ms, light, vb); renderers.get(size).render(bogeyData, wheelAngle, ms, light, vb); } @@ -131,6 +152,14 @@ public abstract class BogeyRenderer { contraptionModelData.clear(); } + private String keyFromModel(PartialModel partialModel) { + return partialModel.getLocation().toString(); + } + + private String keyFromModel(BlockState state) { + return state.getBlock().getRegistryName().toString(); + } + @FunctionalInterface interface Renderer { void render(CompoundTag bogeyData, float wheelAngle, PoseStack ms, int light, VertexConsumer vb); From 435b0f826663284f6544c034217516e36a0687d8 Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Thu, 23 Mar 2023 18:38:40 +0000 Subject: [PATCH 12/53] Added Common Renderer --- .../create/content/logistics/trains/BogeyRenderer.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/BogeyRenderer.java b/src/main/java/com/simibubi/create/content/logistics/trains/BogeyRenderer.java index ef780e846..6b576ff21 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/BogeyRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/BogeyRenderer.java @@ -119,6 +119,10 @@ public abstract class BogeyRenderer { this.render(bogeyData, wheelAngle, ms, 0, null, size); } + @OnlyIn(Dist.CLIENT) + public abstract void renderCommon(CompoundTag bogeyData, float wheelAngle, PoseStack ms, int light, + @Nullable VertexConsumer vb); + public static > void finalize(B b, PoseStack ms, int light, @Nullable VertexConsumer vb) { b.scale(1 - 1/512f); if (b instanceof SuperByteBuffer byteBuf && vb != null) From 06fb901144de8d8df5b907e6261c76a018468f7d Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Thu, 23 Mar 2023 18:39:11 +0000 Subject: [PATCH 13/53] Implemented Common Rendering For StandardBogeyRenderer --- .../trains/StandardBogeyRenderer.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/StandardBogeyRenderer.java b/src/main/java/com/simibubi/create/content/logistics/trains/StandardBogeyRenderer.java index 5c3772121..1b855940b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/StandardBogeyRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/StandardBogeyRenderer.java @@ -7,17 +7,23 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.contraptions.relays.elementary.ShaftBlock; +import com.simibubi.create.content.logistics.trains.entity.BogeyInstance; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.Iterate; +import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import org.jetbrains.annotations.Nullable; +import static com.simibubi.create.AllBlockPartials.COGWHEEL_SHAFT; import static com.simibubi.create.AllBlockPartials.LARGE_BOGEY_WHEELS; import static com.simibubi.create.AllBlockPartials.BOGEY_PIN; import static com.simibubi.create.AllBlockPartials.BOGEY_DRIVE; import static com.simibubi.create.AllBlockPartials.BOGEY_PISTON; +import static com.simibubi.create.AllBlockPartials.SHAFT_HALF; import static com.simibubi.create.AllBlockPartials.SMALL_BOGEY_WHEELS; import static com.simibubi.create.AllBlockPartials.BOGEY_FRAME; @@ -35,6 +41,23 @@ public class StandardBogeyRenderer extends BogeyRenderer { // Small createModelInstances(materialManager, SMALL_BOGEY_WHEELS, 2); createModelInstances(materialManager, BOGEY_FRAME); + // Common + createModelInstances(materialManager, AllBlocks.SHAFT.getDefaultState() + .setValue(ShaftBlock.AXIS, Direction.Axis.Z), 2); + } + + @Override + public void renderCommon(CompoundTag bogeyData, float wheelAngle, PoseStack ms, int light, @Nullable VertexConsumer vb) { + boolean inContraption = vb == null; + Transform[] shafts = getTransformsFromBlockState(AllBlocks.SHAFT.getDefaultState() + .setValue(ShaftBlock.AXIS, Direction.Axis.Z), ms, inContraption, 2); + for (int i : Iterate.zeroAndOne) { + shafts[i].translate(-.5f, .25f, i * -1) + .centre() + .rotateZ(wheelAngle) + .unCentre(); + finalize(shafts[i], ms, light, vb); + } } public void renderSmall(CompoundTag bogeyData, float wheelAngle, PoseStack ms, int light, From 6cd40cc6f982226f2bbb9e04e3b8241f9cc36cb5 Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Thu, 23 Mar 2023 18:49:56 +0000 Subject: [PATCH 14/53] Prevented Overwrite When Using Two BlockStates Of The Same Type With Different Properties --- .../simibubi/create/content/logistics/trains/BogeyRenderer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/BogeyRenderer.java b/src/main/java/com/simibubi/create/content/logistics/trains/BogeyRenderer.java index 6b576ff21..c79f26bdc 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/BogeyRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/BogeyRenderer.java @@ -161,7 +161,7 @@ public abstract class BogeyRenderer { } private String keyFromModel(BlockState state) { - return state.getBlock().getRegistryName().toString(); + return state.toString(); } @FunctionalInterface From 9920536cc319897a89dc1fc974c67cd0975fbcfd Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Thu, 23 Mar 2023 18:50:18 +0000 Subject: [PATCH 15/53] Implemented Secondary Shaft To Large Renderer --- .../logistics/trains/StandardBogeyRenderer.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/StandardBogeyRenderer.java b/src/main/java/com/simibubi/create/content/logistics/trains/StandardBogeyRenderer.java index 1b855940b..386dcb692 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/StandardBogeyRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/StandardBogeyRenderer.java @@ -38,6 +38,8 @@ public class StandardBogeyRenderer extends BogeyRenderer { public void initialiseContraptionModelData(MaterialManager materialManager, BogeySize size) { // Large createModelInstances(materialManager, LARGE_BOGEY_WHEELS, BOGEY_DRIVE, BOGEY_PISTON, BOGEY_PIN); + createModelInstances(materialManager, AllBlocks.SHAFT.getDefaultState() + .setValue(ShaftBlock.AXIS, Direction.Axis.X), 2); // Small createModelInstances(materialManager, SMALL_BOGEY_WHEELS, 2); createModelInstances(materialManager, BOGEY_FRAME); @@ -79,11 +81,23 @@ public class StandardBogeyRenderer extends BogeyRenderer { } } - public void renderLarge(CompoundTag bogeyData, float wheelAngle, PoseStack ms, int light, + public void renderLarge(CompoundTag bogeyData, float wheelAngle, PoseStack ms, int light, @Nullable VertexConsumer vb) { boolean inContraption = vb == null; + Transform[] secondaryShafts = getTransformsFromBlockState(AllBlocks.SHAFT.getDefaultState() + .setValue(ShaftBlock.AXIS, Direction.Axis.X), ms, inContraption, 2); + + for (int i : Iterate.zeroAndOne) { + Transform secondShaft = secondaryShafts[i]; + secondShaft.translate(-.5f, .25f, .5f + i * -2) + .centre() + .rotateX(wheelAngle) + .unCentre(); + finalize(secondShaft, ms, light, vb); + } + Transform bogeyDrive = getTransformFromPartial(BOGEY_DRIVE, ms, inContraption); finalize(bogeyDrive, ms, light, vb); From dfb7640bfc9850604c4ce05ff56338a4e2bbe2fa Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Thu, 23 Mar 2023 18:50:41 +0000 Subject: [PATCH 16/53] Removed left over logging statement --- .../simibubi/create/content/logistics/trains/BogeyRenderer.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/BogeyRenderer.java b/src/main/java/com/simibubi/create/content/logistics/trains/BogeyRenderer.java index c79f26bdc..a94dc4b9e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/BogeyRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/BogeyRenderer.java @@ -80,7 +80,6 @@ public abstract class BogeyRenderer { public Transform getTransformFromPartial(PartialModel model, PoseStack ms, boolean inContraption) { BlockState air = Blocks.AIR.defaultBlockState(); - System.out.println(CachedBufferer.partial(model, air)); return inContraption ? contraptionModelData.get(keyFromModel(model))[0].setTransform(ms) : CachedBufferer.partial(model, air); } From 154d455f3fbdef3000ad3e35e88b0909b66c69f8 Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Fri, 24 Mar 2023 23:41:56 +0000 Subject: [PATCH 17/53] Added BogeyStyle Wrapper --- .../logistics/trains/entity/BogeyStyle.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/main/java/com/simibubi/create/content/logistics/trains/entity/BogeyStyle.java 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 new file mode 100644 index 000000000..4ff645b65 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/BogeyStyle.java @@ -0,0 +1,23 @@ +package com.simibubi.create.content.logistics.trains.entity; + +import com.simibubi.create.content.logistics.trains.BogeyRenderer.BogeySize; +import com.simibubi.create.content.logistics.trains.IBogeyBlock; + +import net.minecraftforge.registries.ForgeRegistryEntry; +import net.minecraftforge.registries.IForgeRegistryEntry; + +import java.util.Map; + + +public class BogeyStyle extends ForgeRegistryEntry implements IForgeRegistryEntry { + public Map blocks; + final Class instance; + + public BogeyStyle(Class instance) { + this.instance = instance; + } + + public BogeyInstance getInstance() throws IllegalAccessException, InstantiationException { + return instance.newInstance(); + } +} From a90977d6429657ade13c889d90ec8cd733f176e9 Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Fri, 24 Mar 2023 23:42:25 +0000 Subject: [PATCH 18/53] Created AllRegistries and BogeyStyle Registry --- .../com/simibubi/create/AllRegistries.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/main/java/com/simibubi/create/AllRegistries.java diff --git a/src/main/java/com/simibubi/create/AllRegistries.java b/src/main/java/com/simibubi/create/AllRegistries.java new file mode 100644 index 000000000..551e65374 --- /dev/null +++ b/src/main/java/com/simibubi/create/AllRegistries.java @@ -0,0 +1,20 @@ +package com.simibubi.create; + +import com.simibubi.create.content.logistics.trains.entity.BogeyStyle; + +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.registries.IForgeRegistry; +import net.minecraftforge.registries.NewRegistryEvent; +import net.minecraftforge.registries.RegistryBuilder; + +import java.util.function.Supplier; + +public class AllRegistries { + public static final ResourceLocation BOGEY_NAME = new ResourceLocation(Create.ID, "bogeys"); + + public static Supplier> BOGEY_STYLES; + + public static void register(final NewRegistryEvent event) { + BOGEY_STYLES = event.create(new RegistryBuilder().setName(BOGEY_NAME)); + } +} From c9e71b462d00e138778f3064bfcc3549a6f28f22 Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Fri, 24 Mar 2023 23:42:56 +0000 Subject: [PATCH 19/53] Created BogeyStyleBuilder --- .../foundation/data/BogeyStyleBuilder.java | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 src/main/java/com/simibubi/create/foundation/data/BogeyStyleBuilder.java diff --git a/src/main/java/com/simibubi/create/foundation/data/BogeyStyleBuilder.java b/src/main/java/com/simibubi/create/foundation/data/BogeyStyleBuilder.java new file mode 100644 index 000000000..62d8ca496 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/data/BogeyStyleBuilder.java @@ -0,0 +1,75 @@ +package com.simibubi.create.foundation.data; + +import com.simibubi.create.AllBlocks; +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.IBogeyBlock; +import com.simibubi.create.content.logistics.trains.entity.BogeyStyle; + +import com.tterrag.registrate.AbstractRegistrate; + +import com.tterrag.registrate.builders.AbstractBuilder; + +import com.tterrag.registrate.builders.BuilderCallback; + +import com.tterrag.registrate.util.nullness.NonNullSupplier; + +import net.minecraft.core.particles.ParticleType; + +import net.minecraft.nbt.CompoundTag; + +import org.jetbrains.annotations.NotNull; + +import javax.annotation.ParametersAreNonnullByDefault; + +import java.util.EnumMap; +import java.util.Map; +import java.util.function.Supplier; + +@ParametersAreNonnullByDefault +public class BogeyStyleBuilder extends AbstractBuilder> { + private final T style; + + private NonNullSupplier> bogeyBlocks = () -> new EnumMap<>(BogeyRenderer.BogeySize.class); + private Supplier sounds; + private Supplier data; + private Supplier> particles; + + public static BogeyStyleBuilder create(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, T style) { + return new BogeyStyleBuilder<>(owner, parent, name, callback, style); + } + + protected BogeyStyleBuilder(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, T style) { + super(owner, parent, name, callback, AllRegistries.BOGEY_STYLES.get().getRegistryKey()); + this.style = style; + + bogeyBlocks.get().put(BogeyRenderer.BogeySize.SMALL, AllBlocks.SMALL_BOGEY.get()); + bogeyBlocks.get().put(BogeyRenderer.BogeySize.LARGE, AllBlocks.LARGE_BOGEY.get()); + } + + public BogeyStyleBuilder defaultData(CompoundTag data) { + this.data = () -> data; + return this; + } + + public BogeyStyleBuilder particles(ParticleType particleType) { + this.particles = () -> particleType; + return this; + } + + public BogeyStyleBuilder soundType(AllSoundEvents.SoundEntry soundEntry) { + this.sounds = () -> soundEntry; + return this; + } + + public BogeyStyleBuilder block(BogeyRenderer.BogeySize size, IBogeyBlock block) { + this.bogeyBlocks.get().put(size, block); + return this; + } + + @Override + protected @NotNull T createEntry() { + return style; + } +} From 3dfb9e3b3b4b7cec3833b65838ce9523b0cf7666 Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Fri, 24 Mar 2023 23:43:08 +0000 Subject: [PATCH 20/53] Implemented AllBogeyStyles --- .../com/simibubi/create/AllBogeyStyles.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 src/main/java/com/simibubi/create/AllBogeyStyles.java diff --git a/src/main/java/com/simibubi/create/AllBogeyStyles.java b/src/main/java/com/simibubi/create/AllBogeyStyles.java new file mode 100644 index 000000000..5fdba3d5e --- /dev/null +++ b/src/main/java/com/simibubi/create/AllBogeyStyles.java @@ -0,0 +1,29 @@ +package com.simibubi.create; + +import com.simibubi.create.content.logistics.trains.BogeyRenderer; + +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; +import net.minecraftforge.registries.DeferredRegister; + +import static com.simibubi.create.Create.REGISTRATE; + +@SuppressWarnings("unused") +public class AllBogeyStyles { + public static final DeferredRegister BOGEYS = DeferredRegister.create(AllRegistries.BOGEY_NAME, Create.ID); + + public static final RegistryEntry STANDARD = REGISTRATE + .bogeyStyle("standard", new BogeyStyle(StandardBogeyInstance.class)) + .block(BogeyRenderer.BogeySize.SMALL, AllBlocks.SMALL_BOGEY.get()) + .block(BogeyRenderer.BogeySize.LARGE, AllBlocks.LARGE_BOGEY.get()) + .register(); + + public static void register() { + BOGEYS.register(FMLJavaModLoadingContext.get().getModEventBus()); + } +} From 6d862290d71b24b1d841444fa21dcb44ecc0d6c7 Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Fri, 24 Mar 2023 23:43:23 +0000 Subject: [PATCH 21/53] Added BogeyStyleBuilder To Registrate --- .../create/foundation/data/CreateRegistrate.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/com/simibubi/create/foundation/data/CreateRegistrate.java b/src/main/java/com/simibubi/create/foundation/data/CreateRegistrate.java index e0200c3b5..de34fd210 100644 --- a/src/main/java/com/simibubi/create/foundation/data/CreateRegistrate.java +++ b/src/main/java/com/simibubi/create/foundation/data/CreateRegistrate.java @@ -16,8 +16,10 @@ import com.simibubi.create.CreateClient; import com.simibubi.create.content.AllSections; import com.simibubi.create.content.contraptions.fluids.VirtualFluid; import com.simibubi.create.content.contraptions.relays.encased.CasingConnectivity; +import com.simibubi.create.content.logistics.trains.entity.BogeyStyle; import com.simibubi.create.foundation.block.connected.CTModel; import com.simibubi.create.foundation.block.connected.ConnectedTextureBehaviour; +import com.simibubi.create.foundation.utility.CreateRegistry; import com.simibubi.create.foundation.utility.RegisteredObjects; import com.tterrag.registrate.AbstractRegistrate; import com.tterrag.registrate.builders.BlockBuilder; @@ -133,6 +135,14 @@ public class CreateRegistrate extends AbstractRegistrate { (callback) -> CreateTileEntityBuilder.create(this, parent, name, callback, factory)); } + public BogeyStyleBuilder bogeyStyle(String name, T style) { + return this.bogeyStyle(self(), name, style); + } + + public BogeyStyleBuilder bogeyStyle(P parent, String name, T style) { + return this.entry(name, (callback) -> BogeyStyleBuilder.create(this, parent, name, callback, style)); + } + @Override public CreateEntityBuilder entity(String name, EntityType.EntityFactory factory, MobCategory classification) { From c7d899369a4ad1a9962ed18c2ab02f58c985f5ae Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Fri, 24 Mar 2023 23:44:03 +0000 Subject: [PATCH 22/53] Registered Registers --- src/main/java/com/simibubi/create/Create.java | 3 +++ .../com/simibubi/create/events/CommonEvents.java | 13 +++++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/simibubi/create/Create.java b/src/main/java/com/simibubi/create/Create.java index 420c74a30..c3ac48d43 100644 --- a/src/main/java/com/simibubi/create/Create.java +++ b/src/main/java/com/simibubi/create/Create.java @@ -119,6 +119,7 @@ public class Create { AllEntityDataSerializers.register(modEventBus); AllOreFeatureConfigEntries.init(); AllFeatures.register(modEventBus); + AllBogeyStyles.register(); AllPlacementModifiers.register(modEventBus); BuiltinRegistration.register(modEventBus); @@ -143,6 +144,8 @@ public class Create { DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> CreateClient.onCtorClient(modEventBus, forgeEventBus)); Mods.CURIOS.executeIfInstalled(() -> () -> Curios.init(modEventBus, forgeEventBus)); + + System.out.println(AllRegistries.BOGEY_STYLES.get().getValues()); } public static void init(final FMLCommonSetupEvent event) { diff --git a/src/main/java/com/simibubi/create/events/CommonEvents.java b/src/main/java/com/simibubi/create/events/CommonEvents.java index b9a3baa8b..ce5b49ddc 100644 --- a/src/main/java/com/simibubi/create/events/CommonEvents.java +++ b/src/main/java/com/simibubi/create/events/CommonEvents.java @@ -1,6 +1,7 @@ package com.simibubi.create.events; import com.simibubi.create.AllFluids; +import com.simibubi.create.AllRegistries; import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionHandler; import com.simibubi.create.content.contraptions.components.structureMovement.interaction.controls.ControlsServerHandler; @@ -62,9 +63,11 @@ import net.minecraftforge.eventbus.api.EventPriority; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.fml.ModList; +import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; import net.minecraftforge.forgespi.language.IModFileInfo; import net.minecraftforge.forgespi.locating.IModFile; +import net.minecraftforge.registries.NewRegistryEvent; @EventBusSubscriber public class CommonEvents { @@ -90,7 +93,7 @@ public class CommonEvents { ToolboxHandler.playerLogin(player); Create.RAILWAYS.playerLogin(player); } - + @SubscribeEvent public static void playerLoggedOut(PlayerLoggedOutEvent event) { Player player = event.getPlayer(); @@ -166,7 +169,7 @@ public class CommonEvents { public static void onEntityEnterSection(EntityEvent.EnteringSection event) { CarriageEntityHandler.onEntityEnterSection(event); } - + @SubscribeEvent public static void addReloadListeners(AddReloadListenerEvent event) { event.addListener(RecipeFinder.LISTENER); @@ -228,6 +231,10 @@ public class CommonEvents { @EventBusSubscriber(bus = EventBusSubscriber.Bus.MOD) public static class ModBusEvents { + @SubscribeEvent + public static void registerRegistries(final NewRegistryEvent event) { + AllRegistries.register(event); + } @SubscribeEvent public static void registerCapabilities(RegisterCapabilitiesEvent event) { @@ -248,7 +255,5 @@ public class CommonEvents { }); } } - } - } From 17432c911342b1d4937a8d2d22d50a58296639e6 Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Sat, 25 Mar 2023 10:20:50 +0000 Subject: [PATCH 23/53] Fixed Incorrect Registry Loading --- .../com/simibubi/create/AllBogeyStyles.java | 10 +++--- .../com/simibubi/create/AllRegistries.java | 31 ++++++++++++++++--- src/main/java/com/simibubi/create/Create.java | 4 +-- .../simibubi/create/events/CommonEvents.java | 4 --- .../foundation/data/BogeyStyleBuilder.java | 13 +++++--- 5 files changed, 41 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/simibubi/create/AllBogeyStyles.java b/src/main/java/com/simibubi/create/AllBogeyStyles.java index 5fdba3d5e..76bf4bfaf 100644 --- a/src/main/java/com/simibubi/create/AllBogeyStyles.java +++ b/src/main/java/com/simibubi/create/AllBogeyStyles.java @@ -11,19 +11,19 @@ import com.tterrag.registrate.util.entry.RegistryEntry; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.registries.DeferredRegister; +import static com.simibubi.create.Create.LOGGER; import static com.simibubi.create.Create.REGISTRATE; @SuppressWarnings("unused") public class AllBogeyStyles { - public static final DeferredRegister BOGEYS = DeferredRegister.create(AllRegistries.BOGEY_NAME, Create.ID); - public static final RegistryEntry STANDARD = REGISTRATE .bogeyStyle("standard", new BogeyStyle(StandardBogeyInstance.class)) - .block(BogeyRenderer.BogeySize.SMALL, AllBlocks.SMALL_BOGEY.get()) - .block(BogeyRenderer.BogeySize.LARGE, AllBlocks.LARGE_BOGEY.get()) + .block(BogeyRenderer.BogeySize.SMALL, AllBlocks.SMALL_BOGEY) + .block(BogeyRenderer.BogeySize.LARGE, AllBlocks.LARGE_BOGEY) .register(); public static void register() { - BOGEYS.register(FMLJavaModLoadingContext.get().getModEventBus()); + 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/AllRegistries.java b/src/main/java/com/simibubi/create/AllRegistries.java index 551e65374..00d931565 100644 --- a/src/main/java/com/simibubi/create/AllRegistries.java +++ b/src/main/java/com/simibubi/create/AllRegistries.java @@ -2,19 +2,42 @@ package com.simibubi.create; import com.simibubi.create.content.logistics.trains.entity.BogeyStyle; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.IForgeRegistry; +import net.minecraftforge.registries.IForgeRegistryEntry; import net.minecraftforge.registries.NewRegistryEvent; import net.minecraftforge.registries.RegistryBuilder; import java.util.function.Supplier; +@Mod.EventBusSubscriber(modid = Create.ID, bus = Mod.EventBusSubscriber.Bus.MOD) public class AllRegistries { - public static final ResourceLocation BOGEY_NAME = new ResourceLocation(Create.ID, "bogeys"); + static final DeferredRegister DEFERRED_BOGEY_REGISTRY = DeferredRegister + .create(Keys.BOGEYS, Keys.BOGEYS.location().getNamespace()); - public static Supplier> BOGEY_STYLES; + public static final Supplier> BOGEY_REGISTRY = DEFERRED_BOGEY_REGISTRY + .makeRegistry(BogeyStyle.class, AllRegistries::getBogeyRegistryBuilder); - public static void register(final NewRegistryEvent event) { - BOGEY_STYLES = event.create(new RegistryBuilder().setName(BOGEY_NAME)); + public static RegistryBuilder getBogeyRegistryBuilder() { + return makeRegistry(Keys.BOGEYS, BogeyStyle.class); + } + + private static > RegistryBuilder makeRegistry(ResourceKey> key, Class type) { + return new RegistryBuilder().setName(key.location()).setType(type); + } + + @SubscribeEvent + public void onRegistryNewRegistry(final NewRegistryEvent event) { + event.create(getBogeyRegistryBuilder()); + } + + public static class Keys { + public static final ResourceKey> BOGEYS = ResourceKey + .createRegistryKey(new ResourceLocation(Create.ID, "bogeys")); } } diff --git a/src/main/java/com/simibubi/create/Create.java b/src/main/java/com/simibubi/create/Create.java index c3ac48d43..61d87ba7d 100644 --- a/src/main/java/com/simibubi/create/Create.java +++ b/src/main/java/com/simibubi/create/Create.java @@ -119,9 +119,9 @@ public class Create { AllEntityDataSerializers.register(modEventBus); AllOreFeatureConfigEntries.init(); AllFeatures.register(modEventBus); - AllBogeyStyles.register(); AllPlacementModifiers.register(modEventBus); BuiltinRegistration.register(modEventBus); + AllBogeyStyles.register(); AllConfigs.register(modLoadingContext); @@ -144,8 +144,6 @@ public class Create { DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> CreateClient.onCtorClient(modEventBus, forgeEventBus)); Mods.CURIOS.executeIfInstalled(() -> () -> Curios.init(modEventBus, forgeEventBus)); - - System.out.println(AllRegistries.BOGEY_STYLES.get().getValues()); } public static void init(final FMLCommonSetupEvent event) { diff --git a/src/main/java/com/simibubi/create/events/CommonEvents.java b/src/main/java/com/simibubi/create/events/CommonEvents.java index ce5b49ddc..8f5cf2e3d 100644 --- a/src/main/java/com/simibubi/create/events/CommonEvents.java +++ b/src/main/java/com/simibubi/create/events/CommonEvents.java @@ -231,10 +231,6 @@ public class CommonEvents { @EventBusSubscriber(bus = EventBusSubscriber.Bus.MOD) public static class ModBusEvents { - @SubscribeEvent - public static void registerRegistries(final NewRegistryEvent event) { - AllRegistries.register(event); - } @SubscribeEvent public static void registerCapabilities(RegisterCapabilitiesEvent event) { 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 62d8ca496..812f9212d 100644 --- a/src/main/java/com/simibubi/create/foundation/data/BogeyStyleBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/data/BogeyStyleBuilder.java @@ -13,6 +13,8 @@ import com.tterrag.registrate.builders.AbstractBuilder; import com.tterrag.registrate.builders.BuilderCallback; +import com.tterrag.registrate.util.entry.BlockEntry; +import com.tterrag.registrate.util.entry.RegistryEntry; import com.tterrag.registrate.util.nullness.NonNullSupplier; import net.minecraft.core.particles.ParticleType; @@ -31,7 +33,8 @@ import java.util.function.Supplier; public class BogeyStyleBuilder extends AbstractBuilder> { private final T style; - private NonNullSupplier> bogeyBlocks = () -> new EnumMap<>(BogeyRenderer.BogeySize.class); + private NonNullSupplier>> bogeyBlocks + = () -> new EnumMap<>(BogeyRenderer.BogeySize.class); private Supplier sounds; private Supplier data; private Supplier> particles; @@ -41,11 +44,11 @@ public class BogeyStyleBuilder extends AbstractBuilder< } protected BogeyStyleBuilder(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, T style) { - super(owner, parent, name, callback, AllRegistries.BOGEY_STYLES.get().getRegistryKey()); + super(owner, parent, name, callback, AllRegistries.Keys.BOGEYS); this.style = style; - bogeyBlocks.get().put(BogeyRenderer.BogeySize.SMALL, AllBlocks.SMALL_BOGEY.get()); - bogeyBlocks.get().put(BogeyRenderer.BogeySize.LARGE, AllBlocks.LARGE_BOGEY.get()); +// bogeyBlocks.get().put(BogeyRenderer.BogeySize.SMALL, AllBlocks.SMALL_BOGEY.get()); +// bogeyBlocks.get().put(BogeyRenderer.BogeySize.LARGE, AllBlocks.LARGE_BOGEY.get()); } public BogeyStyleBuilder defaultData(CompoundTag data) { @@ -63,7 +66,7 @@ public class BogeyStyleBuilder extends AbstractBuilder< return this; } - public BogeyStyleBuilder block(BogeyRenderer.BogeySize size, IBogeyBlock block) { + public BogeyStyleBuilder block(BogeyRenderer.BogeySize size, BlockEntry block) { this.bogeyBlocks.get().put(size, block); return this; } From da593fccb1cb95232290289775affd097153e30d Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Thu, 30 Mar 2023 18:46:02 +0100 Subject: [PATCH 24/53] Refactored IBogeyBlock to AbstractBogeyBlock and extracted relevant StandardBogeyBlock implementations --- .../structureMovement/Contraption.java | 6 +- .../logistics/trains/AbstractBogeyBlock.java | 178 +++++++++++++++ .../content/logistics/trains/IBogeyBlock.java | 94 -------- .../trains/entity/CarriageBogey.java | 10 +- .../trains/entity/CarriageContraption.java | 8 +- .../logistics/trains/entity/TrainPacket.java | 4 +- .../edgePoint/station/StationTileEntity.java | 12 +- .../trains/track/StandardBogeyBlock.java | 202 +----------------- .../trains/track/StandardBogeyTileEntity.java | 9 +- .../foundation/data/BuilderTransformers.java | 4 +- 10 files changed, 212 insertions(+), 315 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/logistics/trains/AbstractBogeyBlock.java delete mode 100644 src/main/java/com/simibubi/create/content/logistics/trains/IBogeyBlock.java diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java index 1133742ea..7a74a69c4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java @@ -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.redstone.RedstoneContactBlock; 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.tileEntity.IMultiTileContainer; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; @@ -342,7 +342,7 @@ public abstract class Contraption { } // 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)) if (!visited.contains(pos.relative(d))) frontier.add(pos.relative(d)); @@ -1006,7 +1006,7 @@ public abstract class Contraption { if (disassembled) return; disassembled = true; - + for (boolean nonBrittles : Iterate.trueAndFalse) { for (StructureBlockInfo block : blocks.values()) { if (nonBrittles == BlockMovementChecks.isBrittle(block.state)) 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 new file mode 100644 index 000000000..559244bf3 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/AbstractBogeyBlock.java @@ -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, ProperWaterloggedBlock, ISpecialBlockItemRequirement, IWrenchable { + public static final EnumProperty AXIS = BlockStateProperties.HORIZONTAL_AXIS; + static final List 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 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 STICKY_X = EnumSet.of(Direction.EAST, Direction.WEST); + static final EnumSet STICKY_Z = EnumSet.of(Direction.SOUTH, Direction.NORTH); + + public EnumSet 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(); +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/IBogeyBlock.java b/src/main/java/com/simibubi/create/content/logistics/trains/IBogeyBlock.java deleted file mode 100644 index bb57140e7..000000000 --- a/src/main/java/com/simibubi/create/content/logistics/trains/IBogeyBlock.java +++ /dev/null @@ -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 BOGEYS = new ArrayList<>(); - - public static void register(ResourceLocation block) { - BOGEYS.add(block); - } - - public EnumSet 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 getRendererClass(); - - public BogeyRenderer getRenderer(); -} 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 c9e2d7220..7c9b1aee7 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 @@ -5,7 +5,7 @@ import javax.annotation.Nullable; import com.jozufozu.flywheel.api.MaterialManager; import com.simibubi.create.Create; 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.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.Couple; @@ -31,7 +31,7 @@ public class CarriageBogey { boolean isLeading; - IBogeyBlock type; + AbstractBogeyBlock type; Couple points; LerpedFloat wheelAngle; @@ -42,7 +42,7 @@ public class CarriageBogey { int derailAngle; - public CarriageBogey(IBogeyBlock type, TravellingPoint point, TravellingPoint point2) { + public CarriageBogey(AbstractBogeyBlock type, TravellingPoint point, TravellingPoint point2) { this.type = type; points = Couple.create(point, point2); wheelAngle = LerpedFloat.angular(); @@ -155,7 +155,7 @@ public class CarriageBogey { public static CarriageBogey read(CompoundTag tag, TrackGraph graph, DimensionPalette dimensions) { ResourceLocation location = new ResourceLocation(tag.getString("Type")); - IBogeyBlock type = (IBogeyBlock) ForgeRegistries.BLOCKS.getValue(location); + 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()); @@ -163,7 +163,7 @@ public class CarriageBogey { } public BogeyInstance createInstance(MaterialManager materialManager) { - return type.createInstance(materialManager, this); + return type.getStyle().createInstance(this, type.getSize(), materialManager); } void setLeading() { diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageContraption.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageContraption.java index ad2396191..3d06b191b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageContraption.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageContraption.java @@ -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.processing.burner.BlazeBurnerBlock; 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.Iterate; import com.simibubi.create.foundation.utility.Lang; @@ -71,7 +71,7 @@ public class CarriageContraption extends Contraption { // render public int portalCutoffMin; public int portalCutoffMax; - + static final IItemHandlerModifiable fallbackItems = new ItemStackHandler(); static final IFluidHandler fallbackFluids = new FluidTank(0); @@ -162,7 +162,7 @@ public class CarriageContraption extends Contraption { .getStep(), toLocalPos(pos)); } - if (blockState.getBlock() instanceof IBogeyBlock) { + if (blockState.getBlock() instanceof AbstractBogeyBlock) { bogeys++; if (bogeys == 2) secondBogeyPos = pos; @@ -235,7 +235,7 @@ public class CarriageContraption extends Contraption { protected MountedStorageManager getStorageForSpawnPacket() { return storageProxy; } - + @Override protected ContraptionType getType() { return ContraptionType.CARRIAGE; 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 479b2699e..3976b5406 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 @@ -7,7 +7,7 @@ import java.util.UUID; import java.util.function.Supplier; 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.utility.Couple; import com.simibubi.create.foundation.utility.Iterate; @@ -47,7 +47,7 @@ public class TrainPacket extends SimplePacketBase { for (boolean first : Iterate.trueAndFalse) { if (!first && !buffer.readBoolean()) 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())); } int spacing = buffer.readVarInt(); 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 9fdb9a96b..d1122cfeb 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 @@ -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.logistics.block.depot.DepotBehaviour; 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.TrackEdge; import com.simibubi.create.content.logistics.trains.TrackGraph; @@ -189,7 +189,7 @@ public class StationTileEntity extends SmartTileEntity implements ITransformable Direction assemblyDirection; int assemblyLength; int[] bogeyLocations; - IBogeyBlock[] bogeyTypes; + AbstractBogeyBlock[] bogeyTypes; int bogeyCount; @Override @@ -272,7 +272,7 @@ public class StationTileEntity extends SmartTileEntity implements ITransformable BlockPos bogeyPos = pos.relative(assemblyDirection, i) .offset(up); 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); bogey.playRotateSound(level, bogeyPos); return true; @@ -370,7 +370,7 @@ public class StationTileEntity extends SmartTileEntity implements ITransformable if (bogeyLocations == null) bogeyLocations = new int[maxBogeyCount]; if (bogeyTypes == null) - bogeyTypes = new IBogeyBlock[maxBogeyCount]; + bogeyTypes = new AbstractBogeyBlock[maxBogeyCount]; Arrays.fill(bogeyLocations, -1); Arrays.fill(bogeyTypes, null); @@ -385,7 +385,7 @@ public class StationTileEntity extends SmartTileEntity implements ITransformable } 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; bogeyLocations[bogeyIndex] = i; bogeyIndex++; @@ -591,7 +591,7 @@ public class StationTileEntity extends SmartTileEntity implements ITransformable return; } - IBogeyBlock typeOfFirstBogey = bogeyTypes[bogeyIndex]; + AbstractBogeyBlock typeOfFirstBogey = bogeyTypes[bogeyIndex]; CarriageBogey firstBogey = new CarriageBogey(typeOfFirstBogey, points.get(pointIndex), points.get(pointIndex + 1)); CarriageBogey secondBogey = null; 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 b19953706..41eea45fc 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 @@ -2,95 +2,34 @@ package com.simibubi.create.content.logistics.trains.track; 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.AllBogeyStyles; 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.IBogeyBlock; -import com.simibubi.create.content.logistics.trains.StandardBogeyRenderer; -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.logistics.trains.AbstractBogeyBlock; +import com.simibubi.create.content.logistics.trains.entity.BogeyStyle; 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.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.Direction; -import net.minecraft.core.Direction.Axis; -import net.minecraft.nbt.CompoundTag; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; 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.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.Vec3; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -public class StandardBogeyBlock extends Block - implements IBogeyBlock, ITE, ProperWaterloggedBlock, ISpecialBlockItemRequirement { - - public static final EnumProperty AXIS = BlockStateProperties.HORIZONTAL_AXIS; +public class StandardBogeyBlock extends AbstractBogeyBlock implements ITE, ProperWaterloggedBlock, ISpecialBlockItemRequirement { private final boolean large; - private final BogeyRenderer renderer; - public StandardBogeyBlock(Properties p_i48440_1_, boolean large) { super(p_i48440_1_); this.large = large; - this.renderer = new StandardBogeyRenderer(); registerDefaultState(defaultBlockState().setValue(WATERLOGGED, false)); } - @Override - protected void createBlockStateDefinition(Builder builder) { - builder.add(AXIS, WATERLOGGED); - super.createBlockStateDefinition(builder); - } - - static final EnumSet STICKY_X = EnumSet.of(Direction.EAST, Direction.WEST); - static final EnumSet STICKY_Z = EnumSet.of(Direction.SOUTH, Direction.NORTH); - - @Override - public EnumSet 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 public double getWheelPointSpacing() { return 2; @@ -107,132 +46,13 @@ public class StandardBogeyBlock extends Block } @Override - public boolean allowsSingleBogeyCarriage() { - return true; + public BogeyStyle getStyle() { + return AllBogeyStyles.STANDARD.get(); } @Override - public BlockState getMatchingBogey(Direction upDirection, boolean axisAlongFirst) { - if (upDirection != Direction.UP) - return null; - return defaultBlockState().setValue(AXIS, axisAlongFirst ? Axis.X : Axis.Z); - } - - @Override - public Class 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; - }; + public BogeyRenderer.BogeySize getSize() { + return large ? BogeyRenderer.BogeySize.LARGE : BogeyRenderer.BogeySize.SMALL; } @Override @@ -250,10 +70,4 @@ public class StandardBogeyBlock extends Block public BlockEntityType getTileEntityType() { return AllTileEntities.BOGEY.get(); } - - @Override - public ItemRequirement getRequiredItems(BlockState state, BlockEntity te) { - return new ItemRequirement(ItemUseType.CONSUME, AllBlocks.RAILWAY_CASING.asStack()); - } - } 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 9a4c8a621..39417fd43 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,6 +1,6 @@ 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.utility.animation.LerpedFloat; @@ -21,16 +21,15 @@ public class StandardBogeyTileEntity extends CachedRenderBBTileEntity { } // Ponder - LerpedFloat virtualAnimation = LerpedFloat.angular(); - + public float getVirtualAngle(float partialTicks) { return virtualAnimation.getValue(partialTicks); } - + public void animate(float distanceMoved) { BlockState blockState = getBlockState(); - if (!(blockState.getBlock() instanceof IBogeyBlock type)) + if (!(blockState.getBlock() instanceof AbstractBogeyBlock type)) return; double angleDiff = 360 * distanceMoved / (Math.PI * 2 * type.getWheelRadius()); double newWheelAngle = (virtualAnimation.getValue() - angleDiff) % 360; diff --git a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java index acf1ce517..5d8f5e49b 100644 --- a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java +++ b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java @@ -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.Shape; 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.foundation.block.BlockStressDefaults; import com.simibubi.create.foundation.block.ItemUseOverrides; @@ -88,7 +88,7 @@ public class BuilderTransformers { .blockstate((c, p) -> BlockStateGen.horizontalAxisBlock(c, p, s -> p.models() .getExistingFile(p.modLoc("block/track/bogey/top")))) .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 NonNullUnaryOperator> trapdoor(boolean orientable) { From d1e1f7ec5abeb825a3170a8f6972ffae43d58381 Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Thu, 30 Mar 2023 18:47:13 +0100 Subject: [PATCH 25/53] Re-worked BogeyStyles --- .../com/simibubi/create/AllBogeyStyles.java | 7 +-- .../BlockMovementChecks.java | 4 +- .../trains/BogeyTileEntityRenderer.java | 4 +- .../trains/entity/BogeyInstance.java | 11 +++- .../logistics/trains/entity/BogeyStyle.java | 53 ++++++++++++++++--- .../CarriageContraptionEntityRenderer.java | 7 ++- .../trains/entity/StandardBogeyInstance.java | 5 ++ .../foundation/data/BogeyStyleBuilder.java | 44 +++++++++------ 8 files changed, 98 insertions(+), 37 deletions(-) diff --git a/src/main/java/com/simibubi/create/AllBogeyStyles.java b/src/main/java/com/simibubi/create/AllBogeyStyles.java index 76bf4bfaf..4f19f70d2 100644 --- a/src/main/java/com/simibubi/create/AllBogeyStyles.java +++ b/src/main/java/com/simibubi/create/AllBogeyStyles.java @@ -1,15 +1,10 @@ package com.simibubi.create; import com.simibubi.create.content.logistics.trains.BogeyRenderer; - 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; -import net.minecraftforge.registries.DeferredRegister; import static com.simibubi.create.Create.LOGGER; import static com.simibubi.create.Create.REGISTRATE; @@ -17,7 +12,7 @@ import static com.simibubi.create.Create.REGISTRATE; @SuppressWarnings("unused") public class AllBogeyStyles { public static final RegistryEntry STANDARD = REGISTRATE - .bogeyStyle("standard", new BogeyStyle(StandardBogeyInstance.class)) + .bogeyStyle("standard", new BogeyStyle()) .block(BogeyRenderer.BogeySize.SMALL, AllBlocks.SMALL_BOGEY) .block(BogeyRenderer.BogeySize.LARGE, AllBlocks.LARGE_BOGEY) .register(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementChecks.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementChecks.java index ce06099e4..72cc6524a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementChecks.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementChecks.java @@ -30,7 +30,7 @@ import com.simibubi.create.content.contraptions.fluids.tank.FluidTankBlock; import com.simibubi.create.content.curiosities.deco.SlidingDoorBlock; import com.simibubi.create.content.logistics.block.redstone.RedstoneLinkBlock; import com.simibubi.create.content.logistics.block.vault.ItemVaultBlock; -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.management.edgePoint.station.StationBlock; import com.simibubi.create.foundation.config.ContraptionMovementSetting; @@ -337,7 +337,7 @@ public class BlockMovementChecks { return direction == state.getValue(StickerBlock.FACING) && !isNotSupportive(world.getBlockState(pos.relative(direction)), direction.getOpposite()); } - if (block instanceof IBogeyBlock bogey) + if (block instanceof AbstractBogeyBlock bogey) return bogey.getStickySurfaces(world, pos, state) .contains(direction); if (block instanceof WhistleBlock) diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/BogeyTileEntityRenderer.java b/src/main/java/com/simibubi/create/content/logistics/trains/BogeyTileEntityRenderer.java index 94a08b145..29908b5e6 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/BogeyTileEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/BogeyTileEntityRenderer.java @@ -20,8 +20,8 @@ public class BogeyTileEntityRenderer extends SafeTileEnti float angle = 0; if (te instanceof StandardBogeyTileEntity sbte) angle = sbte.getVirtualAngle(partialTicks); - if (blockState.getBlock()instanceof IBogeyBlock bogey) - bogey.render(blockState, angle, ms, partialTicks, buffer, light, overlay); + if (blockState.getBlock()instanceof AbstractBogeyBlock bogey) + bogey.render(blockState, angle, ms, partialTicks, buffer, light, overlay, te.getTileData()); } } 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 eacc51ada..9eb349124 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 @@ -30,7 +30,8 @@ public abstract class BogeyInstance { public final BogeyRenderer renderer; private final BogeyRenderer.BogeySize size; - public BogeyInstance(CarriageBogey bogey, BogeyRenderer renderer, BogeyRenderer.BogeySize size, MaterialManager materialManager) { + public BogeyInstance(CarriageBogey bogey, BogeyRenderer renderer, BogeyRenderer.BogeySize size, + MaterialManager materialManager) { this.bogey = bogey; this.renderer = renderer; this.size = size; @@ -38,6 +39,8 @@ public abstract class BogeyInstance { renderer.initialiseContraptionModelData(materialManager, size); } + public abstract BogeyInstanceFactory getInstanceFactory(); + protected void hiddenFrame() { beginFrame(0, null); } @@ -61,4 +64,10 @@ public abstract class BogeyInstance { return bogey.getAnchorPosition() != null ? bogey.getAnchorPosition() : entity.getLightProbePosition(AnimationTickHolder.getPartialTicks()); } + + @FunctionalInterface + interface BogeyInstanceFactory { + BogeyInstance create(CarriageBogey bogey, BogeyRenderer.BogeySize size, + MaterialManager materialManager); + } } 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 4ff645b65..857c47354 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 @@ -1,23 +1,60 @@ package com.simibubi.create.content.logistics.trains.entity; +import com.jozufozu.flywheel.api.MaterialManager; +import com.simibubi.create.content.logistics.trains.BogeyRenderer; import com.simibubi.create.content.logistics.trains.BogeyRenderer.BogeySize; -import com.simibubi.create.content.logistics.trains.IBogeyBlock; +import com.simibubi.create.content.logistics.trains.AbstractBogeyBlock; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SoundType; +import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.ForgeRegistryEntry; import net.minecraftforge.registries.IForgeRegistryEntry; +import java.util.EnumMap; import java.util.Map; +import java.util.Set; +import java.util.stream.Stream; -public class BogeyStyle extends ForgeRegistryEntry implements IForgeRegistryEntry { - public Map blocks; - final Class instance; +public final class BogeyStyle extends ForgeRegistryEntry implements IForgeRegistryEntry { + public Map blocks = new EnumMap<>(BogeySize.class); + public BogeyInstance.BogeyInstanceFactory instance; + public Component displayName; + public SoundType soundType; + public CompoundTag defaultData; + public BogeyRenderer renderer; - public BogeyStyle(Class instance) { - this.instance = instance; + public void addBlockForSize(BogeySize size, T block) { + this.addBlockForSize(size, block.getRegistryName()); } - public BogeyInstance getInstance() throws IllegalAccessException, InstantiationException { - return instance.newInstance(); + public void addBlockForSize(BogeySize size, ResourceLocation location) { + blocks.put(size, location); + } + + public Block getNextBlock(BogeySize currentSize) { + return Stream.iterate(getNextSize(currentSize), this::getNextSize) + .filter(size -> blocks.containsKey(size)) + .findFirst() + .map(size -> ForgeRegistries.BLOCKS.getValue(blocks.get(size))) + .orElse(ForgeRegistries.BLOCKS.getValue(blocks.get(currentSize))); + } + + public Set validSizes() { + return blocks.keySet(); + } + + private BogeySize getNextSize(BogeySize size) { + BogeySize[] sizes = BogeySize.values(); + int nextOrdinal = (size.ordinal() + 1) % sizes.length; + return sizes[nextOrdinal]; + } + + public BogeyInstance createInstance(CarriageBogey bogey, BogeySize size, MaterialManager materialManager) { + return instance.create(bogey, size, materialManager); } } 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 5de635e4a..071e152d6 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 @@ -13,6 +13,7 @@ import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.core.BlockPos; import net.minecraft.world.level.LightLayer; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.phys.Vec3; public class CarriageContraptionEntityRenderer extends ContraptionEntityRenderer { @@ -37,7 +38,7 @@ public class CarriageContraptionEntityRenderer extends ContraptionEntityRenderer MultiBufferSource buffers, int overlay) { if (!entity.validForRender || entity.firstPositionUpdate) return; - + super.render(entity, yaw, partialTicks, ms, buffers, overlay); Carriage carriage = entity.getCarriage(); @@ -65,8 +66,10 @@ public class CarriageContraptionEntityRenderer extends ContraptionEntityRenderer translateBogey(ms, bogey, bogeySpacing, viewYRot, viewXRot, partialTicks); int light = getBogeyLightCoords(entity, bogey, partialTicks); + BlockEntity be = entity.getContraption().presentTileEntities.get(bogeyPos); + bogey.type.render(null, bogey.wheelAngle.getValue(partialTicks), ms, partialTicks, buffers, light, - overlay); + overlay, be.getTileData()); 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 74d9ec556..09381c413 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 @@ -17,4 +17,9 @@ public class StandardBogeyInstance extends BogeyInstance { public static StandardBogeyInstance frame(CarriageBogey bogey, MaterialManager materialManager) { return new StandardBogeyInstance(bogey, BogeyRenderer.BogeySize.SMALL, materialManager); } + + @Override + public BogeyInstanceFactory getInstanceFactory() { + return StandardBogeyInstance::new; + } } 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 812f9212d..ac8c4c5ce 100644 --- a/src/main/java/com/simibubi/create/foundation/data/BogeyStyleBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/data/BogeyStyleBuilder.java @@ -1,10 +1,10 @@ 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.IBogeyBlock; +import com.simibubi.create.content.logistics.trains.AbstractBogeyBlock; import com.simibubi.create.content.logistics.trains.entity.BogeyStyle; import com.tterrag.registrate.AbstractRegistrate; @@ -14,28 +14,27 @@ import com.tterrag.registrate.builders.AbstractBuilder; import com.tterrag.registrate.builders.BuilderCallback; import com.tterrag.registrate.util.entry.BlockEntry; -import com.tterrag.registrate.util.entry.RegistryEntry; + import com.tterrag.registrate.util.nullness.NonNullSupplier; import net.minecraft.core.particles.ParticleType; import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.SoundType; + import org.jetbrains.annotations.NotNull; import javax.annotation.ParametersAreNonnullByDefault; -import java.util.EnumMap; -import java.util.Map; import java.util.function.Supplier; @ParametersAreNonnullByDefault public class BogeyStyleBuilder extends AbstractBuilder> { private final T style; - - private NonNullSupplier>> bogeyBlocks - = () -> new EnumMap<>(BogeyRenderer.BogeySize.class); - private Supplier sounds; + private NonNullSupplier renderer; + private Supplier soundType; private Supplier data; private Supplier> particles; @@ -46,9 +45,10 @@ public class BogeyStyleBuilder extends AbstractBuilder< protected BogeyStyleBuilder(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, T style) { super(owner, parent, name, callback, AllRegistries.Keys.BOGEYS); this.style = style; - -// bogeyBlocks.get().put(BogeyRenderer.BogeySize.SMALL, AllBlocks.SMALL_BOGEY.get()); -// bogeyBlocks.get().put(BogeyRenderer.BogeySize.LARGE, AllBlocks.LARGE_BOGEY.get()); + this.particles = AllParticleTypes.AIR_FLOW::get; + this.data = CompoundTag::new; + this.block(BogeyRenderer.BogeySize.SMALL, AllBlocks.SMALL_BOGEY); + this.block(BogeyRenderer.BogeySize.LARGE, AllBlocks.LARGE_BOGEY); } public BogeyStyleBuilder defaultData(CompoundTag data) { @@ -61,18 +61,30 @@ public class BogeyStyleBuilder extends AbstractBuilder< return this; } - public BogeyStyleBuilder soundType(AllSoundEvents.SoundEntry soundEntry) { - this.sounds = () -> soundEntry; + public BogeyStyleBuilder soundType(SoundType soundEntry) { + this.soundType = () -> soundEntry; return this; } - public BogeyStyleBuilder block(BogeyRenderer.BogeySize size, BlockEntry block) { - this.bogeyBlocks.get().put(size, block); + public BogeyStyleBuilder block(BogeyRenderer.BogeySize size, BlockEntry block) { + return this.block(size, block.getId()); + } + + public BogeyStyleBuilder block(BogeyRenderer.BogeySize size, ResourceLocation location) { + this.style.addBlockForSize(size, location); + return this; + } + + public BogeyStyleBuilder renderer(BogeyRenderer renderer) { + this.renderer = () -> renderer; return this; } @Override protected @NotNull T createEntry() { + style.soundType = soundType.get(); + style.defaultData = data.get(); + style.renderer = renderer.get(); return style; } } From 50ff0817045029c721a0a5e38956b3ecd228e52f Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Thu, 30 Mar 2023 18:47:13 +0100 Subject: [PATCH 26/53] Added Resource Location To NBT helper methods --- .../com/simibubi/create/AllBogeyStyles.java | 7 +-- .../BlockMovementChecks.java | 4 +- .../trains/BogeyTileEntityRenderer.java | 4 +- .../trains/entity/BogeyInstance.java | 11 +++- .../logistics/trains/entity/BogeyStyle.java | 53 ++++++++++++++++--- .../CarriageContraptionEntityRenderer.java | 7 ++- .../trains/entity/StandardBogeyInstance.java | 5 ++ .../foundation/data/BogeyStyleBuilder.java | 44 +++++++++------ .../create/foundation/utility/NBTHelper.java | 15 ++++++ 9 files changed, 113 insertions(+), 37 deletions(-) diff --git a/src/main/java/com/simibubi/create/AllBogeyStyles.java b/src/main/java/com/simibubi/create/AllBogeyStyles.java index 76bf4bfaf..4f19f70d2 100644 --- a/src/main/java/com/simibubi/create/AllBogeyStyles.java +++ b/src/main/java/com/simibubi/create/AllBogeyStyles.java @@ -1,15 +1,10 @@ package com.simibubi.create; import com.simibubi.create.content.logistics.trains.BogeyRenderer; - 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; -import net.minecraftforge.registries.DeferredRegister; import static com.simibubi.create.Create.LOGGER; import static com.simibubi.create.Create.REGISTRATE; @@ -17,7 +12,7 @@ import static com.simibubi.create.Create.REGISTRATE; @SuppressWarnings("unused") public class AllBogeyStyles { public static final RegistryEntry STANDARD = REGISTRATE - .bogeyStyle("standard", new BogeyStyle(StandardBogeyInstance.class)) + .bogeyStyle("standard", new BogeyStyle()) .block(BogeyRenderer.BogeySize.SMALL, AllBlocks.SMALL_BOGEY) .block(BogeyRenderer.BogeySize.LARGE, AllBlocks.LARGE_BOGEY) .register(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementChecks.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementChecks.java index ce06099e4..72cc6524a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementChecks.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementChecks.java @@ -30,7 +30,7 @@ import com.simibubi.create.content.contraptions.fluids.tank.FluidTankBlock; import com.simibubi.create.content.curiosities.deco.SlidingDoorBlock; import com.simibubi.create.content.logistics.block.redstone.RedstoneLinkBlock; import com.simibubi.create.content.logistics.block.vault.ItemVaultBlock; -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.management.edgePoint.station.StationBlock; import com.simibubi.create.foundation.config.ContraptionMovementSetting; @@ -337,7 +337,7 @@ public class BlockMovementChecks { return direction == state.getValue(StickerBlock.FACING) && !isNotSupportive(world.getBlockState(pos.relative(direction)), direction.getOpposite()); } - if (block instanceof IBogeyBlock bogey) + if (block instanceof AbstractBogeyBlock bogey) return bogey.getStickySurfaces(world, pos, state) .contains(direction); if (block instanceof WhistleBlock) diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/BogeyTileEntityRenderer.java b/src/main/java/com/simibubi/create/content/logistics/trains/BogeyTileEntityRenderer.java index 94a08b145..29908b5e6 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/BogeyTileEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/BogeyTileEntityRenderer.java @@ -20,8 +20,8 @@ public class BogeyTileEntityRenderer extends SafeTileEnti float angle = 0; if (te instanceof StandardBogeyTileEntity sbte) angle = sbte.getVirtualAngle(partialTicks); - if (blockState.getBlock()instanceof IBogeyBlock bogey) - bogey.render(blockState, angle, ms, partialTicks, buffer, light, overlay); + if (blockState.getBlock()instanceof AbstractBogeyBlock bogey) + bogey.render(blockState, angle, ms, partialTicks, buffer, light, overlay, te.getTileData()); } } 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 eacc51ada..9eb349124 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 @@ -30,7 +30,8 @@ public abstract class BogeyInstance { public final BogeyRenderer renderer; private final BogeyRenderer.BogeySize size; - public BogeyInstance(CarriageBogey bogey, BogeyRenderer renderer, BogeyRenderer.BogeySize size, MaterialManager materialManager) { + public BogeyInstance(CarriageBogey bogey, BogeyRenderer renderer, BogeyRenderer.BogeySize size, + MaterialManager materialManager) { this.bogey = bogey; this.renderer = renderer; this.size = size; @@ -38,6 +39,8 @@ public abstract class BogeyInstance { renderer.initialiseContraptionModelData(materialManager, size); } + public abstract BogeyInstanceFactory getInstanceFactory(); + protected void hiddenFrame() { beginFrame(0, null); } @@ -61,4 +64,10 @@ public abstract class BogeyInstance { return bogey.getAnchorPosition() != null ? bogey.getAnchorPosition() : entity.getLightProbePosition(AnimationTickHolder.getPartialTicks()); } + + @FunctionalInterface + interface BogeyInstanceFactory { + BogeyInstance create(CarriageBogey bogey, BogeyRenderer.BogeySize size, + MaterialManager materialManager); + } } 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 4ff645b65..857c47354 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 @@ -1,23 +1,60 @@ package com.simibubi.create.content.logistics.trains.entity; +import com.jozufozu.flywheel.api.MaterialManager; +import com.simibubi.create.content.logistics.trains.BogeyRenderer; import com.simibubi.create.content.logistics.trains.BogeyRenderer.BogeySize; -import com.simibubi.create.content.logistics.trains.IBogeyBlock; +import com.simibubi.create.content.logistics.trains.AbstractBogeyBlock; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SoundType; +import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.ForgeRegistryEntry; import net.minecraftforge.registries.IForgeRegistryEntry; +import java.util.EnumMap; import java.util.Map; +import java.util.Set; +import java.util.stream.Stream; -public class BogeyStyle extends ForgeRegistryEntry implements IForgeRegistryEntry { - public Map blocks; - final Class instance; +public final class BogeyStyle extends ForgeRegistryEntry implements IForgeRegistryEntry { + public Map blocks = new EnumMap<>(BogeySize.class); + public BogeyInstance.BogeyInstanceFactory instance; + public Component displayName; + public SoundType soundType; + public CompoundTag defaultData; + public BogeyRenderer renderer; - public BogeyStyle(Class instance) { - this.instance = instance; + public void addBlockForSize(BogeySize size, T block) { + this.addBlockForSize(size, block.getRegistryName()); } - public BogeyInstance getInstance() throws IllegalAccessException, InstantiationException { - return instance.newInstance(); + public void addBlockForSize(BogeySize size, ResourceLocation location) { + blocks.put(size, location); + } + + public Block getNextBlock(BogeySize currentSize) { + return Stream.iterate(getNextSize(currentSize), this::getNextSize) + .filter(size -> blocks.containsKey(size)) + .findFirst() + .map(size -> ForgeRegistries.BLOCKS.getValue(blocks.get(size))) + .orElse(ForgeRegistries.BLOCKS.getValue(blocks.get(currentSize))); + } + + public Set validSizes() { + return blocks.keySet(); + } + + private BogeySize getNextSize(BogeySize size) { + BogeySize[] sizes = BogeySize.values(); + int nextOrdinal = (size.ordinal() + 1) % sizes.length; + return sizes[nextOrdinal]; + } + + public BogeyInstance createInstance(CarriageBogey bogey, BogeySize size, MaterialManager materialManager) { + return instance.create(bogey, size, materialManager); } } 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 5de635e4a..071e152d6 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 @@ -13,6 +13,7 @@ import net.minecraft.client.renderer.culling.Frustum; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.core.BlockPos; import net.minecraft.world.level.LightLayer; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.phys.Vec3; public class CarriageContraptionEntityRenderer extends ContraptionEntityRenderer { @@ -37,7 +38,7 @@ public class CarriageContraptionEntityRenderer extends ContraptionEntityRenderer MultiBufferSource buffers, int overlay) { if (!entity.validForRender || entity.firstPositionUpdate) return; - + super.render(entity, yaw, partialTicks, ms, buffers, overlay); Carriage carriage = entity.getCarriage(); @@ -65,8 +66,10 @@ public class CarriageContraptionEntityRenderer extends ContraptionEntityRenderer translateBogey(ms, bogey, bogeySpacing, viewYRot, viewXRot, partialTicks); int light = getBogeyLightCoords(entity, bogey, partialTicks); + BlockEntity be = entity.getContraption().presentTileEntities.get(bogeyPos); + bogey.type.render(null, bogey.wheelAngle.getValue(partialTicks), ms, partialTicks, buffers, light, - overlay); + overlay, be.getTileData()); 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 74d9ec556..09381c413 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 @@ -17,4 +17,9 @@ public class StandardBogeyInstance extends BogeyInstance { public static StandardBogeyInstance frame(CarriageBogey bogey, MaterialManager materialManager) { return new StandardBogeyInstance(bogey, BogeyRenderer.BogeySize.SMALL, materialManager); } + + @Override + public BogeyInstanceFactory getInstanceFactory() { + return StandardBogeyInstance::new; + } } 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 812f9212d..ac8c4c5ce 100644 --- a/src/main/java/com/simibubi/create/foundation/data/BogeyStyleBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/data/BogeyStyleBuilder.java @@ -1,10 +1,10 @@ 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.IBogeyBlock; +import com.simibubi.create.content.logistics.trains.AbstractBogeyBlock; import com.simibubi.create.content.logistics.trains.entity.BogeyStyle; import com.tterrag.registrate.AbstractRegistrate; @@ -14,28 +14,27 @@ import com.tterrag.registrate.builders.AbstractBuilder; import com.tterrag.registrate.builders.BuilderCallback; import com.tterrag.registrate.util.entry.BlockEntry; -import com.tterrag.registrate.util.entry.RegistryEntry; + import com.tterrag.registrate.util.nullness.NonNullSupplier; import net.minecraft.core.particles.ParticleType; import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.SoundType; + import org.jetbrains.annotations.NotNull; import javax.annotation.ParametersAreNonnullByDefault; -import java.util.EnumMap; -import java.util.Map; import java.util.function.Supplier; @ParametersAreNonnullByDefault public class BogeyStyleBuilder extends AbstractBuilder> { private final T style; - - private NonNullSupplier>> bogeyBlocks - = () -> new EnumMap<>(BogeyRenderer.BogeySize.class); - private Supplier sounds; + private NonNullSupplier renderer; + private Supplier soundType; private Supplier data; private Supplier> particles; @@ -46,9 +45,10 @@ public class BogeyStyleBuilder extends AbstractBuilder< protected BogeyStyleBuilder(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, T style) { super(owner, parent, name, callback, AllRegistries.Keys.BOGEYS); this.style = style; - -// bogeyBlocks.get().put(BogeyRenderer.BogeySize.SMALL, AllBlocks.SMALL_BOGEY.get()); -// bogeyBlocks.get().put(BogeyRenderer.BogeySize.LARGE, AllBlocks.LARGE_BOGEY.get()); + this.particles = AllParticleTypes.AIR_FLOW::get; + this.data = CompoundTag::new; + this.block(BogeyRenderer.BogeySize.SMALL, AllBlocks.SMALL_BOGEY); + this.block(BogeyRenderer.BogeySize.LARGE, AllBlocks.LARGE_BOGEY); } public BogeyStyleBuilder defaultData(CompoundTag data) { @@ -61,18 +61,30 @@ public class BogeyStyleBuilder extends AbstractBuilder< return this; } - public BogeyStyleBuilder soundType(AllSoundEvents.SoundEntry soundEntry) { - this.sounds = () -> soundEntry; + public BogeyStyleBuilder soundType(SoundType soundEntry) { + this.soundType = () -> soundEntry; return this; } - public BogeyStyleBuilder block(BogeyRenderer.BogeySize size, BlockEntry block) { - this.bogeyBlocks.get().put(size, block); + public BogeyStyleBuilder block(BogeyRenderer.BogeySize size, BlockEntry block) { + return this.block(size, block.getId()); + } + + public BogeyStyleBuilder block(BogeyRenderer.BogeySize size, ResourceLocation location) { + this.style.addBlockForSize(size, location); + return this; + } + + public BogeyStyleBuilder renderer(BogeyRenderer renderer) { + this.renderer = () -> renderer; return this; } @Override protected @NotNull T createEntry() { + style.soundType = soundType.get(); + style.defaultData = data.get(); + style.renderer = renderer.get(); return style; } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/NBTHelper.java b/src/main/java/com/simibubi/create/foundation/utility/NBTHelper.java index 267a343eb..16c389a1e 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/NBTHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/NBTHelper.java @@ -13,6 +13,7 @@ import net.minecraft.nbt.FloatTag; import net.minecraft.nbt.IntTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.AABB; @@ -108,4 +109,18 @@ public class NBTHelper { return new CompoundTag(); } + public static void writeResourceLocation(CompoundTag nbt, String key, ResourceLocation location) { + // Ensure correct format + nbt.putString(key, location.toString()); + } + + public static ResourceLocation readResourceLocation(CompoundTag nbt, String key) { + if (!nbt.contains(key)) + return null; + String[] data = nbt.getString(key).split(":"); + if (data.length != 2) + return null; + return new ResourceLocation(data[0], data[1]); + } + } From 71f839ee51c4d609a19fe57632fb2e8fb0d2e5b7 Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Sat, 1 Apr 2023 18:39:03 +0100 Subject: [PATCH 27/53] Replaced size boolean with direct use of size enum --- .../java/com/simibubi/create/AllBlocks.java | 5 +++-- .../trains/track/StandardBogeyBlock.java | 19 +++++-------------- 2 files changed, 8 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 255f0037e..d97ed1121 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -207,6 +207,7 @@ import com.simibubi.create.content.logistics.block.vault.ItemVaultBlock; import com.simibubi.create.content.logistics.block.vault.ItemVaultCTBehaviour; import com.simibubi.create.content.logistics.block.vault.ItemVaultItem; import com.simibubi.create.content.logistics.item.LecternControllerBlock; +import com.simibubi.create.content.logistics.trains.BogeyRenderer; import com.simibubi.create.content.logistics.trains.management.display.FlapDisplayBlock; import com.simibubi.create.content.logistics.trains.management.edgePoint.EdgePointType; import com.simibubi.create.content.logistics.trains.management.edgePoint.TrackTargetingBlockItem; @@ -1578,13 +1579,13 @@ public class AllBlocks { .register(); public static final BlockEntry SMALL_BOGEY = - REGISTRATE.block("small_bogey", p -> new StandardBogeyBlock(p, false)) + REGISTRATE.block("small_bogey", p -> new StandardBogeyBlock(p, BogeyRenderer.BogeySize.SMALL)) .properties(p -> p.color(MaterialColor.PODZOL)) .transform(BuilderTransformers.bogey()) .register(); public static final BlockEntry LARGE_BOGEY = - REGISTRATE.block("large_bogey", p -> new StandardBogeyBlock(p, true)) + REGISTRATE.block("large_bogey", p -> new StandardBogeyBlock(p, BogeyRenderer.BogeySize.SMALL)) .properties(p -> p.color(MaterialColor.PODZOL)) .transform(BuilderTransformers.bogey()) .register(); 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 41eea45fc..cdf84cb1c 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 @@ -1,13 +1,9 @@ package com.simibubi.create.content.logistics.trains.track; -import java.util.EnumSet; - import com.simibubi.create.AllBlocks; -import com.simibubi.create.AllBogeyStyles; import com.simibubi.create.AllTileEntities; 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; import com.simibubi.create.content.schematics.ISpecialBlockItemRequirement; import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.block.ProperWaterloggedBlock; @@ -22,11 +18,11 @@ import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; public class StandardBogeyBlock extends AbstractBogeyBlock implements ITE, ProperWaterloggedBlock, ISpecialBlockItemRequirement { - private final boolean large; + private final BogeyRenderer.BogeySize size; - public StandardBogeyBlock(Properties p_i48440_1_, boolean large) { + public StandardBogeyBlock(Properties p_i48440_1_, BogeyRenderer.BogeySize large) { super(p_i48440_1_); - this.large = large; + this.size = large; registerDefaultState(defaultBlockState().setValue(WATERLOGGED, false)); } @@ -37,7 +33,7 @@ public class StandardBogeyBlock extends AbstractBogeyBlock implements ITE Date: Sat, 1 Apr 2023 18:39:58 +0100 Subject: [PATCH 28/53] Linked Style Registry To Bogey Blocks --- .../com/simibubi/create/AllBogeyStyles.java | 4 +- .../logistics/trains/AbstractBogeyBlock.java | 18 +++---- .../trains/BogeyTileEntityRenderer.java | 10 ++-- .../trains/entity/BogeyInstance.java | 2 - .../logistics/trains/entity/BogeyStyle.java | 8 ++- .../trains/entity/CarriageBogey.java | 26 ++++++++-- .../CarriageContraptionEntityRenderer.java | 4 +- .../trains/entity/StandardBogeyInstance.java | 3 +- .../logistics/trains/entity/TrainPacket.java | 12 +++-- .../edgePoint/station/StationTileEntity.java | 15 ++++-- .../trains/track/StandardBogeyTileEntity.java | 49 +++++++++++++++++++ .../foundation/data/BogeyStyleBuilder.java | 5 +- 12 files changed, 119 insertions(+), 37 deletions(-) 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; From 43523302c22d5da374d71c69499269eb8c98dadf Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Sun, 2 Apr 2023 16:45:33 +0100 Subject: [PATCH 29/53] Removed Unused Standard Bogey Instance --- .../trains/entity/BogeyInstance.java | 4 +--- .../trains/entity/StandardBogeyInstance.java | 24 ------------------- 2 files changed, 1 insertion(+), 27 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/content/logistics/trains/entity/StandardBogeyInstance.java 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..6533fd2cd 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 @@ -24,7 +24,7 @@ import net.minecraft.world.phys.Vec3; import java.util.EnumMap; import java.util.Map; -public abstract class BogeyInstance { +public final class BogeyInstance { public final CarriageBogey bogey; public final BogeyRenderer renderer; @@ -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/StandardBogeyInstance.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/StandardBogeyInstance.java deleted file mode 100644 index c00a6a078..000000000 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/StandardBogeyInstance.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.simibubi.create.content.logistics.trains.entity; - -import com.jozufozu.flywheel.api.MaterialManager; -import com.simibubi.create.content.logistics.trains.BogeyRenderer; -import com.simibubi.create.content.logistics.trains.StandardBogeyRenderer; - -public class StandardBogeyInstance extends BogeyInstance { - public StandardBogeyInstance(CarriageBogey bogey, BogeyRenderer.BogeySize bogeySize, MaterialManager materialManager) { - super(bogey, new StandardBogeyRenderer(), bogeySize, materialManager); - } - - public static StandardBogeyInstance drive(CarriageBogey bogey, MaterialManager materialManager) { - return new StandardBogeyInstance(bogey, BogeyRenderer.BogeySize.LARGE, materialManager); - } - - - public static StandardBogeyInstance frame(CarriageBogey bogey, MaterialManager materialManager) { - return new StandardBogeyInstance(bogey, BogeyRenderer.BogeySize.SMALL, materialManager); - } - - public static BogeyInstanceFactory getInstanceFactory() { - return StandardBogeyInstance::new; - } -} From a55ba4267a5fd01ec77e9d826a01f0157c3a1271 Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Sun, 2 Apr 2023 16:46:15 +0100 Subject: [PATCH 30/53] Implemented renderer instance creator --- .../create/content/logistics/trains/BogeyRenderer.java | 2 ++ .../content/logistics/trains/StandardBogeyRenderer.java | 5 +++++ .../content/logistics/trains/track/StandardBogeyBlock.java | 4 ++-- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/BogeyRenderer.java b/src/main/java/com/simibubi/create/content/logistics/trains/BogeyRenderer.java index a94dc4b9e..0251b2a6c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/BogeyRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/BogeyRenderer.java @@ -163,6 +163,8 @@ public abstract class BogeyRenderer { return state.toString(); } + public abstract BogeyRenderer newInstance(); + @FunctionalInterface interface Renderer { void render(CompoundTag bogeyData, float wheelAngle, PoseStack ms, int light, VertexConsumer vb); diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/StandardBogeyRenderer.java b/src/main/java/com/simibubi/create/content/logistics/trains/StandardBogeyRenderer.java index 386dcb692..5ba6444dd 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/StandardBogeyRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/StandardBogeyRenderer.java @@ -123,4 +123,9 @@ public class StandardBogeyRenderer extends BogeyRenderer { if (!inContraption) ms.popPose(); } + + @Override + public BogeyRenderer newInstance() { + return new StandardBogeyRenderer(); + } } 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 cdf84cb1c..b5e2f4707 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,8 +20,8 @@ import net.minecraft.world.phys.Vec3; public class StandardBogeyBlock extends AbstractBogeyBlock implements ITE, ProperWaterloggedBlock, ISpecialBlockItemRequirement { private final BogeyRenderer.BogeySize size; - public StandardBogeyBlock(Properties p_i48440_1_, BogeyRenderer.BogeySize large) { - super(p_i48440_1_); + public StandardBogeyBlock(Properties props, BogeyRenderer.BogeySize large) { + super(props); this.size = large; registerDefaultState(defaultBlockState().setValue(WATERLOGGED, false)); } From 68ca0974c6867e61980990a345634963079faf10 Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Sun, 2 Apr 2023 16:47:58 +0100 Subject: [PATCH 31/53] 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); + } } From eedd98473807f1261c7d5edaf0a222c081b57e69 Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Sun, 2 Apr 2023 16:53:55 +0100 Subject: [PATCH 32/53] Fixed Large Bogey Size --- src/main/java/com/simibubi/create/AllBlocks.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index d97ed1121..d802d6d7a 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -1585,7 +1585,7 @@ public class AllBlocks { .register(); public static final BlockEntry LARGE_BOGEY = - REGISTRATE.block("large_bogey", p -> new StandardBogeyBlock(p, BogeyRenderer.BogeySize.SMALL)) + REGISTRATE.block("large_bogey", p -> new StandardBogeyBlock(p, BogeyRenderer.BogeySize.LARGE)) .properties(p -> p.color(MaterialColor.PODZOL)) .transform(BuilderTransformers.bogey()) .register(); From 96566b161441928f2b419340796a27631e1aeb91 Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Sun, 2 Apr 2023 23:02:02 +0100 Subject: [PATCH 33/53] Moved Bogey Style Inside Of Bogey Data And Implemented Bogey Data Communication --- .../com/simibubi/create/AllBogeyStyles.java | 18 +++++- .../logistics/trains/AbstractBogeyBlock.java | 4 +- .../trains/entity/CarriageBogey.java | 36 ++++++----- .../entity/CarriageContraptionInstance.java | 2 +- .../logistics/trains/entity/Train.java | 2 +- .../logistics/trains/entity/TrainPacket.java | 7 ++- .../edgePoint/station/StationTileEntity.java | 4 +- .../trains/track/StandardBogeyBlock.java | 4 +- .../trains/track/StandardBogeyTileEntity.java | 63 ++++++++++++------- 9 files changed, 91 insertions(+), 49 deletions(-) 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); From 1ad5ae95143f5240fcb83448a99a3924e6d96ce8 Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Mon, 3 Apr 2023 00:44:53 +0100 Subject: [PATCH 34/53] Added Size Transforms If Size Is Not Available For New Style --- .../logistics/trains/AbstractBogeyBlock.java | 50 +++++++++++++------ .../logistics/trains/BogeyRenderer.java | 4 ++ .../logistics/trains/entity/BogeyStyle.java | 4 ++ .../edgePoint/station/StationTileEntity.java | 15 +++++- .../foundation/data/BogeyStyleBuilder.java | 2 - 5 files changed, 58 insertions(+), 17 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 6380c076b..918cbef74 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 @@ -6,6 +6,7 @@ import java.util.Comparator; import java.util.EnumSet; import java.util.List; import java.util.Optional; +import java.util.Set; import javax.annotation.Nullable; @@ -18,6 +19,7 @@ import com.simibubi.create.AllItems; import com.simibubi.create.AllRegistries; 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.StandardBogeyBlock; import com.simibubi.create.content.logistics.trains.track.StandardBogeyTileEntity; import com.simibubi.create.content.schematics.ISpecialBlockItemRequirement; import com.simibubi.create.content.schematics.ItemRequirement; @@ -31,13 +33,12 @@ 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.network.chat.TranslatableComponent; +import net.minecraft.nbt.CompoundTag; 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; @@ -143,7 +144,8 @@ public abstract class AbstractBogeyBlock extends Block implements ITE 1) { Collection styles = AllRegistries.BOGEY_REGISTRY.get().getValues(); if (styles.size() <= 1) @@ -156,25 +158,36 @@ public abstract class AbstractBogeyBlock extends Block implements ITE style = styles.stream() - .map(s -> getNextStyle(currentStyle)) - .filter(s -> s.validSizes().contains(getSize())) - .findFirst(); + BogeyStyle style = this.getNextStyle(currentStyle); + Set validSizes = style.validSizes(); - 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; + for (int i = 0; i < BogeyRenderer.BogeySize.values().length; i++) { + if (validSizes.contains(size)) break; + size = size.increment(); } + + sbte.setBogeyStyle(style); + + if (size == getSize()) { + player.displayClientMessage(Lang.translateDirect("create.bogey.style.updated_style"), true); + } else { + CompoundTag oldData = sbte.getBogeyData(); + level.setBlock(pos, this.getStateOfSize(sbte, size), 3); + BlockEntity newBlockEntity = level.getBlockEntity(pos); + if (!(newBlockEntity instanceof StandardBogeyTileEntity newTileEntity)) + return InteractionResult.FAIL; + newTileEntity.setBogeyData(oldData); + player.displayClientMessage(Lang.translateDirect("create.bogey.style.updated_style_and_size"), true); + } + return InteractionResult.CONSUME; } return InteractionResult.PASS; } + @Override public BlockState getRotatedBlockState(BlockState state, Direction targetedFace) { Block block = state.getBlock(); @@ -217,6 +230,14 @@ public abstract class AbstractBogeyBlock extends Block implements ITE implements .orElse(ForgeRegistries.BLOCKS.getValue(blocks.get(currentSize))); } + public Block getBlockOfSize(BogeySize size) { + return ForgeRegistries.BLOCKS.getValue(blocks.get(size)); + } + public Set validSizes() { return blocks.keySet(); } 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 3fd50bbb8..a045a4216 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 @@ -52,6 +52,7 @@ import com.simibubi.create.foundation.utility.WorldAttached; import com.simibubi.create.foundation.utility.animation.LerpedFloat; import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; +import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction; @@ -276,7 +277,19 @@ public class StationTileEntity extends SmartTileEntity implements ITransformable .offset(up); BlockState blockState = level.getBlockState(bogeyPos); if (blockState.getBlock() instanceof AbstractBogeyBlock bogey) { - level.setBlock(bogeyPos, bogey.getRotatedBlockState(blockState, Direction.DOWN), 3); + BlockEntity be = level.getBlockEntity(bogeyPos); + if (!(be instanceof StandardBogeyTileEntity oldTE)) + continue; + CompoundTag oldData = oldTE.getBogeyData(); + BlockState newBlock = bogey.getNextSize(oldTE); + if (newBlock.getBlock() == bogey) + player.displayClientMessage(Lang.translateDirect("create.bogey.style.no_other_sizes") + .withStyle(ChatFormatting.RED), true); + level.setBlock(bogeyPos, newBlock, 3); + BlockEntity newEntity = level.getBlockEntity(bogeyPos); + if (!(newEntity instanceof StandardBogeyTileEntity newTE)) + continue; + newTE.setBogeyData(oldData); bogey.playRotateSound(level, bogeyPos); return true; } 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 b25048dbc..61116c4d2 100644 --- a/src/main/java/com/simibubi/create/foundation/data/BogeyStyleBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/data/BogeyStyleBuilder.java @@ -48,8 +48,6 @@ public class BogeyStyleBuilder extends AbstractBuilder< this.style = style; this.particles = AllParticleTypes.AIR_FLOW::get; this.data = CompoundTag::new; - this.block(BogeyRenderer.BogeySize.SMALL, AllBlocks.SMALL_BOGEY); - this.block(BogeyRenderer.BogeySize.LARGE, AllBlocks.LARGE_BOGEY); } public BogeyStyleBuilder defaultData(CompoundTag data) { From 2543185a55a60197494850582ca45d729e463f40 Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Mon, 3 Apr 2023 09:45:23 +0100 Subject: [PATCH 35/53] Added Bogey Sound Customisation --- .../logistics/trains/entity/BogeyStyle.java | 3 ++- .../logistics/trains/entity/CarriageSounds.java | 14 ++++++++++++-- .../create/foundation/data/BogeyStyleBuilder.java | 8 ++++++-- 3 files changed, 20 insertions(+), 5 deletions(-) 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 6bdc81a8e..bd75ec0d9 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 @@ -8,6 +8,7 @@ import com.simibubi.create.content.logistics.trains.AbstractBogeyBlock; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.SoundType; import net.minecraftforge.registries.ForgeRegistries; @@ -23,7 +24,7 @@ import java.util.stream.Stream; public final class BogeyStyle extends ForgeRegistryEntry implements IForgeRegistryEntry { public Map blocks = new EnumMap<>(BogeySize.class); public Component displayName; - public SoundType soundType; + public SoundEvent soundType; public CompoundTag defaultData; public BogeyRenderer renderer; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageSounds.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageSounds.java index 6d109d1ad..097ffe5bf 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageSounds.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageSounds.java @@ -3,6 +3,8 @@ package com.simibubi.create.content.logistics.trains.entity; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.AllSoundEvents.SoundEntry; import com.simibubi.create.content.logistics.trains.entity.Carriage.DimensionalCarriageEntity; +import com.simibubi.create.foundation.utility.Couple; +import com.simibubi.create.foundation.utility.Pair; import com.simibubi.create.foundation.utility.animation.LerpedFloat; import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; @@ -29,6 +31,8 @@ public class CarriageSounds { LoopingSound sharedWheelSoundSeated; LoopingSound sharedHonkSound; + SoundEvent closestBogeySound; + boolean arrived; int tick; @@ -79,6 +83,12 @@ public class CarriageSounds { double distance1 = toBogey1.length(); double distance2 = toBogey2.length(); + CarriageContraptionEntity cce = dce.entity.get(); + if (cce != null) { + Couple bogeys = cce.getCarriage().bogeys; + closestBogeySound = bogeys.get(distance1 > distance2).getStyle().soundType; + } + Vec3 toCarriage = distance1 > distance2 ? toBogey2 : toBogey1; double distance = Math.min(distance1, distance2); Vec3 soundLocation = cam.add(toCarriage); @@ -97,7 +107,7 @@ public class CarriageSounds { seatCrossfade.tickChaser(); minecartEsqueSound = playIfMissing(mc, minecartEsqueSound, AllSoundEvents.TRAIN.getMainEvent()); - sharedWheelSound = playIfMissing(mc, sharedWheelSound, AllSoundEvents.TRAIN2.getMainEvent()); + sharedWheelSound = playIfMissing(mc, sharedWheelSound, closestBogeySound); sharedWheelSoundSeated = playIfMissing(mc, sharedWheelSoundSeated, AllSoundEvents.TRAIN3.getMainEvent()); float volume = Math.min(Math.min(speedFactor.getValue(), distanceFactor.getValue() / 100), @@ -205,7 +215,7 @@ public class CarriageSounds { public void submitSharedSoundVolume(Vec3 location, float volume) { Minecraft mc = Minecraft.getInstance(); minecartEsqueSound = playIfMissing(mc, minecartEsqueSound, AllSoundEvents.TRAIN.getMainEvent()); - sharedWheelSound = playIfMissing(mc, sharedWheelSound, AllSoundEvents.TRAIN2.getMainEvent()); + sharedWheelSound = playIfMissing(mc, sharedWheelSound, closestBogeySound); sharedWheelSoundSeated = playIfMissing(mc, sharedWheelSoundSeated, AllSoundEvents.TRAIN3.getMainEvent()); boolean approach = true; 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 61116c4d2..253b8fa89 100644 --- a/src/main/java/com/simibubi/create/foundation/data/BogeyStyleBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/data/BogeyStyleBuilder.java @@ -23,6 +23,7 @@ import net.minecraft.core.particles.ParticleType; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; import net.minecraft.world.level.block.SoundType; import org.jetbrains.annotations.NotNull; @@ -35,7 +36,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; @@ -46,6 +47,7 @@ public class BogeyStyleBuilder extends AbstractBuilder< protected BogeyStyleBuilder(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, T style) { super(owner, parent, name, callback, AllRegistries.Keys.BOGEYS); this.style = style; + this.soundType = AllSoundEvents.TRAIN2::getMainEvent; this.particles = AllParticleTypes.AIR_FLOW::get; this.data = CompoundTag::new; } @@ -60,7 +62,8 @@ public class BogeyStyleBuilder extends AbstractBuilder< return this; } - public BogeyStyleBuilder soundType(SoundType soundEntry) { + public BogeyStyleBuilder soundType(SoundEvent soundEntry) { + this.soundType = () -> soundEntry; return this; } @@ -82,6 +85,7 @@ public class BogeyStyleBuilder extends AbstractBuilder< protected @NotNull T createEntry() { style.defaultData = data.get(); style.renderer = renderer.get(); + style.soundType = soundType.get(); return style; } } From 129be61fee13e15e17c2e2a4ee0b08c9bc004846 Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Mon, 3 Apr 2023 17:20:17 +0100 Subject: [PATCH 36/53] Fixed Bogey Sound Loading --- .../content/logistics/trains/entity/BogeyStyle.java | 12 +++++++++++- .../logistics/trains/entity/CarriageSounds.java | 2 +- .../create/foundation/data/BogeyStyleBuilder.java | 6 +++--- 3 files changed, 15 insertions(+), 5 deletions(-) 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 bd75ec0d9..ddc1d25db 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 @@ -1,6 +1,7 @@ package com.simibubi.create.content.logistics.trains.entity; import com.jozufozu.flywheel.api.MaterialManager; +import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.logistics.trains.BogeyRenderer; import com.simibubi.create.content.logistics.trains.BogeyRenderer.BogeySize; import com.simibubi.create.content.logistics.trains.AbstractBogeyBlock; @@ -15,6 +16,8 @@ import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.ForgeRegistryEntry; import net.minecraftforge.registries.IForgeRegistryEntry; +import org.jetbrains.annotations.NotNull; + import java.util.EnumMap; import java.util.Map; import java.util.Set; @@ -24,7 +27,7 @@ import java.util.stream.Stream; public final class BogeyStyle extends ForgeRegistryEntry implements IForgeRegistryEntry { public Map blocks = new EnumMap<>(BogeySize.class); public Component displayName; - public SoundEvent soundType; + public ResourceLocation soundType; public CompoundTag defaultData; public BogeyRenderer renderer; @@ -58,6 +61,13 @@ public final class BogeyStyle extends ForgeRegistryEntry implements return sizes[nextOrdinal]; } + @NotNull + public SoundEvent getSoundType() { + AllSoundEvents.SoundEntry entry = AllSoundEvents.ALL.get(this.soundType); + if (entry == null) entry = AllSoundEvents.TRAIN2; + return entry.getMainEvent(); + } + public BogeyInstance createInstance(CarriageBogey bogey, BogeySize size, MaterialManager materialManager) { return new BogeyInstance(bogey, this.renderer.newInstance(), size, materialManager); } diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageSounds.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageSounds.java index 097ffe5bf..28778e196 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageSounds.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageSounds.java @@ -86,7 +86,7 @@ public class CarriageSounds { CarriageContraptionEntity cce = dce.entity.get(); if (cce != null) { Couple bogeys = cce.getCarriage().bogeys; - closestBogeySound = bogeys.get(distance1 > distance2).getStyle().soundType; + closestBogeySound = bogeys.get(distance1 > distance2).getStyle().getSoundType(); } Vec3 toCarriage = distance1 > distance2 ? toBogey2 : toBogey1; 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 253b8fa89..72ebc0b90 100644 --- a/src/main/java/com/simibubi/create/foundation/data/BogeyStyleBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/data/BogeyStyleBuilder.java @@ -36,7 +36,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; @@ -47,7 +47,7 @@ public class BogeyStyleBuilder extends AbstractBuilder< protected BogeyStyleBuilder(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, T style) { super(owner, parent, name, callback, AllRegistries.Keys.BOGEYS); this.style = style; - this.soundType = AllSoundEvents.TRAIN2::getMainEvent; + this.soundType = AllSoundEvents.TRAIN2::getId; this.particles = AllParticleTypes.AIR_FLOW::get; this.data = CompoundTag::new; } @@ -62,7 +62,7 @@ public class BogeyStyleBuilder extends AbstractBuilder< return this; } - public BogeyStyleBuilder soundType(SoundEvent soundEntry) { + public BogeyStyleBuilder soundType(ResourceLocation soundEntry) { this.soundType = () -> soundEntry; return this; } From 1e80af3303e5bf9f9179857944cc233b4be7ebaf Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Mon, 3 Apr 2023 19:27:58 +0100 Subject: [PATCH 37/53] Refactored Bogey Sizes To Seperate Class --- .../java/com/simibubi/create/AllBlocks.java | 9 +-- .../com/simibubi/create/AllBogeyStyles.java | 19 +---- src/main/java/com/simibubi/create/Create.java | 3 + .../logistics/trains/AbstractBogeyBlock.java | 14 ++-- .../logistics/trains/BogeyRenderer.java | 21 ++---- .../content/logistics/trains/BogeySizes.java | 69 +++++++++++++++++++ .../trains/StandardBogeyRenderer.java | 11 +-- .../trains/entity/BogeyInstance.java | 25 ++----- .../logistics/trains/entity/BogeyStyle.java | 29 ++++---- .../trains/track/StandardBogeyBlock.java | 9 +-- .../foundation/data/BogeyStyleBuilder.java | 8 +-- 11 files changed, 122 insertions(+), 95 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/logistics/trains/BogeySizes.java diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index d802d6d7a..e163625bc 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -208,6 +208,7 @@ import com.simibubi.create.content.logistics.block.vault.ItemVaultCTBehaviour; import com.simibubi.create.content.logistics.block.vault.ItemVaultItem; import com.simibubi.create.content.logistics.item.LecternControllerBlock; import com.simibubi.create.content.logistics.trains.BogeyRenderer; +import com.simibubi.create.content.logistics.trains.BogeySizes; import com.simibubi.create.content.logistics.trains.management.display.FlapDisplayBlock; import com.simibubi.create.content.logistics.trains.management.edgePoint.EdgePointType; import com.simibubi.create.content.logistics.trains.management.edgePoint.TrackTargetingBlockItem; @@ -668,7 +669,7 @@ public class AllBlocks { .onRegister(movementBehaviour(new BlazeBurnerMovementBehaviour())) .onRegister(interactionBehaviour(new BlazeBurnerInteractionBehaviour())) .item(BlazeBurnerBlockItem::withBlaze) - .model(AssetLookup.customBlockItemModel("blaze_burner", "block_with_blaze")) + .model(AssetLookup.customBlockItemModel("blaze_burner", "block_with_blaze")) .build() .register(); @@ -927,7 +928,7 @@ public class AllBlocks { .onRegister(assignDataBehaviour(new BoilerDisplaySource(), "boiler_status")) .addLayer(() -> RenderType::cutoutMipped) .item(FluidTankItem::new) - .model(AssetLookup.customBlockItemModel("_", "block_single_window")) + .model(AssetLookup.customBlockItemModel("_", "block_single_window")) .build() .register(); @@ -1579,13 +1580,13 @@ public class AllBlocks { .register(); public static final BlockEntry SMALL_BOGEY = - REGISTRATE.block("small_bogey", p -> new StandardBogeyBlock(p, BogeyRenderer.BogeySize.SMALL)) + REGISTRATE.block("small_bogey", p -> new StandardBogeyBlock(p, BogeySizes.SMALL)) .properties(p -> p.color(MaterialColor.PODZOL)) .transform(BuilderTransformers.bogey()) .register(); public static final BlockEntry LARGE_BOGEY = - REGISTRATE.block("large_bogey", p -> new StandardBogeyBlock(p, BogeyRenderer.BogeySize.LARGE)) + REGISTRATE.block("large_bogey", p -> new StandardBogeyBlock(p, BogeySizes.LARGE)) .properties(p -> p.color(MaterialColor.PODZOL)) .transform(BuilderTransformers.bogey()) .register(); diff --git a/src/main/java/com/simibubi/create/AllBogeyStyles.java b/src/main/java/com/simibubi/create/AllBogeyStyles.java index 24ceb65d5..be789fdd7 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.BogeySizes; 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; @@ -14,25 +15,11 @@ import static com.simibubi.create.Create.REGISTRATE; public class AllBogeyStyles { public static final RegistryEntry STANDARD = REGISTRATE .bogeyStyle("standard", new BogeyStyle()) - .block(BogeyRenderer.BogeySize.SMALL, AllBlocks.SMALL_BOGEY) - .block(BogeyRenderer.BogeySize.LARGE, AllBlocks.LARGE_BOGEY) + .block(BogeySizes.SMALL, AllBlocks.SMALL_BOGEY) + .block(BogeySizes.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/Create.java b/src/main/java/com/simibubi/create/Create.java index 61d87ba7d..df9200de7 100644 --- a/src/main/java/com/simibubi/create/Create.java +++ b/src/main/java/com/simibubi/create/Create.java @@ -2,6 +2,8 @@ package com.simibubi.create; import java.util.Random; +import com.simibubi.create.content.logistics.trains.BogeySizes; + import org.slf4j.Logger; import com.google.gson.Gson; @@ -121,6 +123,7 @@ public class Create { AllFeatures.register(modEventBus); AllPlacementModifiers.register(modEventBus); BuiltinRegistration.register(modEventBus); + BogeySizes.init(); AllBogeyStyles.register(); AllConfigs.register(modLoadingContext); 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 918cbef74..fe2f182c4 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 @@ -5,7 +5,6 @@ import java.util.Collection; import java.util.Comparator; import java.util.EnumSet; import java.util.List; -import java.util.Optional; import java.util.Set; import javax.annotation.Nullable; @@ -19,7 +18,6 @@ import com.simibubi.create.AllItems; import com.simibubi.create.AllRegistries; 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.StandardBogeyBlock; import com.simibubi.create.content.logistics.trains.track.StandardBogeyTileEntity; import com.simibubi.create.content.schematics.ISpecialBlockItemRequirement; import com.simibubi.create.content.schematics.ItemRequirement; @@ -120,7 +118,7 @@ public abstract class AbstractBogeyBlock extends Block implements ITE validSizes = style.validSizes(); + Set validSizes = style.validSizes(); - for (int i = 0; i < BogeyRenderer.BogeySize.values().length; i++) { + for (int i = 0; i < BogeySizes.count(); i++) { if (validSizes.contains(size)) break; size = size.increment(); } @@ -222,7 +220,7 @@ public abstract class AbstractBogeyBlock extends Block implements ITE renderers = new EnumMap<>(BogeySize.class); + Map renderers = new HashMap<>(); Map contraptionModelData = new HashMap<>(); public Transform[] getTransformsFromPartial(PartialModel model, PoseStack ms, boolean inContraption, int size) { @@ -85,7 +85,7 @@ public abstract class BogeyRenderer { } @OnlyIn(Dist.CLIENT) - public abstract void initialiseContraptionModelData(MaterialManager materialManager, BogeySize size); + public abstract void initialiseContraptionModelData(MaterialManager materialManager, BogeySizes.BogeySize size); public void createModelInstances(MaterialManager materialManager, PartialModel model, int count) { ModelData[] modelData = new ModelData[count]; @@ -108,13 +108,13 @@ public abstract class BogeyRenderer { @OnlyIn(Dist.CLIENT) public void render(CompoundTag bogeyData, float wheelAngle, PoseStack ms, int light, @Nullable VertexConsumer vb, - BogeySize size) { + BogeySizes.BogeySize size) { renderCommon(bogeyData, wheelAngle, ms, light, vb); renderers.get(size).render(bogeyData, wheelAngle, ms, light, vb); } @OnlyIn(Dist.CLIENT) - public void render(CompoundTag bogeyData, float wheelAngle, PoseStack ms, BogeySize size) { + public void render(CompoundTag bogeyData, float wheelAngle, PoseStack ms, BogeySizes.BogeySize size) { this.render(bogeyData, wheelAngle, ms, 0, null, size); } @@ -128,11 +128,11 @@ public abstract class BogeyRenderer { byteBuf.light(light).renderInto(ms, vb); } - public boolean styleImplementsSize(BogeySize size) { + public boolean styleImplementsSize(BogeySizes.BogeySize size) { return this.renderers.containsKey(size); } - public Set implementedSizes() { + public Set implementedSizes() { return renderers.keySet(); } @@ -169,13 +169,4 @@ public abstract class BogeyRenderer { interface Renderer { void render(CompoundTag bogeyData, float wheelAngle, PoseStack ms, int light, VertexConsumer vb); } - - // TODO: REPLACE THIS SO THAT IT CAN BE ADDED TO - public enum BogeySize { - SMALL, LARGE; - - public BogeySize increment() { - return values()[(ordinal() + 1) % values().length]; - } - } } diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/BogeySizes.java b/src/main/java/com/simibubi/create/content/logistics/trains/BogeySizes.java new file mode 100644 index 000000000..fd84eefc5 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/BogeySizes.java @@ -0,0 +1,69 @@ +package com.simibubi.create.content.logistics.trains; + +import com.simibubi.create.Create; + +import net.minecraft.resources.ResourceLocation; + +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashSet; +import java.util.List; +import java.util.stream.Collectors; + +public class BogeySizes { + private static final Collection BOGEY_SIZES = new HashSet<>(); + public static final BogeySize SMALL = new BogeySize(Create.ID, "small", 6.5f / 16f); + public static final BogeySize LARGE = new BogeySize(Create.ID, "large", 12.5f / 16f); + + static { + BOGEY_SIZES.add(SMALL); + BOGEY_SIZES.add(LARGE); + } + + public static void addSize(String modId, String name, float size) { + ResourceLocation location = new ResourceLocation(modId, name); + addSize(location, size); + } + + public static void addSize(ResourceLocation location, float size) { + BogeySize customSize = new BogeySize(location, size); + BOGEY_SIZES.add(customSize); + } + + public static List getAllSizesSmallToLarge() { + return BOGEY_SIZES.stream() + .sorted(Comparator.comparing(BogeySize::wheelRadius)) + .collect(Collectors.toList()); + } + + public static List getAllSizesLargeToSmall() { + List sizes = getAllSizesSmallToLarge(); + Collections.reverse(sizes); + return sizes; + } + + public static int count() { + return BOGEY_SIZES.size(); + } + + public static void init() { + + } + + public record BogeySize(ResourceLocation location, Float wheelRadius) { + public BogeySize(String modId, String name, float wheelRadius) { + this(new ResourceLocation(modId, name), wheelRadius); + } + + public BogeySize increment() { + List values = getAllSizesSmallToLarge(); + int ordinal = values.indexOf(this); + return values.get((ordinal + 1) % values.size()); + } + + public boolean is(BogeySize size) { + return size.location == this.location; + } + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/StandardBogeyRenderer.java b/src/main/java/com/simibubi/create/content/logistics/trains/StandardBogeyRenderer.java index 5ba6444dd..1e3551332 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/StandardBogeyRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/StandardBogeyRenderer.java @@ -1,15 +1,12 @@ package com.simibubi.create.content.logistics.trains; import com.jozufozu.flywheel.api.MaterialManager; -import com.jozufozu.flywheel.core.materials.model.ModelData; import com.jozufozu.flywheel.util.transform.Transform; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; -import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.relays.elementary.ShaftBlock; -import com.simibubi.create.content.logistics.trains.entity.BogeyInstance; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.Iterate; @@ -18,24 +15,22 @@ import net.minecraft.nbt.CompoundTag; import org.jetbrains.annotations.Nullable; -import static com.simibubi.create.AllBlockPartials.COGWHEEL_SHAFT; import static com.simibubi.create.AllBlockPartials.LARGE_BOGEY_WHEELS; import static com.simibubi.create.AllBlockPartials.BOGEY_PIN; import static com.simibubi.create.AllBlockPartials.BOGEY_DRIVE; import static com.simibubi.create.AllBlockPartials.BOGEY_PISTON; -import static com.simibubi.create.AllBlockPartials.SHAFT_HALF; import static com.simibubi.create.AllBlockPartials.SMALL_BOGEY_WHEELS; import static com.simibubi.create.AllBlockPartials.BOGEY_FRAME; public class StandardBogeyRenderer extends BogeyRenderer { public StandardBogeyRenderer() { - renderers.put(BogeySize.SMALL, this::renderSmall); - renderers.put(BogeySize.LARGE, this::renderLarge); + renderers.put(BogeySizes.SMALL, this::renderSmall); + renderers.put(BogeySizes.LARGE, this::renderLarge); } @Override - public void initialiseContraptionModelData(MaterialManager materialManager, BogeySize size) { + public void initialiseContraptionModelData(MaterialManager materialManager, BogeySizes.BogeySize size) { // Large createModelInstances(materialManager, LARGE_BOGEY_WHEELS, BOGEY_DRIVE, BOGEY_PISTON, BOGEY_PIN); createModelInstances(materialManager, AllBlocks.SHAFT.getDefaultState() 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 6533fd2cd..e868a15b6 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 @@ -1,36 +1,25 @@ package com.simibubi.create.content.logistics.trains.entity; -import com.jozufozu.flywheel.api.Material; import com.jozufozu.flywheel.api.MaterialManager; -import com.jozufozu.flywheel.core.Materials; -import com.jozufozu.flywheel.core.materials.model.ModelData; import com.jozufozu.flywheel.util.AnimationTickHolder; import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; -import com.simibubi.create.AllBlockPartials; -import com.simibubi.create.AllBlocks; -import com.simibubi.create.content.contraptions.relays.elementary.ShaftBlock; import com.simibubi.create.content.logistics.trains.BogeyRenderer; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.Iterate; + +import com.simibubi.create.content.logistics.trains.BogeySizes; import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.LightLayer; import net.minecraft.world.phys.Vec3; -import java.util.EnumMap; -import java.util.Map; - public final class BogeyInstance { public final CarriageBogey bogey; public final BogeyRenderer renderer; - private final BogeyRenderer.BogeySize size; + private final BogeySizes.BogeySize size; - public BogeyInstance(CarriageBogey bogey, BogeyRenderer renderer, BogeyRenderer.BogeySize size, + public BogeyInstance(CarriageBogey bogey, BogeyRenderer renderer, BogeySizes.BogeySize size, MaterialManager materialManager) { this.bogey = bogey; this.renderer = renderer; @@ -39,7 +28,7 @@ public final class BogeyInstance { renderer.initialiseContraptionModelData(materialManager, size); } - protected void hiddenFrame() { + void hiddenFrame() { beginFrame(0, null); } @@ -50,7 +39,7 @@ public final class BogeyInstance { } renderer.render(new CompoundTag(), wheelAngle, ms, this.size); - }; + } public void updateLight(BlockAndTintGetter world, CarriageContraptionEntity entity) { var lightPos = new BlockPos(getLightPos(entity)); @@ -65,7 +54,7 @@ public final class BogeyInstance { @FunctionalInterface interface BogeyInstanceFactory { - BogeyInstance create(CarriageBogey bogey, BogeyRenderer.BogeySize size, + BogeyInstance create(CarriageBogey bogey, BogeySizes.BogeySize size, MaterialManager materialManager); } } 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 ddc1d25db..7613168a4 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 @@ -3,15 +3,15 @@ package com.simibubi.create.content.logistics.trains.entity; import com.jozufozu.flywheel.api.MaterialManager; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.logistics.trains.BogeyRenderer; -import com.simibubi.create.content.logistics.trains.BogeyRenderer.BogeySize; import com.simibubi.create.content.logistics.trains.AbstractBogeyBlock; +import com.simibubi.create.content.logistics.trains.BogeySizes; + import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvent; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.SoundType; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.ForgeRegistryEntry; import net.minecraftforge.registries.IForgeRegistryEntry; @@ -19,56 +19,51 @@ import net.minecraftforge.registries.IForgeRegistryEntry; import org.jetbrains.annotations.NotNull; import java.util.EnumMap; +import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.stream.Stream; public final class BogeyStyle extends ForgeRegistryEntry implements IForgeRegistryEntry { - public Map blocks = new EnumMap<>(BogeySize.class); + public Map blocks = new HashMap<>(); public Component displayName; public ResourceLocation soundType; public CompoundTag defaultData; public BogeyRenderer renderer; - public void addBlockForSize(BogeySize size, T block) { + public void addBlockForSize(BogeySizes.BogeySize size, T block) { this.addBlockForSize(size, block.getRegistryName()); } - public void addBlockForSize(BogeySize size, ResourceLocation location) { + public void addBlockForSize(BogeySizes.BogeySize size, ResourceLocation location) { blocks.put(size, location); } - public Block getNextBlock(BogeySize currentSize) { - return Stream.iterate(getNextSize(currentSize), this::getNextSize) + public Block getNextBlock(BogeySizes.BogeySize currentSize) { + return Stream.iterate(currentSize.increment(), BogeySizes.BogeySize::increment) .filter(size -> blocks.containsKey(size)) .findFirst() .map(size -> ForgeRegistries.BLOCKS.getValue(blocks.get(size))) .orElse(ForgeRegistries.BLOCKS.getValue(blocks.get(currentSize))); } - public Block getBlockOfSize(BogeySize size) { + public Block getBlockOfSize(BogeySizes.BogeySize size) { return ForgeRegistries.BLOCKS.getValue(blocks.get(size)); } - public Set validSizes() { + public Set validSizes() { return blocks.keySet(); } - private BogeySize getNextSize(BogeySize size) { - BogeySize[] sizes = BogeySize.values(); - int nextOrdinal = (size.ordinal() + 1) % sizes.length; - return sizes[nextOrdinal]; - } - @NotNull public SoundEvent getSoundType() { AllSoundEvents.SoundEntry entry = AllSoundEvents.ALL.get(this.soundType); - if (entry == null) entry = AllSoundEvents.TRAIN2; + if (entry == null || entry.getMainEvent() == null) entry = AllSoundEvents.TRAIN2; return entry.getMainEvent(); } - public BogeyInstance createInstance(CarriageBogey bogey, BogeySize size, MaterialManager materialManager) { + public BogeyInstance createInstance(CarriageBogey bogey, BogeySizes.BogeySize size, MaterialManager materialManager) { return new BogeyInstance(bogey, this.renderer.newInstance(), size, materialManager); } } 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 a4124189f..07042b275 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 @@ -4,6 +4,7 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.logistics.trains.BogeyRenderer; import com.simibubi.create.content.logistics.trains.AbstractBogeyBlock; +import com.simibubi.create.content.logistics.trains.BogeySizes; import com.simibubi.create.content.schematics.ISpecialBlockItemRequirement; import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.block.ProperWaterloggedBlock; @@ -18,9 +19,9 @@ import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; public class StandardBogeyBlock extends AbstractBogeyBlock implements ITE, ProperWaterloggedBlock, ISpecialBlockItemRequirement { - private final BogeyRenderer.BogeySize size; + private final BogeySizes.BogeySize size; - public StandardBogeyBlock(Properties props, BogeyRenderer.BogeySize size) { + public StandardBogeyBlock(Properties props, BogeySizes.BogeySize size) { super(props); this.size = size; registerDefaultState(defaultBlockState().setValue(WATERLOGGED, false)); @@ -33,7 +34,7 @@ public class StandardBogeyBlock extends AbstractBogeyBlock implements ITE extends AbstractBuilder< return this; } - public BogeyStyleBuilder block(BogeyRenderer.BogeySize size, BlockEntry block) { + public BogeyStyleBuilder block(BogeySizes.BogeySize size, BlockEntry block) { return this.block(size, block.getId()); } - public BogeyStyleBuilder block(BogeyRenderer.BogeySize size, ResourceLocation location) { + public BogeyStyleBuilder block(BogeySizes.BogeySize size, ResourceLocation location) { this.style.addBlockForSize(size, location); return this; } From 4f176979de161c35d6c7b07744bf0b982490f49f Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Mon, 3 Apr 2023 19:33:17 +0100 Subject: [PATCH 38/53] Fixed Carriage Sounds (Again) --- .../logistics/trains/entity/CarriageSounds.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageSounds.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageSounds.java index 28778e196..56832e8ff 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageSounds.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageSounds.java @@ -31,6 +31,7 @@ public class CarriageSounds { LoopingSound sharedWheelSoundSeated; LoopingSound sharedHonkSound; + Couple bogeySounds; SoundEvent closestBogeySound; boolean arrived; @@ -40,6 +41,9 @@ public class CarriageSounds { public CarriageSounds(CarriageContraptionEntity entity) { this.entity = entity; + bogeySounds = entity.getCarriage().bogeys.map(bogey -> + bogey != null ? bogey.getStyle().getSoundType() + : AllSoundEvents.TRAIN2.getMainEvent()); distanceFactor = LerpedFloat.linear(); speedFactor = LerpedFloat.linear(); approachFactor = LerpedFloat.linear(); @@ -83,11 +87,8 @@ public class CarriageSounds { double distance1 = toBogey1.length(); double distance2 = toBogey2.length(); - CarriageContraptionEntity cce = dce.entity.get(); - if (cce != null) { - Couple bogeys = cce.getCarriage().bogeys; - closestBogeySound = bogeys.get(distance1 > distance2).getStyle().getSoundType(); - } + Couple bogeys = entity.getCarriage().bogeys; + closestBogeySound = bogeys.get(distance1 > distance2).getStyle().getSoundType(); Vec3 toCarriage = distance1 > distance2 ? toBogey2 : toBogey1; double distance = Math.min(distance1, distance2); From 69326e361ab7d982a577f1e864c772967ad9c134 Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Mon, 3 Apr 2023 21:30:28 +0100 Subject: [PATCH 39/53] Fixed Default Values When Used Styles Are Removed --- .../java/com/simibubi/create/AllBogeyStyles.java | 15 +++++++++++++++ .../logistics/trains/entity/CarriageSounds.java | 4 ++-- .../trains/track/StandardBogeyTileEntity.java | 5 ++++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/simibubi/create/AllBogeyStyles.java b/src/main/java/com/simibubi/create/AllBogeyStyles.java index be789fdd7..c521b7a88 100644 --- a/src/main/java/com/simibubi/create/AllBogeyStyles.java +++ b/src/main/java/com/simibubi/create/AllBogeyStyles.java @@ -20,6 +20,21 @@ public class AllBogeyStyles { .renderer(new StandardBogeyRenderer()) .register(); + /* + public static final RegistryEntry TEST = REGISTRATE + .bogeyStyle("test", new BogeyStyle()) + .block(BogeySizes.LARGE, AllBlocks.LARGE_BOGEY) + .renderer(new TestBogeyRenderer()) + .register(); + + public static final RegistryEntry TEST_TWO = REGISTRATE + .bogeyStyle("test_two", new BogeyStyle()) + .block(BogeySizes.SMALL, AllBlocks.SMALL_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/entity/CarriageSounds.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageSounds.java index 56832e8ff..454cc406c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageSounds.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageSounds.java @@ -4,7 +4,6 @@ import com.simibubi.create.AllSoundEvents; import com.simibubi.create.AllSoundEvents.SoundEntry; import com.simibubi.create.content.logistics.trains.entity.Carriage.DimensionalCarriageEntity; import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.Pair; import com.simibubi.create.foundation.utility.animation.LerpedFloat; import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; @@ -43,7 +42,8 @@ public class CarriageSounds { this.entity = entity; bogeySounds = entity.getCarriage().bogeys.map(bogey -> bogey != null ? bogey.getStyle().getSoundType() - : AllSoundEvents.TRAIN2.getMainEvent()); + : AllSoundEvents.TRAIN2.getMainEvent()); + closestBogeySound = bogeySounds.getFirst(); distanceFactor = LerpedFloat.linear(); speedFactor = LerpedFloat.linear(); approachFactor = LerpedFloat.linear(); 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 8077152e5..a6c9185bb 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 @@ -56,7 +56,10 @@ public class StandardBogeyTileEntity extends CachedRenderBBTileEntity { 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()); + if (style == null) { + setBogeyStyle(AllBogeyStyles.STANDARD.get()); + return getStyle(); + } return style; } From 53240bd42f08d839b233a3b75cb59aabb4648fb9 Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Mon, 3 Apr 2023 21:42:29 +0100 Subject: [PATCH 40/53] Corrected Bogey InteractionResult To Pass --- .../java/com/simibubi/create/AllBogeyStyles.java | 15 --------------- .../logistics/trains/AbstractBogeyBlock.java | 13 +++++++++---- .../trains/track/StandardBogeyBlock.java | 9 +-------- 3 files changed, 10 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/simibubi/create/AllBogeyStyles.java b/src/main/java/com/simibubi/create/AllBogeyStyles.java index c521b7a88..be789fdd7 100644 --- a/src/main/java/com/simibubi/create/AllBogeyStyles.java +++ b/src/main/java/com/simibubi/create/AllBogeyStyles.java @@ -20,21 +20,6 @@ public class AllBogeyStyles { .renderer(new StandardBogeyRenderer()) .register(); - /* - public static final RegistryEntry TEST = REGISTRATE - .bogeyStyle("test", new BogeyStyle()) - .block(BogeySizes.LARGE, AllBlocks.LARGE_BOGEY) - .renderer(new TestBogeyRenderer()) - .register(); - - public static final RegistryEntry TEST_TWO = REGISTRATE - .bogeyStyle("test_two", new BogeyStyle()) - .block(BogeySizes.SMALL, AllBlocks.SMALL_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 fe2f182c4..83d223d64 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 @@ -59,10 +59,13 @@ import org.jetbrains.annotations.NotNull; public abstract class AbstractBogeyBlock extends Block implements ITE, ProperWaterloggedBlock, ISpecialBlockItemRequirement, IWrenchable { public static final EnumProperty AXIS = BlockStateProperties.HORIZONTAL_AXIS; static final List BOGEYS = new ArrayList<>(); + public BogeySizes.BogeySize size; - public AbstractBogeyBlock(Properties pProperties) { + + public AbstractBogeyBlock(Properties pProperties, BogeySizes.BogeySize size) { super(pProperties); registerDefaultState(defaultBlockState().setValue(WATERLOGGED, false)); + this.size = size; } public static void register(ResourceLocation block) { @@ -118,7 +121,9 @@ public abstract class AbstractBogeyBlock extends Block implements ITE styles = AllRegistries.BOGEY_REGISTRY.get().getValues(); if (styles.size() <= 1) - return InteractionResult.SUCCESS; + return InteractionResult.PASS; BlockEntity be = level.getBlockEntity(pos); 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 07042b275..f569f093d 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 @@ -19,11 +19,9 @@ import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; public class StandardBogeyBlock extends AbstractBogeyBlock implements ITE, ProperWaterloggedBlock, ISpecialBlockItemRequirement { - private final BogeySizes.BogeySize size; public StandardBogeyBlock(Properties props, BogeySizes.BogeySize size) { - super(props); - this.size = size; + super(props, size); registerDefaultState(defaultBlockState().setValue(WATERLOGGED, false)); } @@ -42,11 +40,6 @@ public class StandardBogeyBlock extends AbstractBogeyBlock implements ITE Date: Sun, 30 Apr 2023 20:01:00 +0100 Subject: [PATCH 41/53] Overhauled Bogey Style --- .../logistics/trains/entity/BogeyStyle.java | 64 ++++++++++++------- 1 file changed, 42 insertions(+), 22 deletions(-) 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 7613168a4..61bf38b3e 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 @@ -3,8 +3,8 @@ package com.simibubi.create.content.logistics.trains.entity; import com.jozufozu.flywheel.api.MaterialManager; 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.BogeyRenderer.CommonRenderer; import com.simibubi.create.content.logistics.trains.BogeySizes; import net.minecraft.nbt.CompoundTag; @@ -13,47 +13,48 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvent; import net.minecraft.world.level.block.Block; import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.ForgeRegistryEntry; -import net.minecraftforge.registries.IForgeRegistryEntry; import org.jetbrains.annotations.NotNull; -import java.util.EnumMap; -import java.util.HashMap; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.stream.Stream; -public final class BogeyStyle extends ForgeRegistryEntry implements IForgeRegistryEntry { - public Map blocks = new HashMap<>(); - public Component displayName; - public ResourceLocation soundType; - public CompoundTag defaultData; - public BogeyRenderer renderer; +public class BogeyStyle { + public final ResourceLocation name; + private final Optional commonRenderer; + private final Map sizes; + public final Component displayName; + public final ResourceLocation soundType; + public final CompoundTag defaultData; - public void addBlockForSize(BogeySizes.BogeySize size, T block) { - this.addBlockForSize(size, block.getRegistryName()); - } + public BogeyStyle(ResourceLocation name, Component displayName, ResourceLocation soundType, CompoundTag defaultData, + Map sizes, Optional commonRenderer) { + this.name = name; + this.displayName = displayName; + this.soundType = soundType; + this.defaultData = defaultData; - public void addBlockForSize(BogeySizes.BogeySize size, ResourceLocation location) { - blocks.put(size, location); + this.sizes = sizes; + this.commonRenderer = commonRenderer; } public Block getNextBlock(BogeySizes.BogeySize currentSize) { return Stream.iterate(currentSize.increment(), BogeySizes.BogeySize::increment) - .filter(size -> blocks.containsKey(size)) + .filter(sizes::containsKey) .findFirst() - .map(size -> ForgeRegistries.BLOCKS.getValue(blocks.get(size))) - .orElse(ForgeRegistries.BLOCKS.getValue(blocks.get(currentSize))); + .map(size -> ForgeRegistries.BLOCKS.getValue(sizes.get(size).block())) + .orElse(ForgeRegistries.BLOCKS.getValue(sizes.get(currentSize).block())); } public Block getBlockOfSize(BogeySizes.BogeySize size) { - return ForgeRegistries.BLOCKS.getValue(blocks.get(size)); + return ForgeRegistries.BLOCKS.getValue(sizes.get(size).block()); } public Set validSizes() { - return blocks.keySet(); + return sizes.keySet(); } @NotNull @@ -63,7 +64,26 @@ public final class BogeyStyle extends ForgeRegistryEntry implements return entry.getMainEvent(); } + public BogeyRenderer createRendererInstance(BogeySizes.BogeySize size) { + return this.getInWorldRenderInstance(size).createNewInstance(); + } + + public BogeyRenderer getInWorldRenderInstance(BogeySizes.BogeySize size) { + return this.sizes.get(size).renderer(); + } + + public Optional getInWorldCommonRenderInstance() { + return this.commonRenderer; + } + + public Optional getNewCommonRenderInstance() { + return this.getInWorldCommonRenderInstance().map(CommonRenderer::createNewInstance); + } + public BogeyInstance createInstance(CarriageBogey bogey, BogeySizes.BogeySize size, MaterialManager materialManager) { - return new BogeyInstance(bogey, this.renderer.newInstance(), size, materialManager); + return new BogeyInstance(bogey, this, size, materialManager); + } + + public record SizeData(ResourceLocation block, BogeyRenderer renderer) { } } From 6a185c4e727ecf55183cb885b109c0f5c5319854 Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Sun, 30 Apr 2023 20:01:16 +0100 Subject: [PATCH 42/53] Refactored Bogey Sizes --- .../create/content/logistics/trains/BogeySizes.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/BogeySizes.java b/src/main/java/com/simibubi/create/content/logistics/trains/BogeySizes.java index fd84eefc5..8216cf287 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/BogeySizes.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/BogeySizes.java @@ -47,10 +47,6 @@ public class BogeySizes { return BOGEY_SIZES.size(); } - public static void init() { - - } - public record BogeySize(ResourceLocation location, Float wheelRadius) { public BogeySize(String modId, String name, float wheelRadius) { this(new ResourceLocation(modId, name), wheelRadius); @@ -66,4 +62,8 @@ public class BogeySizes { return size.location == this.location; } } + + public static void init() { + + } } From edf8079abf9750dc9f3ccf1aedf58fef80428385 Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Sun, 30 Apr 2023 20:01:40 +0100 Subject: [PATCH 43/53] Removed Unused Registry Handling --- .../com/simibubi/create/AllRegistries.java | 43 ------------------- 1 file changed, 43 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/AllRegistries.java diff --git a/src/main/java/com/simibubi/create/AllRegistries.java b/src/main/java/com/simibubi/create/AllRegistries.java deleted file mode 100644 index 00d931565..000000000 --- a/src/main/java/com/simibubi/create/AllRegistries.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.simibubi.create; - -import com.simibubi.create.content.logistics.trains.entity.BogeyStyle; - -import net.minecraft.core.Registry; -import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.IForgeRegistry; -import net.minecraftforge.registries.IForgeRegistryEntry; -import net.minecraftforge.registries.NewRegistryEvent; -import net.minecraftforge.registries.RegistryBuilder; - -import java.util.function.Supplier; - -@Mod.EventBusSubscriber(modid = Create.ID, bus = Mod.EventBusSubscriber.Bus.MOD) -public class AllRegistries { - static final DeferredRegister DEFERRED_BOGEY_REGISTRY = DeferredRegister - .create(Keys.BOGEYS, Keys.BOGEYS.location().getNamespace()); - - public static final Supplier> BOGEY_REGISTRY = DEFERRED_BOGEY_REGISTRY - .makeRegistry(BogeyStyle.class, AllRegistries::getBogeyRegistryBuilder); - - public static RegistryBuilder getBogeyRegistryBuilder() { - return makeRegistry(Keys.BOGEYS, BogeyStyle.class); - } - - private static > RegistryBuilder makeRegistry(ResourceKey> key, Class type) { - return new RegistryBuilder().setName(key.location()).setType(type); - } - - @SubscribeEvent - public void onRegistryNewRegistry(final NewRegistryEvent event) { - event.create(getBogeyRegistryBuilder()); - } - - public static class Keys { - public static final ResourceKey> BOGEYS = ResourceKey - .createRegistryKey(new ResourceLocation(Create.ID, "bogeys")); - } -} From 8aedc00f963413ac0a02335bc9f914d45a82b4de Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Sun, 30 Apr 2023 20:02:06 +0100 Subject: [PATCH 44/53] Removed Bogey Style Handling From Registrate --- .../foundation/data/BogeyStyleBuilder.java | 89 ------------------- .../foundation/data/CreateRegistrate.java | 8 -- 2 files changed, 97 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/foundation/data/BogeyStyleBuilder.java diff --git a/src/main/java/com/simibubi/create/foundation/data/BogeyStyleBuilder.java b/src/main/java/com/simibubi/create/foundation/data/BogeyStyleBuilder.java deleted file mode 100644 index bcc485cf9..000000000 --- a/src/main/java/com/simibubi/create/foundation/data/BogeyStyleBuilder.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.simibubi.create.foundation.data; - -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.BogeySizes; -import com.simibubi.create.content.logistics.trains.entity.BogeyStyle; - -import com.tterrag.registrate.AbstractRegistrate; - -import com.tterrag.registrate.builders.AbstractBuilder; - -import com.tterrag.registrate.builders.BuilderCallback; - -import com.tterrag.registrate.util.entry.BlockEntry; - -import com.tterrag.registrate.util.nullness.NonNullSupplier; - -import net.minecraft.core.particles.ParticleType; - -import net.minecraft.nbt.CompoundTag; - -import net.minecraft.resources.ResourceLocation; - -import org.jetbrains.annotations.NotNull; - -import javax.annotation.ParametersAreNonnullByDefault; - -import java.util.function.Supplier; - -@ParametersAreNonnullByDefault -public class BogeyStyleBuilder extends AbstractBuilder> { - private final T style; - private NonNullSupplier renderer; - private Supplier soundType; - private Supplier data; - private Supplier> particles; - - public static BogeyStyleBuilder create(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, T style) { - return new BogeyStyleBuilder<>(owner, parent, name, callback, style); - } - - protected BogeyStyleBuilder(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, T style) { - super(owner, parent, name, callback, AllRegistries.Keys.BOGEYS); - this.style = style; - this.soundType = AllSoundEvents.TRAIN2::getId; - this.particles = AllParticleTypes.AIR_FLOW::get; - this.data = CompoundTag::new; - } - - public BogeyStyleBuilder defaultData(CompoundTag data) { - this.data = () -> data; - return this; - } - - public BogeyStyleBuilder particles(ParticleType particleType) { - this.particles = () -> particleType; - return this; - } - - public BogeyStyleBuilder soundType(ResourceLocation soundEntry) { - this.soundType = () -> soundEntry; - return this; - } - - public BogeyStyleBuilder block(BogeySizes.BogeySize size, BlockEntry block) { - return this.block(size, block.getId()); - } - - public BogeyStyleBuilder block(BogeySizes.BogeySize size, ResourceLocation location) { - this.style.addBlockForSize(size, location); - return this; - } - - public BogeyStyleBuilder renderer(BogeyRenderer renderer) { - this.renderer = () -> renderer; - return this; - } - - @Override - protected @NotNull T createEntry() { - style.defaultData = data.get(); - style.renderer = renderer.get(); - style.soundType = soundType.get(); - return style; - } -} diff --git a/src/main/java/com/simibubi/create/foundation/data/CreateRegistrate.java b/src/main/java/com/simibubi/create/foundation/data/CreateRegistrate.java index de34fd210..7a51ce75a 100644 --- a/src/main/java/com/simibubi/create/foundation/data/CreateRegistrate.java +++ b/src/main/java/com/simibubi/create/foundation/data/CreateRegistrate.java @@ -135,14 +135,6 @@ public class CreateRegistrate extends AbstractRegistrate { (callback) -> CreateTileEntityBuilder.create(this, parent, name, callback, factory)); } - public BogeyStyleBuilder bogeyStyle(String name, T style) { - return this.bogeyStyle(self(), name, style); - } - - public BogeyStyleBuilder bogeyStyle(P parent, String name, T style) { - return this.entry(name, (callback) -> BogeyStyleBuilder.create(this, parent, name, callback, style)); - } - @Override public CreateEntityBuilder entity(String name, EntityType.EntityFactory factory, MobCategory classification) { From 0f7a8b7b24ef25c4266fc88f82995b609087904e Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Sun, 30 Apr 2023 20:05:50 +0100 Subject: [PATCH 45/53] Implemented Changes To Remaining Classes --- .../com/simibubi/create/AllBogeyStyles.java | 97 ++++++-- .../logistics/trains/AbstractBogeyBlock.java | 21 +- .../logistics/trains/BogeyRenderer.java | 214 ++++++++++++++---- .../trains/StandardBogeyRenderer.java | 201 +++++++++------- .../trains/entity/BogeyInstance.java | 26 ++- .../logistics/trains/entity/TrainPacket.java | 4 - .../trains/track/StandardBogeyTileEntity.java | 13 +- 7 files changed, 403 insertions(+), 173 deletions(-) diff --git a/src/main/java/com/simibubi/create/AllBogeyStyles.java b/src/main/java/com/simibubi/create/AllBogeyStyles.java index be789fdd7..17cccf4b8 100644 --- a/src/main/java/com/simibubi/create/AllBogeyStyles.java +++ b/src/main/java/com/simibubi/create/AllBogeyStyles.java @@ -1,27 +1,98 @@ package com.simibubi.create; +import com.simibubi.create.content.logistics.trains.AbstractBogeyBlock; import com.simibubi.create.content.logistics.trains.BogeyRenderer; +import com.simibubi.create.content.logistics.trains.BogeyRenderer.CommonRenderer; import com.simibubi.create.content.logistics.trains.BogeySizes; -import com.simibubi.create.content.logistics.trains.StandardBogeyRenderer; -import com.simibubi.create.content.logistics.trains.TestBogeyRenderer; +import com.simibubi.create.content.logistics.trains.StandardBogeyRenderer.*; import com.simibubi.create.content.logistics.trains.entity.BogeyStyle; -import com.tterrag.registrate.util.entry.RegistryEntry; -import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; + +import com.simibubi.create.foundation.utility.Lang; + +import com.tterrag.registrate.util.entry.BlockEntry; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.function.Supplier; import static com.simibubi.create.Create.LOGGER; -import static com.simibubi.create.Create.REGISTRATE; -@SuppressWarnings("unused") public class AllBogeyStyles { - public static final RegistryEntry STANDARD = REGISTRATE - .bogeyStyle("standard", new BogeyStyle()) - .block(BogeySizes.SMALL, AllBlocks.SMALL_BOGEY) - .block(BogeySizes.LARGE, AllBlocks.LARGE_BOGEY) - .renderer(new StandardBogeyRenderer()) - .register(); + public static final Map BOGEY_STYLES = new HashMap<>(); + + public static BogeyStyle STANDARD = create("standard") + .commonRenderer(CommonStandardBogeyRenderer::new) + .size(BogeySizes.SMALL, SmallStandardBogeyRenderer::new, AllBlocks.SMALL_BOGEY) + .size(BogeySizes.LARGE, LargeStandardBogeyRenderer::new, AllBlocks.LARGE_BOGEY) + .build(); + + public static BogeyStyleBuilder create(String name) { + return create(Create.asResource(name)); + } + + public static BogeyStyleBuilder create(ResourceLocation name) { + return new BogeyStyleBuilder(name); + } public static void register() { LOGGER.info("Registered bogey styles from " + Create.ID); - AllRegistries.DEFERRED_BOGEY_REGISTRY.register(FMLJavaModLoadingContext.get().getModEventBus()); + } + + public static class BogeyStyleBuilder { + protected final Map sizes = new HashMap<>(); + protected final ResourceLocation name; + + protected Component displayName = Lang.translateDirect("create.bogeys.invalid"); + protected ResourceLocation soundType = AllSoundEvents.TRAIN2.getId(); + protected CompoundTag defaultData = new CompoundTag(); + protected Optional commonRenderer = Optional.empty(); + + public BogeyStyleBuilder(ResourceLocation name) { + this.name = name; + } + + public BogeyStyleBuilder displayName(Component displayName) { + this.displayName = displayName; + return this; + } + + public BogeyStyleBuilder soundType(ResourceLocation soundType) { + this.soundType = soundType; + return this; + } + + public BogeyStyleBuilder defaultData(CompoundTag defaultData) { + this.defaultData = defaultData; + return this; + } + + public BogeyStyleBuilder size(BogeySizes.BogeySize size, Supplier renderer, + BlockEntry blockEntry) { + this.size(size, renderer, blockEntry.getId()); + return this; + } + + public BogeyStyleBuilder size(BogeySizes.BogeySize size, Supplier renderer, + ResourceLocation location) { + this.sizes.put(size, new BogeyStyle.SizeData(location, renderer.get())); + return this; + } + + public BogeyStyleBuilder commonRenderer(Supplier commonRenderer) { + this.commonRenderer = Optional.of(commonRenderer.get()); + return this; + } + + public BogeyStyle build() { + BogeyStyle entry = + new BogeyStyle(name, displayName, soundType, defaultData, sizes, commonRenderer); + BOGEY_STYLES.put(name, entry); + return entry; + } } } 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 83d223d64..d3691bde0 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 @@ -2,9 +2,9 @@ package com.simibubi.create.content.logistics.trains; 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 java.util.Set; import javax.annotation.Nullable; @@ -15,7 +15,6 @@ 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.content.contraptions.wrench.IWrenchable; import com.simibubi.create.content.logistics.trains.entity.BogeyStyle; import com.simibubi.create.content.logistics.trains.track.StandardBogeyTileEntity; @@ -110,7 +109,10 @@ public abstract class AbstractBogeyBlock extends Block implements ITE commonRenderer + = style.getNewCommonRenderInstance(); + final BogeyRenderer renderer = style.getInWorldRenderInstance(this.getSize()); if (state != null) { ms.translate(.5f, .5f, .5f); if (state.getValue(AXIS) == Direction.Axis.X) @@ -118,7 +120,9 @@ public abstract class AbstractBogeyBlock extends Block implements ITE + common.render(sbte.getBogeyData(), wheelAngle, ms, light, vb)); } public BogeySizes.BogeySize getSize() { @@ -148,8 +152,8 @@ public abstract class AbstractBogeyBlock extends Block implements ITE 1) { - Collection styles = AllRegistries.BOGEY_REGISTRY.get().getValues(); + && AllBogeyStyles.BOGEY_STYLES.size() > 1) { + Collection styles = AllBogeyStyles.BOGEY_STYLES.values(); if (styles.size() <= 1) return InteractionResult.PASS; @@ -245,15 +249,14 @@ public abstract class AbstractBogeyBlock extends Block implements ITE allStyles = AllRegistries.BOGEY_REGISTRY.get().getValues(); + Collection allStyles = AllBogeyStyles.BOGEY_STYLES.values(); if (allStyles.size() <= 1) return style; List list = new ArrayList<>(allStyles); - list.sort(Comparator.comparing(BogeyStyle::getRegistryName)); return Iterate.cycleValue(list, style); } diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/BogeyRenderer.java b/src/main/java/com/simibubi/create/content/logistics/trains/BogeyRenderer.java index ae7ce39ce..5839646ce 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/BogeyRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/BogeyRenderer.java @@ -25,68 +25,153 @@ import org.jetbrains.annotations.Nullable; import java.util.Arrays; import java.util.Collections; -import java.util.EnumMap; import java.util.HashMap; import java.util.Map; -import java.util.Set; - -/* - * Proof of concept implementation of a common and generic bogey render - * - Model data is handled as a generic Transform which allows them to be modified in a common manner and then - * "finalised" seperately - * - Model instances (used for contraptions) are stored in a map keyed by the partial type, this should probably - * be replaced as it has a few drawbacks notably all model data is the same between sizes for the same type - * - Lighting and removal is automatically handled by collecting values from the map - * - Renderers are stored by type so they can be easily added or removed for specific sizes without individual - * overriden methods for each size - */ - -// Seperate From BogeyInstance So It Can Be Used Inworld public abstract class BogeyRenderer { - Map renderers = new HashMap<>(); Map contraptionModelData = new HashMap<>(); + /** + * A common interface for getting transform data for both in-world and in-contraption model data safely from a + * partial model + * + * @param model The key for the model data to instantiate or retrieve + * @param ms The posestack used for contraption model data + * @param inContraption The type of model needed + * @param size The amount of models needed + * @return A generic transform which can be used for both in-world and in-contraption models + */ public Transform[] getTransformsFromPartial(PartialModel model, PoseStack ms, boolean inContraption, int size) { return (inContraption) ? transformContraptionModelData(keyFromModel(model), ms) : createModelData(model, size); } + /** + * A common interface for getting transform data for both in-world and in-contraption model data safely from a + * blockstate + * + * @param state The key for the model data to instantiate or retrieve + * @param ms The posestack used for contraption model data + * @param inContraption The type of model needed + * @param size The amount of models needed + * @return A generic transform which can be used for both in-world and in-contraption models + */ public Transform[] getTransformsFromBlockState(BlockState state, PoseStack ms, boolean inContraption, int size) { return (inContraption) ? transformContraptionModelData(keyFromModel(state), ms) : createModelData(state, size); } + /** + * Used for calling both in-world and in-contraption rendering + * + * @param bogeyData Custom data stored on the bogey able to be used for rendering + * @param wheelAngle The angle of the wheel + * @param ms The posestack to render to + * @param light (Optional) Light used for in-world rendering + * @param vb (Optional) Vertex Consumer used for in-world rendering + */ + @OnlyIn(Dist.CLIENT) + public abstract void render(CompoundTag bogeyData, float wheelAngle, PoseStack ms, int light, VertexConsumer vb); + + /** + * Used for calling in-contraption rendering ensuring that falsey data is handled correctly + * + * @param bogeyData Custom data stored on the bogey able to be used for rendering + * @param wheelAngle The angle of the wheel + * @param ms The posestack to render to + */ + @OnlyIn(Dist.CLIENT) + public void render(CompoundTag bogeyData, float wheelAngle, PoseStack ms) { + this.render(bogeyData, wheelAngle, ms, 0, null); + } + + public abstract BogeySizes.BogeySize getSize(); + + /** + * Used to collect Contraption Model Data for in-contraption rendering, should not be utilised directly when + * rendering to prevent render type mismatch + * + * @param key The key used to access the model + * @param ms Posestack of the contraption to bind the model data to + * @return A generic transform which can be used for both in-world and in-contraption models + */ private Transform[] transformContraptionModelData(String key, PoseStack ms) { ModelData[] modelData = contraptionModelData.get(key); Arrays.stream(modelData).forEach(modelDataElement -> modelDataElement.setTransform(ms)); return modelData; } + + /** + * Used for in world rendering, creates a set count of model data to be rendered, allowing for a generic response + * when rendering multiple models both in-world and in-contraption for example, with wheels + * + * @param model The partial model of the model data ot be made + * @param size The Amount of models needed + * @return A generic transform which can be used for both in-world and in-contraption models + */ private Transform[] createModelData(PartialModel model, int size) { BlockState air = Blocks.AIR.defaultBlockState(); SuperByteBuffer[] data = { CachedBufferer.partial(model, air) }; return expandArrayToLength(data, size); } + /** + * Used for in world rendering, creates a set count of model data to be rendered, allowing for a generic response + * when rendering multiple models both in-world and in-contraption for example, with wheels + * + * @param state The state of the model data to be made + * @param size Amount of models needed + * @return A generic transform which can be used for both in-world and in-contraption models + */ private Transform[] createModelData(BlockState state, int size) { SuperByteBuffer[] data = { CachedBufferer.block(state) }; return expandArrayToLength(data, size); } + /** + * Utility function to clone in-world models to a set size to allow for common handling of rendering with multiple + * instances of the same model for example with wheels + * + * @param data An in-world model to be replicated + * @param size Amount of models needed + * @return A generic transform which can be used for both in-world and in-contraption models + */ private Transform[] expandArrayToLength(SuperByteBuffer[] data, int size) { return Arrays.stream(Collections.nCopies(size, data).toArray()) .flatMap(inner -> Arrays.stream((SuperByteBuffer[]) inner)) .toArray(SuperByteBuffer[]::new); } + /** + * Helper function to collect or create a single model from a partial model used for both in-world and + * in-contraption rendering + * + * @param model The key of the model to be collected or instantiated + * @param ms Posestack to bind the model to if it is within a contraption + * @param inContraption Type of rendering required + * @return A generic transform which can be used for both in-world and in-contraption models + */ public Transform getTransformFromPartial(PartialModel model, PoseStack ms, boolean inContraption) { BlockState air = Blocks.AIR.defaultBlockState(); return inContraption ? contraptionModelData.get(keyFromModel(model))[0].setTransform(ms) : CachedBufferer.partial(model, air); } - @OnlyIn(Dist.CLIENT) - public abstract void initialiseContraptionModelData(MaterialManager materialManager, BogeySizes.BogeySize size); + /** + * Provides render implementations a point in setup to instantiate all model data to be needed + * + * @param materialManager The material manager + */ + @OnlyIn(Dist.CLIENT) + public abstract void initialiseContraptionModelData(MaterialManager materialManager); + + /** + * Creates instances of models for in-world rendering to a set length from a provided partial model + * + * @param materialManager The material manager + * @param model Partial model to be instanced + * @param count Amount of models neeeded + */ public void createModelInstances(MaterialManager materialManager, PartialModel model, int count) { ModelData[] modelData = new ModelData[count]; materialManager.defaultSolid().material(Materials.TRANSFORMED) @@ -94,6 +179,13 @@ public abstract class BogeyRenderer { contraptionModelData.put(keyFromModel(model), modelData); } + /** + * Creates instances of models for in-world rendering to a set length from a provided blockstate + * + * @param materialManager The material manager + * @param state Blockstate of the model to be created + * @param count Amount of models needed + */ public void createModelInstances(MaterialManager materialManager, BlockState state, int count) { ModelData[] modelData = new ModelData[count]; materialManager.defaultSolid().material(Materials.TRANSFORMED) @@ -101,26 +193,26 @@ public abstract class BogeyRenderer { contraptionModelData.put(keyFromModel(state), modelData); } + /** + * Helper function to create a single model instance for in-contraption rendering + * + * @param materialManager The material manager + * @param models The type of model to create instances of + */ public void createModelInstances(MaterialManager materialManager, PartialModel... models) { for (PartialModel model : models) createModelInstances(materialManager, model, 1); } - @OnlyIn(Dist.CLIENT) - public void render(CompoundTag bogeyData, float wheelAngle, PoseStack ms, int light, @Nullable VertexConsumer vb, - BogeySizes.BogeySize size) { - renderCommon(bogeyData, wheelAngle, ms, light, vb); - renderers.get(size).render(bogeyData, wheelAngle, ms, light, vb); - } - - @OnlyIn(Dist.CLIENT) - public void render(CompoundTag bogeyData, float wheelAngle, PoseStack ms, BogeySizes.BogeySize size) { - this.render(bogeyData, wheelAngle, ms, 0, null, size); - } - - @OnlyIn(Dist.CLIENT) - public abstract void renderCommon(CompoundTag bogeyData, float wheelAngle, PoseStack ms, int light, - @Nullable VertexConsumer vb); + /** + * Handles scale for all model data and renders non contraption model data + * + * @param b The model data itself + * @param ms Pose stack to render to + * @param light light level of the scene + * @param vb Vertex Consumber to render to + * @param Generic alias for both contraption and in-world model data + */ public static > void finalize(B b, PoseStack ms, int light, @Nullable VertexConsumer vb) { b.scale(1 - 1/512f); @@ -128,13 +220,10 @@ public abstract class BogeyRenderer { byteBuf.light(light).renderInto(ms, vb); } - public boolean styleImplementsSize(BogeySizes.BogeySize size) { - return this.renderers.containsKey(size); - } - - public Set implementedSizes() { - return renderers.keySet(); - } + /** + * Automatic handling for setting empty transforms for all model data + * + */ public void emptyTransforms() { for (ModelData[] data : contraptionModelData.values()) @@ -142,12 +231,24 @@ public abstract class BogeyRenderer { model.setEmptyTransform(); } + /** + * Automatic handling for updating all model data's light + * + * @param blockLight the blocklight to be applied + * @param skyLight the skylight to be applied + */ + public void updateLight(int blockLight, int skyLight) { for (ModelData[] data : contraptionModelData.values()) for (ModelData model : data) model.setBlockLight(blockLight).setSkyLight(skyLight); } + /** + * Automatic handling for clearing all model data of a contraption + * + */ + public void remove() { for (ModelData[] data : contraptionModelData.values()) for (ModelData model : data) @@ -155,18 +256,43 @@ public abstract class BogeyRenderer { contraptionModelData.clear(); } + /** + * Create a model key from a partial model, so it can be easily accessed + * + * @param partialModel the model we want a unique key for + * @return Key of the model + */ + private String keyFromModel(PartialModel partialModel) { return partialModel.getLocation().toString(); } + /** + * Create a model key from a blockstate, so it can be easily accessed + * + * @param state Blockstate of the model + * @return Key of the model + */ + private String keyFromModel(BlockState state) { return state.toString(); } - public abstract BogeyRenderer newInstance(); + /** + * Used for rendering in contraptions allowing for individual instances of models for each component + * + * @return new Instance of renderer + */ + public abstract BogeyRenderer createNewInstance(); - @FunctionalInterface - interface Renderer { - void render(CompoundTag bogeyData, float wheelAngle, PoseStack ms, int light, VertexConsumer vb); + + public static abstract class CommonRenderer extends BogeyRenderer { + @Override + public BogeySizes.BogeySize getSize() { + return null; + } + + @Override + public abstract CommonRenderer createNewInstance(); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/StandardBogeyRenderer.java b/src/main/java/com/simibubi/create/content/logistics/trains/StandardBogeyRenderer.java index 1e3551332..2dddffba2 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/StandardBogeyRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/StandardBogeyRenderer.java @@ -22,105 +22,130 @@ import static com.simibubi.create.AllBlockPartials.BOGEY_PISTON; import static com.simibubi.create.AllBlockPartials.SMALL_BOGEY_WHEELS; import static com.simibubi.create.AllBlockPartials.BOGEY_FRAME; -public class StandardBogeyRenderer extends BogeyRenderer { +public class StandardBogeyRenderer { + public static class CommonStandardBogeyRenderer extends BogeyRenderer.CommonRenderer { + @Override + public void initialiseContraptionModelData(MaterialManager materialManager) { + createModelInstances(materialManager, AllBlocks.SHAFT.getDefaultState() + .setValue(ShaftBlock.AXIS, Direction.Axis.Z), 2); + } - public StandardBogeyRenderer() { - renderers.put(BogeySizes.SMALL, this::renderSmall); - renderers.put(BogeySizes.LARGE, this::renderLarge); - } + @Override + public CommonStandardBogeyRenderer createNewInstance() { + return new CommonStandardBogeyRenderer(); + } - @Override - public void initialiseContraptionModelData(MaterialManager materialManager, BogeySizes.BogeySize size) { - // Large - createModelInstances(materialManager, LARGE_BOGEY_WHEELS, BOGEY_DRIVE, BOGEY_PISTON, BOGEY_PIN); - createModelInstances(materialManager, AllBlocks.SHAFT.getDefaultState() - .setValue(ShaftBlock.AXIS, Direction.Axis.X), 2); - // Small - createModelInstances(materialManager, SMALL_BOGEY_WHEELS, 2); - createModelInstances(materialManager, BOGEY_FRAME); - // Common - createModelInstances(materialManager, AllBlocks.SHAFT.getDefaultState() - .setValue(ShaftBlock.AXIS, Direction.Axis.Z), 2); - } - - @Override - public void renderCommon(CompoundTag bogeyData, float wheelAngle, PoseStack ms, int light, @Nullable VertexConsumer vb) { - boolean inContraption = vb == null; - Transform[] shafts = getTransformsFromBlockState(AllBlocks.SHAFT.getDefaultState() - .setValue(ShaftBlock.AXIS, Direction.Axis.Z), ms, inContraption, 2); - for (int i : Iterate.zeroAndOne) { - shafts[i].translate(-.5f, .25f, i * -1) - .centre() - .rotateZ(wheelAngle) - .unCentre(); - finalize(shafts[i], ms, light, vb); + @Override + public void render(CompoundTag bogeyData, float wheelAngle, PoseStack ms, int light, VertexConsumer vb) { + boolean inContraption = vb == null; + Transform[] shafts = getTransformsFromBlockState(AllBlocks.SHAFT.getDefaultState() + .setValue(ShaftBlock.AXIS, Direction.Axis.Z), ms, inContraption, 2); + for (int i : Iterate.zeroAndOne) { + shafts[i].translate(-.5f, .25f, i * -1) + .centre() + .rotateZ(wheelAngle) + .unCentre(); + finalize(shafts[i], ms, light, vb); + } } } - public void renderSmall(CompoundTag bogeyData, float wheelAngle, PoseStack ms, int light, - @Nullable VertexConsumer vb) { - boolean inContraption = vb == null; - Transform transform = getTransformFromPartial(BOGEY_FRAME, ms, inContraption); - finalize(transform, ms, light, vb); - Transform[] wheels = getTransformsFromPartial(SMALL_BOGEY_WHEELS, ms, inContraption, 2); - for (int side : Iterate.positiveAndNegative) { + public static class SmallStandardBogeyRenderer extends BogeyRenderer { + @Override + public void initialiseContraptionModelData(MaterialManager materialManager) { + createModelInstances(materialManager, SMALL_BOGEY_WHEELS, 2); + createModelInstances(materialManager, BOGEY_FRAME); + } + + @Override + public BogeyRenderer createNewInstance() { + return new SmallStandardBogeyRenderer(); + } + + @Override + public BogeySizes.BogeySize getSize() { + return BogeySizes.SMALL; + } + + @Override + public void render(CompoundTag bogeyData, float wheelAngle, PoseStack ms, int light, VertexConsumer vb) { + boolean inContraption = vb == null; + Transform transform = getTransformFromPartial(BOGEY_FRAME, ms, inContraption); + finalize(transform, ms, light, vb); + + Transform[] wheels = getTransformsFromPartial(SMALL_BOGEY_WHEELS, ms, inContraption, 2); + for (int side : Iterate.positiveAndNegative) { + if (!inContraption) + ms.pushPose(); + Transform wheel = wheels[(side + 1)/2]; + wheel.translate(0, 12 / 16f, side) + .rotateX(wheelAngle); + finalize(wheel, ms, light, vb); + if (!inContraption) + ms.popPose(); + } + } + } + + public static class LargeStandardBogeyRenderer extends BogeyRenderer { + @Override + public void initialiseContraptionModelData(MaterialManager materialManager) { + createModelInstances(materialManager, LARGE_BOGEY_WHEELS, BOGEY_DRIVE, BOGEY_PISTON, BOGEY_PIN); + createModelInstances(materialManager, AllBlocks.SHAFT.getDefaultState() + .setValue(ShaftBlock.AXIS, Direction.Axis.X), 2); + } + + @Override + public BogeyRenderer createNewInstance() { + return new LargeStandardBogeyRenderer(); + } + + @Override + public BogeySizes.BogeySize getSize() { + return BogeySizes.LARGE; + } + + @Override + public void render(CompoundTag bogeyData, float wheelAngle, PoseStack ms, int light, VertexConsumer vb) { + boolean inContraption = vb == null; + + Transform[] secondaryShafts = getTransformsFromBlockState(AllBlocks.SHAFT.getDefaultState() + .setValue(ShaftBlock.AXIS, Direction.Axis.X), ms, inContraption, 2); + + for (int i : Iterate.zeroAndOne) { + Transform secondShaft = secondaryShafts[i]; + secondShaft.translate(-.5f, .25f, .5f + i * -2) + .centre() + .rotateX(wheelAngle) + .unCentre(); + finalize(secondShaft, ms, light, vb); + } + + Transform bogeyDrive = getTransformFromPartial(BOGEY_DRIVE, ms, inContraption); + finalize(bogeyDrive, ms, light, vb); + + Transform bogeyPiston = getTransformFromPartial(BOGEY_PISTON, ms, inContraption) + .translate(0, 0, 1 / 4f * Math.sin(AngleHelper.rad(wheelAngle))); + finalize(bogeyPiston, ms, light, vb); + if (!inContraption) ms.pushPose(); - Transform wheel = wheels[(side + 1)/2]; - wheel.translate(0, 12 / 16f, side) + + Transform bogeyWheels = getTransformFromPartial(LARGE_BOGEY_WHEELS, ms, inContraption) + .translate(0, 1, 0) .rotateX(wheelAngle); - finalize(wheel, ms, light, vb); + finalize(bogeyWheels, ms, light, vb); + + Transform bogeyPin = getTransformFromPartial(BOGEY_PIN, ms, inContraption) + .translate(0, 1, 0) + .rotateX(wheelAngle) + .translate(0, 1 / 4f, 0) + .rotateX(-wheelAngle); + finalize(bogeyPin, ms, light, vb); + if (!inContraption) ms.popPose(); } } - - public void renderLarge(CompoundTag bogeyData, float wheelAngle, PoseStack ms, int light, - @Nullable VertexConsumer vb) { - - boolean inContraption = vb == null; - - Transform[] secondaryShafts = getTransformsFromBlockState(AllBlocks.SHAFT.getDefaultState() - .setValue(ShaftBlock.AXIS, Direction.Axis.X), ms, inContraption, 2); - - for (int i : Iterate.zeroAndOne) { - Transform secondShaft = secondaryShafts[i]; - secondShaft.translate(-.5f, .25f, .5f + i * -2) - .centre() - .rotateX(wheelAngle) - .unCentre(); - finalize(secondShaft, ms, light, vb); - } - - Transform bogeyDrive = getTransformFromPartial(BOGEY_DRIVE, ms, inContraption); - finalize(bogeyDrive, ms, light, vb); - - Transform bogeyPiston = getTransformFromPartial(BOGEY_PISTON, ms, inContraption) - .translate(0, 0, 1 / 4f * Math.sin(AngleHelper.rad(wheelAngle))); - finalize(bogeyPiston, ms, light, vb); - - if (!inContraption) - ms.pushPose(); - - Transform bogeyWheels = getTransformFromPartial(LARGE_BOGEY_WHEELS, ms, inContraption) - .translate(0, 1, 0) - .rotateX(wheelAngle); - finalize(bogeyWheels, ms, light, vb); - - Transform bogeyPin = getTransformFromPartial(BOGEY_PIN, ms, inContraption) - .translate(0, 1, 0) - .rotateX(wheelAngle) - .translate(0, 1 / 4f, 0) - .rotateX(-wheelAngle); - finalize(bogeyPin, ms, light, vb); - - if (!inContraption) - ms.popPose(); - } - - @Override - public BogeyRenderer newInstance() { - return new StandardBogeyRenderer(); - } } 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 e868a15b6..a9b0ff8af 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 @@ -8,24 +8,31 @@ import com.simibubi.create.content.logistics.trains.BogeyRenderer; import com.simibubi.create.content.logistics.trains.BogeySizes; import net.minecraft.core.BlockPos; -import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.LightLayer; import net.minecraft.world.phys.Vec3; +import java.util.Optional; + public final class BogeyInstance { + private final BogeySizes.BogeySize size; + private final BogeyStyle style; public final CarriageBogey bogey; public final BogeyRenderer renderer; - private final BogeySizes.BogeySize size; + public final Optional commonRenderer; - public BogeyInstance(CarriageBogey bogey, BogeyRenderer renderer, BogeySizes.BogeySize size, - MaterialManager materialManager) { + public BogeyInstance(CarriageBogey bogey, BogeyStyle style, BogeySizes.BogeySize size, MaterialManager materialManager) { this.bogey = bogey; - this.renderer = renderer; this.size = size; + this.style = style; - renderer.initialiseContraptionModelData(materialManager, size); + this.renderer = this.style.createRendererInstance(this.size); + this.commonRenderer = this.style.getNewCommonRenderInstance(); + + commonRenderer.ifPresent(bogeyRenderer -> + bogeyRenderer.initialiseContraptionModelData(materialManager)); + renderer.initialiseContraptionModelData(materialManager); } void hiddenFrame() { @@ -38,11 +45,16 @@ public final class BogeyInstance { return; } - renderer.render(new CompoundTag(), wheelAngle, ms, this.size); + commonRenderer.ifPresent(bogeyRenderer -> + bogeyRenderer.render(bogey.bogeyData, wheelAngle, ms)); + renderer.render(bogey.bogeyData, wheelAngle, ms); } public void updateLight(BlockAndTintGetter world, CarriageContraptionEntity entity) { var lightPos = new BlockPos(getLightPos(entity)); + commonRenderer.ifPresent(bogeyRenderer + -> bogeyRenderer.updateLight(world.getBrightness(LightLayer.BLOCK, lightPos), + world.getBrightness(LightLayer.SKY, lightPos))); renderer.updateLight(world.getBrightness(LightLayer.BLOCK, lightPos), world.getBrightness(LightLayer.SKY, lightPos)); } 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 73ed8b505..3d27c86cd 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,7 +6,6 @@ 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; @@ -17,13 +16,10 @@ 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; 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; 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 a6c9185bb..f54183da0 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,13 +1,10 @@ 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.RegisteredObjects; import com.simibubi.create.foundation.utility.animation.LerpedFloat; import net.minecraft.core.BlockPos; @@ -38,14 +35,14 @@ public class StandardBogeyTileEntity extends CachedRenderBBTileEntity { public void setBogeyData(@NotNull CompoundTag newData) { if (!newData.contains(BOGEY_STYLE_KEY)) { - ResourceLocation style = AllBogeyStyles.STANDARD.getId(); + ResourceLocation style = AllBogeyStyles.STANDARD.name; NBTHelper.writeResourceLocation(newData, BOGEY_STYLE_KEY, style); } this.bogeyData = newData; } public void setBogeyStyle(@NotNull BogeyStyle style) { - ResourceLocation location = RegisteredObjects.getKeyOrThrow(AllRegistries.BOGEY_REGISTRY.get(), style); + ResourceLocation location = style.name; CompoundTag data = this.getBogeyData(); NBTHelper.writeResourceLocation(data, BOGEY_STYLE_KEY, location); markUpdated(); @@ -55,9 +52,9 @@ public class StandardBogeyTileEntity extends CachedRenderBBTileEntity { public BogeyStyle getStyle() { CompoundTag data = this.getBogeyData(); ResourceLocation currentStyle = NBTHelper.readResourceLocation(data, BOGEY_STYLE_KEY); - BogeyStyle style = AllRegistries.BOGEY_REGISTRY.get().getValue(currentStyle); + BogeyStyle style = AllBogeyStyles.BOGEY_STYLES.get(currentStyle); if (style == null) { - setBogeyStyle(AllBogeyStyles.STANDARD.get()); + setBogeyStyle(AllBogeyStyles.STANDARD); return getStyle(); } return style; @@ -81,7 +78,7 @@ public class StandardBogeyTileEntity extends CachedRenderBBTileEntity { private CompoundTag createBogeyData() { CompoundTag nbt = new CompoundTag(); - NBTHelper.writeResourceLocation(nbt, BOGEY_STYLE_KEY, AllBogeyStyles.STANDARD.getId()); + NBTHelper.writeResourceLocation(nbt, BOGEY_STYLE_KEY, AllBogeyStyles.STANDARD.name); return nbt; } From 5634670b2750a2df5dfee6de3f93bc895391300d Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Sun, 30 Apr 2023 20:06:00 +0100 Subject: [PATCH 46/53] General Cleanup --- .../content/logistics/trains/entity/CarriageBogey.java | 7 ++----- src/main/java/com/simibubi/create/events/CommonEvents.java | 1 - 2 files changed, 2 insertions(+), 6 deletions(-) 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 c11c941ad..3ac7d3a43 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 @@ -4,7 +4,6 @@ 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; @@ -29,8 +28,6 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.phys.Vec3; import net.minecraftforge.registries.ForgeRegistries; -import org.jetbrains.annotations.NotNull; - import static com.simibubi.create.content.logistics.trains.track.StandardBogeyTileEntity.BOGEY_STYLE_KEY; public class CarriageBogey { @@ -181,12 +178,12 @@ public class CarriageBogey { public BogeyStyle getStyle() { ResourceLocation location = NBTHelper.readResourceLocation(this.bogeyData, BOGEY_STYLE_KEY); - return AllRegistries.BOGEY_REGISTRY.get().getValue(location); + return AllBogeyStyles.BOGEY_STYLES.get(location); } private CompoundTag createBogeyData() { CompoundTag nbt = new CompoundTag(); - NBTHelper.writeResourceLocation(nbt, BOGEY_STYLE_KEY, AllBogeyStyles.STANDARD.getId()); + NBTHelper.writeResourceLocation(nbt, BOGEY_STYLE_KEY, AllBogeyStyles.STANDARD.name); return nbt; } diff --git a/src/main/java/com/simibubi/create/events/CommonEvents.java b/src/main/java/com/simibubi/create/events/CommonEvents.java index 8f5cf2e3d..14cf82e86 100644 --- a/src/main/java/com/simibubi/create/events/CommonEvents.java +++ b/src/main/java/com/simibubi/create/events/CommonEvents.java @@ -1,7 +1,6 @@ package com.simibubi.create.events; import com.simibubi.create.AllFluids; -import com.simibubi.create.AllRegistries; import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionHandler; import com.simibubi.create.content.contraptions.components.structureMovement.interaction.controls.ControlsServerHandler; From 112306d5d49db10176d091f1f2ece893afb274dd Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Sun, 30 Apr 2023 20:59:30 +0100 Subject: [PATCH 47/53] Displayed new style name when changing betweeen them --- .../create/content/logistics/trains/AbstractBogeyBlock.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 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 d3691bde0..df39389aa 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 @@ -178,7 +178,8 @@ public abstract class AbstractBogeyBlock extends Block implements ITE Date: Sun, 30 Apr 2023 20:59:50 +0100 Subject: [PATCH 48/53] Added Display Name To Standard Bogey Style --- src/main/java/com/simibubi/create/AllBogeyStyles.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/simibubi/create/AllBogeyStyles.java b/src/main/java/com/simibubi/create/AllBogeyStyles.java index 17cccf4b8..b4f97cb1d 100644 --- a/src/main/java/com/simibubi/create/AllBogeyStyles.java +++ b/src/main/java/com/simibubi/create/AllBogeyStyles.java @@ -13,6 +13,7 @@ import com.tterrag.registrate.util.entry.BlockEntry; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.resources.ResourceLocation; import java.util.HashMap; @@ -27,6 +28,7 @@ public class AllBogeyStyles { public static BogeyStyle STANDARD = create("standard") .commonRenderer(CommonStandardBogeyRenderer::new) + .displayName(new TranslatableComponent("create.bogeys.styles.standard")) .size(BogeySizes.SMALL, SmallStandardBogeyRenderer::new, AllBlocks.SMALL_BOGEY) .size(BogeySizes.LARGE, LargeStandardBogeyRenderer::new, AllBlocks.LARGE_BOGEY) .build(); From 2b76e8d7b3b8d88355868ea31d4b6e3df11a7169 Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Sun, 30 Apr 2023 21:00:40 +0100 Subject: [PATCH 49/53] Added Common Renderer To Remove Function --- .../trains/entity/BackupBogeyRenderer.java | 27 +++++++++++++++++++ .../logistics/trains/entity/BogeyStyle.java | 3 ++- 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/simibubi/create/content/logistics/trains/entity/BackupBogeyRenderer.java diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/BackupBogeyRenderer.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/BackupBogeyRenderer.java new file mode 100644 index 000000000..a8783ea3a --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/BackupBogeyRenderer.java @@ -0,0 +1,27 @@ +package com.simibubi.create.content.logistics.trains.entity; + +import com.jozufozu.flywheel.api.MaterialManager; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.simibubi.create.content.logistics.trains.BogeyRenderer; + +import net.minecraft.nbt.CompoundTag; + +public class BackupBogeyRenderer extends BogeyRenderer.CommonRenderer { + public static BackupBogeyRenderer INSTANCE = new BackupBogeyRenderer(); + + @Override + public void render(CompoundTag bogeyData, float wheelAngle, PoseStack ms, int light, VertexConsumer vb) { + + } + + @Override + public void initialiseContraptionModelData(MaterialManager materialManager) { + + } + + @Override + public CommonRenderer createNewInstance() { + return new BackupBogeyRenderer(); + } +} 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 61bf38b3e..75d272f82 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 @@ -69,7 +69,8 @@ public class BogeyStyle { } public BogeyRenderer getInWorldRenderInstance(BogeySizes.BogeySize size) { - return this.sizes.get(size).renderer(); + SizeData sizeData = this.sizes.get(size); + return sizeData != null ? sizeData.renderer() : BackupBogeyRenderer.INSTANCE; } public Optional getInWorldCommonRenderInstance() { From 08c000b8ba302a1c14f7479e70445e2c6d360bc3 Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Sun, 30 Apr 2023 21:01:19 +0100 Subject: [PATCH 50/53] Added Backup Rendering If A Size Is Not Present --- .../logistics/trains/entity/CarriageContraptionInstance.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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 f9f4eb7ae..6797c05cd 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 @@ -7,6 +7,7 @@ import com.jozufozu.flywheel.util.AnimationTickHolder; import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Vector3f; +import com.simibubi.create.content.logistics.trains.BogeyRenderer; import com.simibubi.create.foundation.utility.Couple; import com.simibubi.create.foundation.utility.Iterate; @@ -99,8 +100,10 @@ public class CarriageContraptionInstance extends EntityInstance { - if (instance != null) + if (instance != null) { + instance.commonRenderer.ifPresent(BogeyRenderer::remove); instance.renderer.remove(); + } }); } From da30e78815afd7906ea82a9fba293f202c036fa8 Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Sun, 30 Apr 2023 21:12:14 +0100 Subject: [PATCH 51/53] Added Particles To Bogey Style (And Respective Builder) --- src/main/java/com/simibubi/create/AllBogeyStyles.java | 10 +++++++++- .../content/logistics/trains/entity/BogeyStyle.java | 7 +++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/simibubi/create/AllBogeyStyles.java b/src/main/java/com/simibubi/create/AllBogeyStyles.java index b4f97cb1d..414bf1dcd 100644 --- a/src/main/java/com/simibubi/create/AllBogeyStyles.java +++ b/src/main/java/com/simibubi/create/AllBogeyStyles.java @@ -11,6 +11,8 @@ import com.simibubi.create.foundation.utility.Lang; import com.tterrag.registrate.util.entry.BlockEntry; +import net.minecraft.core.particles.ParticleType; +import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TranslatableComponent; @@ -52,6 +54,7 @@ public class AllBogeyStyles { protected Component displayName = Lang.translateDirect("create.bogeys.invalid"); protected ResourceLocation soundType = AllSoundEvents.TRAIN2.getId(); protected CompoundTag defaultData = new CompoundTag(); + protected ParticleType particleType = ParticleTypes.CRIT; protected Optional commonRenderer = Optional.empty(); public BogeyStyleBuilder(ResourceLocation name) { @@ -85,6 +88,11 @@ public class AllBogeyStyles { return this; } + public BogeyStyleBuilder particle(ParticleType particleType) { + this.particleType = particleType; + return this; + } + public BogeyStyleBuilder commonRenderer(Supplier commonRenderer) { this.commonRenderer = Optional.of(commonRenderer.get()); return this; @@ -92,7 +100,7 @@ public class AllBogeyStyles { public BogeyStyle build() { BogeyStyle entry = - new BogeyStyle(name, displayName, soundType, defaultData, sizes, commonRenderer); + new BogeyStyle(name, displayName, soundType, particleType, defaultData, sizes, commonRenderer); BOGEY_STYLES.put(name, entry); return entry; } 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 75d272f82..b1d0dc4cd 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 @@ -7,6 +7,7 @@ import com.simibubi.create.content.logistics.trains.BogeyRenderer; import com.simibubi.create.content.logistics.trains.BogeyRenderer.CommonRenderer; import com.simibubi.create.content.logistics.trains.BogeySizes; +import net.minecraft.core.particles.ParticleType; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; @@ -28,13 +29,15 @@ public class BogeyStyle { private final Map sizes; public final Component displayName; public final ResourceLocation soundType; + public final ParticleType particleType; public final CompoundTag defaultData; - public BogeyStyle(ResourceLocation name, Component displayName, ResourceLocation soundType, CompoundTag defaultData, - Map sizes, Optional commonRenderer) { + public BogeyStyle(ResourceLocation name, Component displayName, ResourceLocation soundType, ParticleType particleType, + CompoundTag defaultData, Map sizes, Optional commonRenderer) { this.name = name; this.displayName = displayName; this.soundType = soundType; + this.particleType = particleType; this.defaultData = defaultData; this.sizes = sizes; From 9815f1490f9d540986f85f49f297e2f014c312c4 Mon Sep 17 00:00:00 2001 From: Rabbitminers Date: Sun, 30 Apr 2023 21:12:43 +0100 Subject: [PATCH 52/53] Implemented default data when shifting styles --- .../create/content/logistics/trains/AbstractBogeyBlock.java | 4 ++++ 1 file changed, 4 insertions(+) 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 df39389aa..037382721 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 @@ -177,6 +177,9 @@ public abstract class AbstractBogeyBlock extends Block implements ITE Date: Mon, 1 May 2023 10:09:03 +0100 Subject: [PATCH 53/53] Connected Custom Bogey Particle Types To CarriageParticles --- .../java/com/simibubi/create/AllBogeyStyles.java | 16 +++++++++++----- .../logistics/trains/entity/BogeyStyle.java | 10 ++++++---- .../trains/entity/CarriageParticles.java | 3 +-- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/simibubi/create/AllBogeyStyles.java b/src/main/java/com/simibubi/create/AllBogeyStyles.java index 414bf1dcd..f4eed44df 100644 --- a/src/main/java/com/simibubi/create/AllBogeyStyles.java +++ b/src/main/java/com/simibubi/create/AllBogeyStyles.java @@ -11,7 +11,7 @@ import com.simibubi.create.foundation.utility.Lang; import com.tterrag.registrate.util.entry.BlockEntry; -import net.minecraft.core.particles.ParticleType; +import net.minecraft.core.particles.ParticleOptions; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; @@ -54,7 +54,8 @@ public class AllBogeyStyles { protected Component displayName = Lang.translateDirect("create.bogeys.invalid"); protected ResourceLocation soundType = AllSoundEvents.TRAIN2.getId(); protected CompoundTag defaultData = new CompoundTag(); - protected ParticleType particleType = ParticleTypes.CRIT; + protected ParticleOptions contactParticle = ParticleTypes.CRIT; + protected ParticleOptions smokeParticle = ParticleTypes.POOF; protected Optional commonRenderer = Optional.empty(); public BogeyStyleBuilder(ResourceLocation name) { @@ -88,8 +89,13 @@ public class AllBogeyStyles { return this; } - public BogeyStyleBuilder particle(ParticleType particleType) { - this.particleType = particleType; + public BogeyStyleBuilder contactParticle(ParticleOptions contactParticle) { + this.contactParticle = contactParticle; + return this; + } + + public BogeyStyleBuilder smokeParticle(ParticleOptions smokeParticle) { + this.smokeParticle = smokeParticle; return this; } @@ -100,7 +106,7 @@ public class AllBogeyStyles { public BogeyStyle build() { BogeyStyle entry = - new BogeyStyle(name, displayName, soundType, particleType, defaultData, sizes, commonRenderer); + new BogeyStyle(name, displayName, soundType, contactParticle, smokeParticle, defaultData, sizes, commonRenderer); BOGEY_STYLES.put(name, entry); return entry; } 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 b1d0dc4cd..a1b48ca99 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 @@ -7,7 +7,7 @@ import com.simibubi.create.content.logistics.trains.BogeyRenderer; import com.simibubi.create.content.logistics.trains.BogeyRenderer.CommonRenderer; import com.simibubi.create.content.logistics.trains.BogeySizes; -import net.minecraft.core.particles.ParticleType; +import net.minecraft.core.particles.ParticleOptions; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; @@ -29,15 +29,17 @@ public class BogeyStyle { private final Map sizes; public final Component displayName; public final ResourceLocation soundType; - public final ParticleType particleType; + public final ParticleOptions contactParticle; + public final ParticleOptions smokeParticle; public final CompoundTag defaultData; - public BogeyStyle(ResourceLocation name, Component displayName, ResourceLocation soundType, ParticleType particleType, + public BogeyStyle(ResourceLocation name, Component displayName, ResourceLocation soundType, ParticleOptions contactParticle, ParticleOptions smokeParticle, CompoundTag defaultData, Map sizes, Optional commonRenderer) { this.name = name; this.displayName = displayName; this.soundType = soundType; - this.particleType = particleType; + this.contactParticle = contactParticle; + this.smokeParticle = smokeParticle; this.defaultData = defaultData; this.sizes = sizes; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageParticles.java b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageParticles.java index be2e6fe41..e25db67d8 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageParticles.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/entity/CarriageParticles.java @@ -10,7 +10,6 @@ import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; import net.minecraft.client.Minecraft; import net.minecraft.core.Direction.Axis; -import net.minecraft.core.particles.ParticleTypes; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; @@ -110,7 +109,7 @@ public class CarriageParticles { m = m.add(contraptionMotion.scale(.75f)); - level.addParticle(spark ? ParticleTypes.CRIT : ParticleTypes.POOF, v.x, v.y, v.z, m.x, m.y, m.z); + level.addParticle(spark ? bogey.getStyle().contactParticle : bogey.getStyle().smokeParticle, v.x, v.y, v.z, m.x, m.y, m.z); } } }