Skip to content

Commit 9fa660d

Browse files
committed
feat: catwalks, start wall containers, new symbols, more
1 parent eeee1f7 commit 9fa660d

File tree

54 files changed

+1243
-440
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+1243
-440
lines changed

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import me.znepb.roadworks.init.ModelLoader
1010
import me.znepb.roadworks.item.SignEditorScreenHandler
1111
import me.znepb.roadworks.network.SyncContentPacketClient
1212
import me.znepb.roadworks.render.PostContainerRenderer
13+
import me.znepb.roadworks.render.WallContainerRenderer
1314
import me.znepb.roadworks.render.attachments.*
1415
import me.znepb.roadworks.util.PostThickness
1516
import net.fabricmc.api.ClientModInitializer
@@ -21,9 +22,7 @@ import net.minecraft.client.MinecraftClient
2122
import net.minecraft.client.gui.screen.ingame.HandledScreens
2223
import net.minecraft.client.render.RenderLayer
2324
import net.minecraft.client.render.block.entity.BlockEntityRendererFactories
24-
import net.minecraft.item.BlockItem
2525
import net.minecraft.item.ItemStack
26-
import net.minecraft.nbt.NbtCompound
2726
import org.slf4j.LoggerFactory
2827

2928
object RoadworksClient : ClientModInitializer {
@@ -90,7 +89,8 @@ object RoadworksClient : ClientModInitializer {
9089
logger.info("Registering attachment renderers")
9190
attachmentRenderers = AttachmentRendererFactories.reload()
9291

93-
BlockEntityRendererFactories.register(RoadworksRegistry.ModBlockEntities.CONTAINER_BLOCK_ENTITY, ::PostContainerRenderer)
92+
BlockEntityRendererFactories.register(RoadworksRegistry.ModBlockEntities.POST_CONTAINER_BLOCK_ENTITY, ::PostContainerRenderer)
93+
BlockEntityRendererFactories.register(RoadworksRegistry.ModBlockEntities.WALL_CONTAINER_BLOCK_ENTITY, ::WallContainerRenderer)
9494

9595
HandledScreens.register(RoadworksRegistry.ModScreens.SIGN_EDITOR_SCREEN_HANDLER, ::SignEditorScreen)
9696

@@ -197,7 +197,10 @@ object RoadworksClient : ClientModInitializer {
197197
RoadworksRegistry.ModBlocks.YELLOW_L_LEFT,
198198
RoadworksRegistry.ModBlocks.YELLOW_L_RIGHT,
199199
RoadworksRegistry.ModBlocks.YELLOW_L_SHORT_LEFT,
200-
RoadworksRegistry.ModBlocks.YELLOW_L_SHORT_RIGHT
200+
RoadworksRegistry.ModBlocks.YELLOW_L_SHORT_RIGHT,
201+
202+
RoadworksRegistry.ModBlocks.WALL_CONTAINER,
203+
RoadworksRegistry.ModBlocks.CATWALK
201204
)
202205

203206
ModelLoader()

src/client/kotlin/me/znepb/roadworks/gui/SignEditorScreen.kt

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class SignEditorScreen(handler: SignEditorScreenHandler, playerInventory: Player
4848
}
4949

5050
override fun init() {
51-
this.backgroundHeight = 176
51+
this.backgroundHeight = 201
5252

5353
super.init()
5454

@@ -72,7 +72,7 @@ class SignEditorScreen(handler: SignEditorScreenHandler, playerInventory: Player
7272
val x = (index % 7) * 24
7373
val y = (floor(index.toDouble() / 7.0) * 24).toInt()
7474
val button = ButtonWidget.builder(Text.literal("")) {
75-
this.nameField.write(charset.char)
75+
this.nameField.write(charset.symbol)
7676
}
7777
.dimensions(this.x + x + 6, this.nameField.y + this.nameField.height + y + 6, 20, 20)
7878
.build()
@@ -185,10 +185,14 @@ class SignEditorScreen(handler: SignEditorScreenHandler, playerInventory: Player
185185
Charset.DR,
186186
Charset.PK,
187187
Charset.HWY,
188-
Charset.ARROW_RIGHT,
189-
Charset.ARROW_LEFT,
190188
Charset.ARROW_UP,
189+
Charset.ARROW_UR,
190+
Charset.ARROW_RIGHT,
191+
Charset.ARROW_DR,
191192
Charset.ARROW_DOWN,
193+
Charset.ARROW_DL,
194+
Charset.ARROW_LEFT,
195+
Charset.ARROW_UL,
192196
Charset.FORBIDDEN,
193197
Charset.WARNING,
194198
Charset.ND,
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package me.znepb.roadworks.render
2+
3+
import me.znepb.roadworks.RoadworksClient
4+
import me.znepb.roadworks.container.AttachmentContainerBlockEntity
5+
import me.znepb.roadworks.container.PostContainer
6+
import me.znepb.roadworks.container.PostContainerBlockEntity
7+
import net.minecraft.block.BlockState
8+
import net.minecraft.block.ShapeContext
9+
import net.minecraft.block.entity.BlockEntity
10+
import net.minecraft.client.MinecraftClient
11+
import net.minecraft.client.render.VertexConsumer
12+
import net.minecraft.client.render.VertexConsumerProvider
13+
import net.minecraft.client.render.WorldRenderer
14+
import net.minecraft.client.render.block.entity.BlockEntityRenderer
15+
import net.minecraft.client.render.block.entity.BlockEntityRendererFactory
16+
import net.minecraft.client.util.math.MatrixStack
17+
import net.minecraft.entity.Entity
18+
import net.minecraft.util.hit.BlockHitResult
19+
import net.minecraft.util.hit.HitResult
20+
import net.minecraft.util.math.BlockPos
21+
import net.minecraft.world.World
22+
import org.joml.Vector3d
23+
24+
abstract class ContainerRenderer<T : BlockEntity>(private val ctx: BlockEntityRendererFactory.Context) : BlockEntityRenderer<T> {
25+
fun renderOutline(
26+
blockEntity: PostContainerBlockEntity,
27+
matrices: MatrixStack,
28+
vertexConsumer: VertexConsumer,
29+
entity: Entity,
30+
world: World,
31+
cameraX: Double,
32+
cameraY: Double,
33+
cameraZ: Double,
34+
pos: BlockPos,
35+
state: BlockState
36+
) {
37+
val block = state.block
38+
if (block !is PostContainer) return
39+
val client: MinecraftClient = MinecraftClient.getInstance()
40+
val hit = client.crosshairTarget
41+
42+
if (hit?.type == HitResult.Type.BLOCK) {
43+
val blockHit = hit as BlockHitResult
44+
val shapeContext = ShapeContext.of(entity)
45+
if (blockHit.blockPos != pos) return
46+
47+
val hitAttachment = blockEntity.getAttachmentHit(blockHit)
48+
49+
if (hitAttachment != null) {
50+
WorldRenderer.drawCuboidShapeOutline(
51+
matrices,
52+
vertexConsumer,
53+
hitAttachment.getShape(shapeContext),
54+
pos.x.toDouble() - cameraX,
55+
pos.y.toDouble() - cameraY,
56+
pos.z.toDouble() - cameraZ,
57+
0.0f,
58+
0.0f,
59+
0.0f,
60+
0.4f
61+
)
62+
return
63+
}
64+
65+
val shape = block.getShape(world, pos, shapeContext)
66+
WorldRenderer.drawCuboidShapeOutline(
67+
matrices,
68+
vertexConsumer,
69+
shape,
70+
pos.x.toDouble() - cameraX,
71+
pos.y.toDouble() - cameraY,
72+
pos.z.toDouble() - cameraZ,
73+
0.0f,
74+
0.0f,
75+
0.0f,
76+
0.4f
77+
)
78+
}
79+
}
80+
81+
fun renderAttachments(
82+
blockEntity: AttachmentContainerBlockEntity,
83+
tickDelta: Float,
84+
matrices: MatrixStack,
85+
vertexConsumers: VertexConsumerProvider,
86+
light: Int,
87+
overlay: Int,
88+
offset: Vector3d
89+
) {
90+
blockEntity.attachments.forEach {
91+
RoadworksClient.attachmentRenderers[it.type]?.render(
92+
it, blockEntity, tickDelta, matrices, vertexConsumers, light, overlay, offset
93+
)
94+
}
95+
}
96+
}

src/client/kotlin/me/znepb/roadworks/render/PostContainerRenderer.kt

Lines changed: 4 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,11 @@ import net.minecraft.util.hit.HitResult
2222
import net.minecraft.util.math.BlockPos
2323
import net.minecraft.util.math.Direction
2424
import net.minecraft.world.World
25+
import org.joml.Vector3d
2526

2627

27-
class PostContainerRenderer(private val ctx: BlockEntityRendererFactory.Context) : BlockEntityRenderer<PostContainerBlockEntity> {
28+
class PostContainerRenderer(private val ctx: BlockEntityRendererFactory.Context) :
29+
ContainerRenderer<PostContainerBlockEntity>(ctx) {
2830
companion object {
2931
val POST_THIN_EXT_MODEL = ModId("block/post_thin_extension")
3032
val POST_THIN_FOOTER_MODEL = ModId("block/post_thin_footer")
@@ -78,63 +80,6 @@ class PostContainerRenderer(private val ctx: BlockEntityRendererFactory.Context)
7880
matrices.pop()
7981
}
8082

81-
fun renderOutline(
82-
blockEntity: PostContainerBlockEntity,
83-
matrices: MatrixStack,
84-
vertexConsumer: VertexConsumer,
85-
entity: Entity,
86-
world: World,
87-
cameraX: Double,
88-
cameraY: Double,
89-
cameraZ: Double,
90-
pos: BlockPos,
91-
state: BlockState
92-
) {
93-
val block = state.block
94-
if(block !is PostContainer) return
95-
val client: MinecraftClient = MinecraftClient.getInstance()
96-
val hit = client.crosshairTarget
97-
98-
if(hit?.type == HitResult.Type.BLOCK) {
99-
val blockHit = hit as BlockHitResult
100-
val shapeContext = ShapeContext.of(entity)
101-
if(blockHit.blockPos != pos) return
102-
103-
val hitAttachment = blockEntity.getAttachmentHit(blockHit)
104-
105-
if(hitAttachment != null) {
106-
WorldRenderer.drawCuboidShapeOutline(
107-
matrices,
108-
vertexConsumer,
109-
hitAttachment.getShape(shapeContext),
110-
pos.x.toDouble() - cameraX,
111-
pos.y.toDouble() - cameraY,
112-
pos.z.toDouble() - cameraZ,
113-
0.0f,
114-
0.0f,
115-
0.0f,
116-
0.4f
117-
)
118-
return
119-
}
120-
121-
// Draw post shape if didn't hit attachment shape
122-
val shape = block.getShape(world, pos, shapeContext)
123-
WorldRenderer.drawCuboidShapeOutline(
124-
matrices,
125-
vertexConsumer,
126-
shape,
127-
pos.x.toDouble() - cameraX,
128-
pos.y.toDouble() - cameraY,
129-
pos.z.toDouble() - cameraZ,
130-
0.0f,
131-
0.0f,
132-
0.0f,
133-
0.4f
134-
)
135-
}
136-
}
137-
13883
override fun render(
13984
blockEntity: PostContainerBlockEntity,
14085
tickDelta: Float,
@@ -188,10 +133,6 @@ class PostContainerRenderer(private val ctx: BlockEntityRendererFactory.Context)
188133
addSideThickness(blockEntity, blockEntity.cachedState, Direction.DOWN, blockEntity.down, matrices, buffer, light, overlay)
189134
}
190135

191-
blockEntity.attachments.forEach {
192-
RoadworksClient.attachmentRenderers[it.type]?.render(
193-
it, blockEntity, tickDelta, matrices, vertexConsumers, light, overlay
194-
)
195-
}
136+
this.renderAttachments(blockEntity, tickDelta, matrices, vertexConsumers, light, overlay, Vector3d(0.0, 0.0, blockEntity.thickness.thickness / 2))
196137
}
197138
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package me.znepb.roadworks.render
2+
3+
import me.znepb.roadworks.container.WallContainerBlockEntity
4+
import net.minecraft.client.render.VertexConsumerProvider
5+
import net.minecraft.client.render.block.entity.BlockEntityRendererFactory
6+
import net.minecraft.client.util.math.MatrixStack
7+
import org.joml.Vector3d
8+
9+
class WallContainerRenderer(private val ctx: BlockEntityRendererFactory.Context) :
10+
ContainerRenderer<WallContainerBlockEntity>(ctx) {
11+
override fun render(
12+
entity: WallContainerBlockEntity,
13+
tickDelta: Float,
14+
matrices: MatrixStack,
15+
vertexConsumers: VertexConsumerProvider,
16+
light: Int,
17+
overlay: Int
18+
) {
19+
this.renderAttachments(entity, tickDelta, matrices, vertexConsumers, light, overlay, Vector3d(0.0, 0.0, -0.5))
20+
}
21+
}

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,25 @@
11
package me.znepb.roadworks.render.attachments
22

33
import me.znepb.roadworks.attachment.Attachment
4+
import me.znepb.roadworks.container.AttachmentContainerBlockEntity
45
import me.znepb.roadworks.container.PostContainerBlockEntity
6+
import me.znepb.roadworks.render.ContainerRenderer
57
import net.minecraft.client.render.VertexConsumerProvider
68
import net.minecraft.client.util.math.MatrixStack
79
import net.minecraft.util.math.Direction
10+
import org.joml.Vector3d
11+
import org.joml.Vector3f
812

913
interface AttachmentRenderer<T : Attachment> {
1014
fun render(
1115
attachment: T,
12-
blockEntity: PostContainerBlockEntity,
16+
blockEntity: AttachmentContainerBlockEntity,
1317
tickDelta: Float,
1418
matrices: MatrixStack,
1519
vertexConsumers: VertexConsumerProvider,
1620
light: Int,
17-
overlay: Int
21+
overlay: Int,
22+
offset: Vector3d
1823
)
1924

2025
companion object {

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

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,14 @@ package me.znepb.roadworks.render.attachments
22

33
import me.znepb.roadworks.RoadworksMain
44
import me.znepb.roadworks.attachment.AttachmentPosition
5+
import me.znepb.roadworks.container.AttachmentContainerBlockEntity
56
import me.znepb.roadworks.container.PostContainerBlockEntity
7+
import me.znepb.roadworks.render.ContainerRenderer
68
import me.znepb.roadworks.signal.BeaconAttachment
79
import me.znepb.roadworks.util.RenderUtils
810
import net.minecraft.client.render.VertexConsumerProvider
911
import net.minecraft.client.util.math.MatrixStack
12+
import org.joml.Vector3d
1013

1114
class BeaconAttachmentRenderer : AttachmentRenderer<BeaconAttachment> {
1215
companion object {
@@ -15,14 +18,14 @@ class BeaconAttachmentRenderer : AttachmentRenderer<BeaconAttachment> {
1518

1619
override fun render(
1720
attachment: BeaconAttachment,
18-
blockEntity: PostContainerBlockEntity,
21+
blockEntity: AttachmentContainerBlockEntity,
1922
tickDelta: Float,
2023
matrices: MatrixStack,
2124
vertexConsumers: VertexConsumerProvider,
2225
light: Int,
23-
overlay: Int
26+
overlay: Int,
27+
offset: Vector3d
2428
) {
25-
val thickness = blockEntity.thickness.thickness
2629
val renderer = SignalRenderer(attachment, matrices, vertexConsumers, light, overlay)
2730

2831
val offsetHeight = when(attachment.position) {
@@ -33,10 +36,10 @@ class BeaconAttachmentRenderer : AttachmentRenderer<BeaconAttachment> {
3336

3437
matrices.push()
3538
AttachmentRenderer.translateForCenter(matrices, attachment.facing.opposite, 0)
36-
matrices.translate(0.0, offsetHeight, -thickness / 2)
39+
matrices.translate(0.0, offsetHeight, -offset.z)
3740
RenderUtils.renderModel(matrices, renderer.buffer, light, overlay, SIGNAL_FRAME_1, null)
3841
matrices.pop()
3942

40-
renderer.renderSignal(attachment.signalType.lights[0], 0.0, offsetHeight)
43+
renderer.renderSignal(attachment.signalType.lights[0], 0.0, offsetHeight, offset)
4144
}
4245
}

0 commit comments

Comments
 (0)