@@ -2,9 +2,15 @@ package hiiragi283.ragium.client
2
2
3
3
import hiiragi283.ragium.api.RagiumAPI
4
4
import hiiragi283.ragium.api.content.HTContent
5
+ import hiiragi283.ragium.api.extension.energyPercent
5
6
import hiiragi283.ragium.api.extension.getOrNull
7
+ import hiiragi283.ragium.api.extension.longText
8
+ import hiiragi283.ragium.api.machine.HTMachineKey
6
9
import hiiragi283.ragium.api.machine.HTMachinePacket
10
+ import hiiragi283.ragium.api.machine.HTMachineRegistry
11
+ import hiiragi283.ragium.api.machine.block.HTMachineBlock
7
12
import hiiragi283.ragium.api.machine.block.HTMachineBlockEntityBase
13
+ import hiiragi283.ragium.api.machine.property.HTMachinePropertyKeys
8
14
import hiiragi283.ragium.client.extension.getBlockEntity
9
15
import hiiragi283.ragium.client.extension.registerClientReceiver
10
16
import hiiragi283.ragium.client.gui.*
@@ -21,13 +27,16 @@ import net.fabricmc.api.EnvType
21
27
import net.fabricmc.api.Environment
22
28
import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap
23
29
import net.fabricmc.fabric.api.client.item.v1.ItemTooltipCallback
30
+ import net.fabricmc.fabric.api.client.model.loading.v1.BlockStateResolver
24
31
import net.fabricmc.fabric.api.client.model.loading.v1.ModelLoadingPlugin
25
32
import net.fabricmc.fabric.api.client.model.loading.v1.ModelModifier
33
+ import net.fabricmc.fabric.api.client.model.loading.v1.ModelResolver
26
34
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking
27
35
import net.fabricmc.fabric.api.client.render.fluid.v1.FluidRenderHandlerRegistry
28
36
import net.fabricmc.fabric.api.client.render.fluid.v1.SimpleFluidRenderHandler
29
37
import net.fabricmc.fabric.api.client.rendering.v1.ColorProviderRegistry
30
38
import net.fabricmc.fabric.api.client.rendering.v1.EntityRendererRegistry
39
+ import net.fabricmc.fabric.api.transfer.v1.context.ContainerItemContext
31
40
import net.fabricmc.fabric.api.transfer.v1.fluid.FluidVariant
32
41
import net.minecraft.block.Block
33
42
import net.minecraft.block.BlockState
@@ -37,15 +46,23 @@ import net.minecraft.client.gui.screen.ingame.HandledScreens
37
46
import net.minecraft.client.render.RenderLayer
38
47
import net.minecraft.client.render.block.entity.BlockEntityRendererFactories
39
48
import net.minecraft.client.render.entity.FlyingItemEntityRenderer
49
+ import net.minecraft.client.render.model.ModelRotation
40
50
import net.minecraft.client.render.model.UnbakedModel
51
+ import net.minecraft.client.render.model.json.ModelVariant
52
+ import net.minecraft.client.render.model.json.WeightedUnbakedModel
41
53
import net.minecraft.inventory.Inventory
42
54
import net.minecraft.item.Item
43
55
import net.minecraft.item.ItemStack
44
56
import net.minecraft.item.tooltip.TooltipType
57
+ import net.minecraft.registry.Registries
58
+ import net.minecraft.state.property.Properties
45
59
import net.minecraft.text.Text
60
+ import net.minecraft.util.Formatting
46
61
import net.minecraft.util.Identifier
47
62
import net.minecraft.util.math.BlockPos
63
+ import net.minecraft.util.math.Direction
48
64
import net.minecraft.world.BlockRenderView
65
+ import team.reborn.energy.api.EnergyStorage
49
66
50
67
@Environment(EnvType .CLIENT )
51
68
object RagiumClient : ClientModInitializer {
@@ -58,7 +75,7 @@ object RagiumClient : ClientModInitializer {
58
75
registerEvents()
59
76
registerNetworks()
60
77
61
- RagiumAPI .log { info(" Ragium-Client initialized!" ) }
78
+ RagiumAPI .LOGGER . info(" Ragium-Client initialized!" )
62
79
}
63
80
64
81
// Blocks //
@@ -82,11 +99,11 @@ object RagiumClient : ClientModInitializer {
82
99
registerCutoutMipped(RagiumBlocks .ITEM_DISPLAY )
83
100
registerCutoutMipped(RagiumBlocks .POROUS_NETHERRACK )
84
101
// block entity renderer
102
+ BlockEntityRendererFactories .register(RagiumBlockEntityTypes .BEDROCK_MINER ) { HTBedrockMinerBlockEntityRenderer }
85
103
BlockEntityRendererFactories .register(RagiumBlockEntityTypes .MANUAL_FORGE ) { HTManualForgeBlockEntityRenderer }
86
104
BlockEntityRendererFactories .register(RagiumBlockEntityTypes .ITEM_DISPLAY ) { HTItemDisplayBlockEntityRenderer }
87
105
BlockEntityRendererFactories .register(RagiumBlockEntityTypes .LARGE_PROCESSOR ) { HTLargeProcessorBlockEntityRenderer }
88
106
89
- registerMachineRenderer(RagiumBlockEntityTypes .BEDROCK_MINER )
90
107
registerMachineRenderer(RagiumBlockEntityTypes .BLAST_FURNACE )
91
108
registerMachineRenderer(RagiumBlockEntityTypes .DISTILLATION_TOWER )
92
109
registerMachineRenderer(RagiumBlockEntityTypes .FLUID_DRILL )
@@ -150,21 +167,73 @@ object RagiumClient : ClientModInitializer {
150
167
@JvmStatic
151
168
private fun registerScreens () {
152
169
HandledScreens .register(RagiumScreenHandlerTypes .CHEMICAL_MACHINE , ::HTChemicalMachineScreen )
153
- HandledScreens .register(RagiumScreenHandlerTypes .FLUID_DRILL , ::HTFluidDrillScreen )
170
+ HandledScreens .register(RagiumScreenHandlerTypes .DISTILLATION_TOWER , ::HTDistillationTowerScreen )
154
171
HandledScreens .register(RagiumScreenHandlerTypes .LARGE_MACHINE , ::HTLargeMachineScreen )
155
172
HandledScreens .register(RagiumScreenHandlerTypes .SIMPLE_MACHINE , ::HTSimpleMachineScreen )
156
- HandledScreens .register(RagiumScreenHandlerTypes .STEAM , ::HTSteamGeneratorScreen )
173
+ HandledScreens .register(RagiumScreenHandlerTypes .SMALL_MACHINE , ::HTSmallMachineScreen )
157
174
}
158
175
159
176
// Events //
160
177
161
178
@JvmStatic
162
179
private fun registerEvents () {
163
180
ModelLoadingPlugin .register { context: ModelLoadingPlugin .Context ->
181
+ // register block state resolver
182
+ RagiumAPI .getInstance().machineRegistry.entryMap.forEach { (_: HTMachineKey , entry: HTMachineRegistry .Entry ) ->
183
+ entry.blocks.forEach { block: HTMachineBlock ->
184
+ context.registerBlockStateResolver(block) { context: BlockStateResolver .Context ->
185
+ Properties .HORIZONTAL_FACING .values.forEach { direction: Direction ->
186
+ RagiumBlockProperties .ACTIVE .values.forEach { isActive: Boolean ->
187
+ val state: BlockState = block.defaultState
188
+ .with (Properties .HORIZONTAL_FACING , direction)
189
+ .with (RagiumBlockProperties .ACTIVE , isActive)
190
+ val modelId: Identifier = when (isActive) {
191
+ true -> HTMachinePropertyKeys .ACTIVE_MODEL_ID
192
+ false -> HTMachinePropertyKeys .MODEL_ID
193
+ }.let (entry::getOrDefault)
194
+ val variant = ModelVariant (
195
+ modelId,
196
+ ModelRotation
197
+ .get(
198
+ 0 ,
199
+ when (direction) {
200
+ Direction .SOUTH -> 180
201
+ Direction .WEST -> 270
202
+ Direction .EAST -> 90
203
+ else -> 0
204
+ },
205
+ ).rotation,
206
+ false ,
207
+ 1 ,
208
+ )
209
+ val model = WeightedUnbakedModel (listOf (variant))
210
+ context.setModel(state, model)
211
+ }
212
+ }
213
+ }
214
+ }
215
+ }
164
216
// register item model resolver
217
+ context.resolveModel().register { context1: ModelResolver .Context ->
218
+ val id: Identifier = context1.id() ? : return @register null
219
+ if (id.namespace != RagiumAPI .MOD_ID ) return @register null
220
+ val item: Item = Registries .ITEM .get(id.withPath { it.removePrefix(" item/" ) })
221
+ item.components
222
+ .get(HTMachineKey .COMPONENT_TYPE )
223
+ ?.let (HTMachineKey ::entry)
224
+ ?.getOrDefault(HTMachinePropertyKeys .MODEL_ID )
225
+ ?.let { modelId: Identifier ->
226
+ when (modelId) {
227
+ RagiumAPI .id(" block/dynamic_processor" ) -> HTProcessorMachineModel .INACTIVE
228
+ RagiumAPI .id(" block/active_dynamic_processor" ) -> HTProcessorMachineModel .ACTIVE
229
+ else -> context1.getOrLoadModel(modelId)
230
+ }
231
+ }
232
+ }
165
233
context.modifyModelOnLoad().register onLoad@{ original: UnbakedModel , _: ModelModifier .OnLoad .Context ->
166
234
when {
167
- RagiumAPI .id(" block/dynamic_processor" ) in original.modelDependencies -> HTProcessorMachineModel
235
+ RagiumAPI .id(" block/dynamic_processor" ) in original.modelDependencies -> HTProcessorMachineModel .INACTIVE
236
+ RagiumAPI .id(" block/active_dynamic_processor" ) in original.modelDependencies -> HTProcessorMachineModel .ACTIVE
168
237
RagiumAPI .id(" item/fluid_cube" ) in original.modelDependencies -> HTFluidCubeModel
169
238
else -> original
170
239
}
@@ -173,11 +242,24 @@ object RagiumClient : ClientModInitializer {
173
242
RagiumAPI .id(" block/generator" ),
174
243
RagiumAPI .id(" block/solar_generator" ),
175
244
)
245
+ RagiumAPI .LOGGER .info(" Loaded runtime models!" )
176
246
}
177
247
ItemTooltipCallback .EVENT .register(
178
248
RagiumAPI .id(" description" ),
179
249
) { stack: ItemStack , _: Item .TooltipContext , _: TooltipType , tooltips: MutableList <Text > ->
180
- stack.get(RagiumComponentTypes .DESCRIPTION )?.let (tooltips::add)
250
+ val texts: List <Text > = stack.get(RagiumComponentTypes .DESCRIPTION )
251
+ ? : ContainerItemContext .withConstant(stack).find(EnergyStorage .ITEM )?.let { storage: EnergyStorage ->
252
+ listOf (
253
+ Text .literal(" - Stored Energy: ${longText(storage.amount).string} E (${storage.energyPercent} %)" ),
254
+ )
255
+ }
256
+ ? : listOf ()
257
+ if (texts.isEmpty()) return @register
258
+ if (Screen .hasControlDown()) {
259
+ texts.map(Text ::copy).map { it.formatted(Formatting .AQUA ) }.forEach(tooltips::add)
260
+ } else {
261
+ tooltips.add(Text .translatable(RagiumTranslationKeys .PRESS_CTRL ).formatted(Formatting .YELLOW ))
262
+ }
181
263
}
182
264
}
183
265
0 commit comments