Skip to content

Commit acca585

Browse files
committed
feat: flashing yellow arrow signal
1 parent d19d745 commit acca585

File tree

12 files changed

+190
-21
lines changed

12 files changed

+190
-21
lines changed

src/client/kotlin/me/znepb/roadworks/RoadworksClient.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ object RoadworksClient : ClientModInitializer {
7979
AttachmentRendererFactories.register(RoadworksRegistry.ModAttachments.THREE_HEAD_TRAFFIC_SIGNAL_ATTACHMENT_LEFT, ::ThreeHeadSignalAttachmentRenderer)
8080
AttachmentRendererFactories.register(RoadworksRegistry.ModAttachments.THREE_HEAD_TRAFFIC_SIGNAL_ATTACHMENT_RIGHT, ::ThreeHeadSignalAttachmentRenderer)
8181
AttachmentRendererFactories.register(RoadworksRegistry.ModAttachments.THREE_HEAD_TRAFFIC_SIGNAL_ATTACHMENT_STRAIGHT, ::ThreeHeadSignalAttachmentRenderer)
82+
AttachmentRendererFactories.register(RoadworksRegistry.ModAttachments.FLASHING_YELLOW_ARROW_SIGNAL_ATTACHMENT, ::FourHeadSignalAttachmentRenderer)
8283
AttachmentRendererFactories.register(RoadworksRegistry.ModAttachments.FIVE_HEAD_TRAFFIC_SIGNAL_ATTACHMENT_LEFT, ::FiveHeadSignalAttachmentRenderer)
8384
AttachmentRendererFactories.register(RoadworksRegistry.ModAttachments.FIVE_HEAD_TRAFFIC_SIGNAL_ATTACHMENT_RIGHT, ::FiveHeadSignalAttachmentRenderer)
8485
AttachmentRendererFactories.register(RoadworksRegistry.ModAttachments.FIVE_HEAD_TRAFFIC_SIGNAL_ATTACHMENT_LEFT_RIGHT, ::FiveHeadSignalAttachmentRenderer)

src/client/kotlin/me/znepb/roadworks/init/ModelLoader.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import me.znepb.roadworks.datagen.ModelProvider
66
import me.znepb.roadworks.render.PostContainerRenderer
77
import me.znepb.roadworks.render.attachments.*
88
import me.znepb.roadworks.render.models.PostItemBakedModel
9+
import me.znepb.roadworks.signal.FourHeadSignalAttachment
910
import net.fabricmc.fabric.api.client.model.loading.v1.ModelLoadingPlugin
1011

1112
class ModelLoader {
@@ -25,6 +26,7 @@ class ModelLoader {
2526
PostContainerRenderer.POST_MEDIUM_STUB_MODEL,
2627
BeaconAttachmentRenderer.SIGNAL_FRAME_1,
2728
ThreeHeadSignalAttachmentRenderer.SIGNAL_FRAME_3,
29+
FourHeadSignalAttachmentRenderer.SIGNAL_FRAME_4,
2830
FiveHeadSignalAttachmentRenderer.SIGNAL_FRAME_5,
2931
PedestrianSignalAttachmentRenderer.BLANK_SIGNAL,
3032
PedestrianSignalAttachmentRenderer.DONT_WALK,
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package me.znepb.roadworks.render.attachments
2+
3+
import me.znepb.roadworks.RoadworksMain
4+
import me.znepb.roadworks.container.AttachmentContainerBlockEntity
5+
import me.znepb.roadworks.container.PostContainerBlockEntity
6+
import me.znepb.roadworks.signal.FourHeadSignalAttachment
7+
import me.znepb.roadworks.signal.ThreeHeadSignalAttachment
8+
import me.znepb.roadworks.util.RenderUtils
9+
import net.minecraft.client.render.VertexConsumerProvider
10+
import net.minecraft.client.util.math.MatrixStack
11+
import org.joml.Vector3d
12+
13+
class FourHeadSignalAttachmentRenderer : AttachmentRenderer<FourHeadSignalAttachment> {
14+
companion object {
15+
val SIGNAL_FRAME_4 = RoadworksMain.ModId("block/signal_frame_4")
16+
}
17+
18+
override fun render(
19+
attachment: FourHeadSignalAttachment,
20+
blockEntity: AttachmentContainerBlockEntity,
21+
tickDelta: Float,
22+
matrices: MatrixStack,
23+
vertexConsumers: VertexConsumerProvider,
24+
light: Int,
25+
overlay: Int,
26+
offset: Vector3d
27+
) {
28+
val renderer = SignalRenderer(attachment, matrices, vertexConsumers, light, overlay)
29+
30+
matrices.push()
31+
AttachmentRenderer.translateForCenter(matrices, attachment.facing.opposite, 0)
32+
matrices.translate(offset.x, offset.y, -offset.z)
33+
RenderUtils.renderModel(matrices, renderer.buffer, light, overlay, SIGNAL_FRAME_4, null)
34+
matrices.pop()
35+
36+
renderer.renderSignal(attachment.signalType.lights[3], 0.0, 0.375, offset)
37+
renderer.renderSignal(attachment.signalType.lights[2], 0.0, 0.125, offset)
38+
renderer.renderSignal(attachment.signalType.lights[1], 0.0, -0.125, offset)
39+
renderer.renderSignal(attachment.signalType.lights[0], 0.0, -0.375, offset)
40+
}
41+
}

src/client/kotlin/me/znepb/roadworks/render/attachments/SignalRenderer.kt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import net.minecraft.client.util.math.MatrixStack
1616
import net.minecraft.util.math.Direction
1717
import net.minecraft.util.math.random.Random
1818
import org.joml.Vector3d
19+
import kotlin.math.sign
1920

2021
class SignalRenderer(
2122
private val attachment: AbstractSignalAttachment,
@@ -36,8 +37,13 @@ class SignalRenderer(
3637
y: Double,
3738
offset: Vector3d
3839
) {
39-
val modelLocation =
40-
RoadworksMain.ModId("block/signal_${signalLight.light}_${if(attachment.isSignalActive(signalLight)) "on" else "off"}")
40+
val time = System.currentTimeMillis()
41+
val modelLocation = RoadworksMain.ModId("block/signal_${if(signalLight.useTextureOf != null) signalLight.useTextureOf!!.light else signalLight.light}_${
42+
if(
43+
(attachment.isSignalActive(signalLight) && !signalLight.flashing)
44+
|| (attachment.isSignalActive(signalLight) && signalLight.flashing && time % 1000 >= 500))
45+
"on" else "off"
46+
}")
4147

4248
matrices.push()
4349
AttachmentRenderer.translateForCenter(matrices, attachment.facing.opposite, 0)

src/main/kotlin/me/znepb/roadworks/RoadworksRegistry.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package me.znepb.roadworks
22

33
import dan200.computercraft.api.peripheral.PeripheralLookup
44
import me.znepb.roadworks.RoadworksMain.ModId
5+
import me.znepb.roadworks.attachment.Attachment
56
import me.znepb.roadworks.attachment.AttachmentItem
67
import me.znepb.roadworks.attachment.AttachmentType
78
import me.znepb.roadworks.cabinet.TrafficCabinet
@@ -19,10 +20,7 @@ import me.znepb.roadworks.misc.Catwalk
1920
import me.znepb.roadworks.sign.RoadSignAttachment
2021
import me.znepb.roadworks.sign.SignAttachment
2122
import me.znepb.roadworks.sign.SignAttachmentItem
22-
import me.znepb.roadworks.signal.BeaconAttachment
23-
import me.znepb.roadworks.signal.FiveHeadSignalAttachment
24-
import me.znepb.roadworks.signal.PedestrianSignalAttachment
25-
import me.znepb.roadworks.signal.ThreeHeadSignalAttachment
23+
import me.znepb.roadworks.signal.*
2624
import me.znepb.roadworks.train.CrossingGateArmExtension
2725
import me.znepb.roadworks.train.CrossingGateAttachment
2826
import me.znepb.roadworks.train.TrainBellAttachment
@@ -403,6 +401,7 @@ object RoadworksRegistry {
403401
val THREE_HEAD_TRAFFIC_SIGNAL_ATTACHMENT_LEFT = rItem("three_head_traffic_signal_left", AttachmentItem(FabricItemSettings(), ModAttachments.THREE_HEAD_TRAFFIC_SIGNAL_ATTACHMENT_LEFT))
404402
val THREE_HEAD_TRAFFIC_SIGNAL_ATTACHMENT_RIGHT = rItem("three_head_traffic_signal_right", AttachmentItem(FabricItemSettings(), ModAttachments.THREE_HEAD_TRAFFIC_SIGNAL_ATTACHMENT_RIGHT))
405403
val THREE_HEAD_TRAFFIC_SIGNAL_ATTACHMENT_STRAIGHT = rItem("three_head_traffic_signal_straight", AttachmentItem(FabricItemSettings(), ModAttachments.THREE_HEAD_TRAFFIC_SIGNAL_ATTACHMENT_STRAIGHT))
404+
val FLASHING_YELLOW_ARROW_SIGNAL_ATTACHMENT = rItem("flashing_yellow_arrow_traffic_signal", AttachmentItem(FabricItemSettings(), ModAttachments.FLASHING_YELLOW_ARROW_SIGNAL_ATTACHMENT))
406405
val FIVE_HEAD_TRAFFIC_SIGNAL_ATTACHMENT_LEFT = rItem("five_head_traffic_signal_left", AttachmentItem(FabricItemSettings(), ModAttachments.FIVE_HEAD_TRAFFIC_SIGNAL_ATTACHMENT_LEFT))
407406
val FIVE_HEAD_TRAFFIC_SIGNAL_ATTACHMENT_RIGHT = rItem("five_head_traffic_signal_right", AttachmentItem(FabricItemSettings(), ModAttachments.FIVE_HEAD_TRAFFIC_SIGNAL_ATTACHMENT_RIGHT))
408407
val FIVE_HEAD_TRAFFIC_SIGNAL_ATTACHMENT_LEFT_RIGHT = rItem("five_head_traffic_signal_left_right", AttachmentItem(FabricItemSettings(), ModAttachments.FIVE_HEAD_TRAFFIC_SIGNAL_ATTACHMENT_LEFT_RIGHT))
@@ -434,6 +433,9 @@ object RoadworksRegistry {
434433
val THREE_HEAD_TRAFFIC_SIGNAL_ATTACHMENT_STRAIGHT = Registry.register(REGISTRY, ModId("three_head_traffic_signal_straight"), AttachmentType.Builder(
435434
ThreeHeadSignalAttachment::Straight).build())
436435

436+
val FLASHING_YELLOW_ARROW_SIGNAL_ATTACHMENT = Registry.register(REGISTRY, ModId("flashing_yellow_arrow_signal"), AttachmentType.Builder(
437+
FourHeadSignalAttachment::FlashingYellowArrowSignal).build())
438+
437439
val FIVE_HEAD_TRAFFIC_SIGNAL_ATTACHMENT_LEFT = Registry.register(REGISTRY, ModId("five_head_traffic_signal_left"), AttachmentType.Builder(
438440
FiveHeadSignalAttachment::LeftBall).build())
439441
val FIVE_HEAD_TRAFFIC_SIGNAL_ATTACHMENT_RIGHT = Registry.register(REGISTRY, ModId("five_head_traffic_signal_right"), AttachmentType.Builder(

src/main/kotlin/me/znepb/roadworks/cabinet/TrafficCabinetPeripheral.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,22 @@ class TrafficCabinetPeripheral(val blockEntity: TrafficCabinetBlockEntity) : IPe
142142

143143
}
144144

145+
/// Sets the colors of a four-head signal.
146+
@LuaFunction
147+
fun setFourHead(id: Int, red: Boolean, mt: Boolean, mb: Boolean, green: Boolean): Boolean {
148+
when (val type = blockEntity.getTypeOfId(id)?.let { SignalType.fromType(it) }) {
149+
SignalType.FLASHING_YELLOW_ARROW_SIGNAL -> {
150+
blockEntity.queueSignalSet(id, SignalLight.RED_LEFT, red)
151+
blockEntity.queueSignalSet(id, SignalLight.YELLOW_LEFT, mt)
152+
blockEntity.queueSignalSet(id, SignalLight.FLASHING_YELLOW_LEFT, mb)
153+
blockEntity.queueSignalSet(id, SignalLight.GREEN_LEFT, green)
154+
return true
155+
}
156+
else -> throw LuaException("invalid signal type, got $type")
157+
}
158+
159+
}
160+
145161
@LuaFunction
146162
fun setFiveHead(id: Int, red: Boolean, yellowLeft: Boolean, greenLeft: Boolean, yellowRight: Boolean, greenRight: Boolean): Boolean {
147163
return when (val type = blockEntity.getTypeOfId(id)?.let { SignalType.fromType(it) }) {

src/main/kotlin/me/znepb/roadworks/datagen/LanguageProvider.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ class LanguageProvider(output: FabricDataOutput) : FabricLanguageProvider(output
3131
translationBuilder.add(RoadworksRegistry.ModItems.THREE_HEAD_TRAFFIC_SIGNAL_ATTACHMENT_LEFT, "Three-head Traffic Signal Left")
3232
translationBuilder.add(RoadworksRegistry.ModItems.THREE_HEAD_TRAFFIC_SIGNAL_ATTACHMENT_RIGHT, "Three-head Traffic Signal Right")
3333
translationBuilder.add(RoadworksRegistry.ModItems.THREE_HEAD_TRAFFIC_SIGNAL_ATTACHMENT_STRAIGHT, "Three-head Traffic Signal Straight")
34+
translationBuilder.add(RoadworksRegistry.ModItems.FLASHING_YELLOW_ARROW_SIGNAL_ATTACHMENT, "Flashing Yellow Arrow Signal")
3435
translationBuilder.add(RoadworksRegistry.ModItems.FIVE_HEAD_TRAFFIC_SIGNAL_ATTACHMENT_LEFT, "Five-head Traffic Signal Left")
3536
translationBuilder.add(RoadworksRegistry.ModItems.FIVE_HEAD_TRAFFIC_SIGNAL_ATTACHMENT_RIGHT, "Five-head Traffic Signal Right")
3637
translationBuilder.add(RoadworksRegistry.ModItems.FIVE_HEAD_TRAFFIC_SIGNAL_ATTACHMENT_LEFT_RIGHT, "Five-head Traffic Signal Left/Right")
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package me.znepb.roadworks.signal
2+
3+
import me.znepb.roadworks.RoadworksRegistry
4+
import me.znepb.roadworks.attachment.AttachmentType
5+
import me.znepb.roadworks.container.AttachmentContainerBlockEntity
6+
import me.znepb.roadworks.container.PostContainerBlockEntity
7+
import me.znepb.roadworks.util.RotateVoxelShape
8+
import net.minecraft.block.BlockWithEntity
9+
import net.minecraft.block.ShapeContext
10+
import net.minecraft.util.math.Direction
11+
import net.minecraft.util.shape.VoxelShape
12+
import org.joml.Vector3d
13+
14+
open class FourHeadSignalAttachment(signalType: SignalType, attachmentType: AttachmentType<*>, container: AttachmentContainerBlockEntity) : AbstractSignalAttachment(signalType, attachmentType, container) {
15+
companion object {
16+
val SIGNAL_SHAPE = BlockWithEntity.createCuboidShape(5.0, -1.0, 7.5, 11.0, 17.0, 8.5)
17+
const val HALF = 0.03125
18+
}
19+
20+
override fun getShape(context: ShapeContext): VoxelShape {
21+
val depthOffset = this.container.getDepthOffset()
22+
23+
return RotateVoxelShape.offsetFromDirectionXZ(
24+
RotateVoxelShape.rotateVoxelShape(SIGNAL_SHAPE, Direction.NORTH, this.facing),
25+
facing,
26+
Vector3d(0.0, 0.0, -depthOffset - HALF),
27+
Vector3d(depthOffset + HALF, 0.0, 0.0),
28+
Vector3d(0.0, 0.0, depthOffset + HALF),
29+
Vector3d(-depthOffset - HALF, 0.0, 0.0),
30+
)
31+
}
32+
33+
class FlashingYellowArrowSignal(container: AttachmentContainerBlockEntity) : FourHeadSignalAttachment(SignalType.FLASHING_YELLOW_ARROW_SIGNAL, RoadworksRegistry.ModAttachments.FLASHING_YELLOW_ARROW_SIGNAL_ATTACHMENT, container)
34+
}

src/main/kotlin/me/znepb/roadworks/signal/SignalLight.kt

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
11
package me.znepb.roadworks.signal
22

3-
enum class SignalLight(val light: String, val genericType: SignalLight, val isGeneric: Boolean, val signalDirection: SignalDirection) {
4-
GREEN("green", GREEN, true, SignalDirection.NONE),
5-
YELLOW("yellow", YELLOW, true, SignalDirection.NONE),
6-
RED("red", RED, true, SignalDirection.NONE),
7-
GREEN_LEFT("green_left", GREEN, false, SignalDirection.LEFT),
8-
YELLOW_LEFT("yellow_left", YELLOW, false, SignalDirection.LEFT),
9-
RED_LEFT("red_left", RED, false, SignalDirection.LEFT),
10-
GREEN_STRAIGHT("green_straight", GREEN, false, SignalDirection.STRAIGHT),
11-
YELLOW_STRAIGHT("yellow_straight", YELLOW, false, SignalDirection.STRAIGHT),
12-
RED_STRAIGHT("red_straight", RED, false, SignalDirection.STRAIGHT),
13-
GREEN_RIGHT("green_right", GREEN, false, SignalDirection.RIGHT),
14-
YELLOW_RIGHT("yellow_right", YELLOW, false, SignalDirection.RIGHT),
15-
RED_RIGHT("red_right", RED, false, SignalDirection.RIGHT),
16-
WALK("walk", GREEN, false, SignalDirection.NONE),
17-
DONT_WALK("dont_walk", RED, false, SignalDirection.NONE);
3+
enum class SignalLight(val light: String, val genericType: SignalLight, val isGeneric: Boolean, val signalDirection: SignalDirection, val flashing: Boolean, val useTextureOf: SignalLight?) {
4+
GREEN("green", GREEN, true, SignalDirection.NONE, false, null),
5+
YELLOW("yellow", YELLOW, true, SignalDirection.NONE, false, null),
6+
RED("red", RED, true, SignalDirection.NONE, false, null),
7+
GREEN_LEFT("green_left", GREEN, false, SignalDirection.LEFT, false, null),
8+
YELLOW_LEFT("yellow_left", YELLOW, false, SignalDirection.LEFT, false, null),
9+
RED_LEFT("red_left", RED, false, SignalDirection.LEFT, false, null),
10+
GREEN_STRAIGHT("green_straight", GREEN, false, SignalDirection.STRAIGHT, false, null),
11+
YELLOW_STRAIGHT("yellow_straight", YELLOW, false, SignalDirection.STRAIGHT, false, null),
12+
RED_STRAIGHT("red_straight", RED, false, SignalDirection.STRAIGHT, false, null),
13+
GREEN_RIGHT("green_right", GREEN, false, SignalDirection.RIGHT, false, null),
14+
YELLOW_RIGHT("yellow_right", YELLOW, false, SignalDirection.RIGHT, false, null),
15+
RED_RIGHT("red_right", RED, false, SignalDirection.RIGHT, false, null),
16+
WALK("walk", GREEN, false, SignalDirection.NONE, false, null),
17+
DONT_WALK("dont_walk", RED, false, SignalDirection.NONE, false, null),
18+
FLASHING_YELLOW_LEFT("yellow_flashing_left", YELLOW, false, SignalDirection.LEFT, true, YELLOW_LEFT);
1819

1920
enum class SignalDirection {
2021
STRAIGHT,

src/main/kotlin/me/znepb/roadworks/signal/SignalType.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,12 @@ enum class SignalType(
4040
SignalLight.GREEN_RIGHT,
4141
SignalLight.YELLOW_RIGHT,
4242
SignalLight.RED
43+
)),
44+
FLASHING_YELLOW_ARROW_SIGNAL("flashing_yellow_arrow_signal", listOf(
45+
SignalLight.GREEN_LEFT,
46+
SignalLight.FLASHING_YELLOW_LEFT,
47+
SignalLight.YELLOW_LEFT,
48+
SignalLight.RED_LEFT
4349
));
4450

4551
fun getReds(): List<SignalLight> {

0 commit comments

Comments
 (0)