Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -52,3 +52,7 @@ replay_*.log
# git-hooks.nix

.pre-commit-config.yaml

# stonecutter

versions/
7 changes: 1 addition & 6 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -111,11 +111,6 @@ loom {
}

dependencies {
val yarnMappings = when (mcVersion) {
"1.21.8" -> "1.21.8+build.1"
"1.21.11" -> "1.21.11+build.5"
else -> error("Unsupported MC version: $mcVersion")
}
val fabricApiVersion = when (mcVersion) {
"1.21.8" -> "0.132.0+1.21.8"
"1.21.11" -> "0.141.3+1.21.11"
Expand Down Expand Up @@ -143,7 +138,7 @@ dependencies {
}

minecraft("com.mojang:minecraft:$mcVersion")
mappings("net.fabricmc:yarn:$yarnMappings:v2")
mappings(loom.officialMojangMappings())
modImplementation(libs.fabric.loader)

modImplementation("net.fabricmc.fabric-api:fabric-api:$fabricApiVersion")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
package net.turtton.connectedtank.mixin.client;

import net.minecraft.client.MinecraftClient;
import net.minecraft.client.Minecraft;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

@Mixin(MinecraftClient.class)
@Mixin(Minecraft.class)
public class ExampleClientMixin {
@Inject(at = @At("HEAD"), method = "run")
private void init(CallbackInfo info) {
// This code is injected into the start of MinecraftClient.run()V
// This code is injected into the start of Minecraft.run()V
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ import net.fabricmc.api.ClientModInitializer
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking
import net.fabricmc.fabric.api.client.rendering.v1.BlockRenderLayerMap
import net.minecraft.client.render.BlockRenderLayer
import net.minecraft.client.render.block.entity.BlockEntityRendererFactories
import net.minecraft.client.renderer.chunk.ChunkSectionLayer
import net.minecraft.client.renderer.blockentity.BlockEntityRenderers
import net.turtton.connectedtank.block.CTBlockEntityTypes
import net.turtton.connectedtank.block.CTBlocks
import net.turtton.connectedtank.block.ConnectedTankBlockEntityRenderer
Expand All @@ -21,13 +21,13 @@ object ConnectedTankClient : ClientModInitializer {
override fun onInitializeClient() {
CTClientConfig.load()

CTBlocks.ALL_TANKS.forEach { BlockRenderLayerMap.putBlock(it, BlockRenderLayer.CUTOUT) }
CTBlocks.ALL_TANKS.forEach { BlockRenderLayerMap.putBlock(it, ChunkSectionLayer.CUTOUT) }
//? if >=1.21.11 {
/*BlockEntityRendererFactories.register<_, ConnectedTankRenderState>(
/*BlockEntityRenderers.register<_, ConnectedTankRenderState>(
CTBlockEntityTypes.CONNECTED_TANK,
) { context -> ConnectedTankBlockEntityRenderer(context) }*/
//?} else {
BlockEntityRendererFactories.register(
BlockEntityRenderers.register(
CTBlockEntityTypes.CONNECTED_TANK,
) { context -> ConnectedTankBlockEntityRenderer(context) }
//?}
Expand Down
233 changes: 124 additions & 109 deletions src/client/kotlin/net/turtton/connectedtank/ConnectedTankDataGenerator.kt

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -4,47 +4,47 @@ import kotlin.math.max
import net.fabricmc.fabric.api.transfer.v1.client.fluid.FluidVariantRendering
//? if >=1.21.11 {
/*import net.fabricmc.fabric.api.transfer.v1.fluid.FluidVariant
import net.minecraft.client.render.block.entity.BlockEntityRenderer
import net.minecraft.client.render.block.entity.BlockEntityRendererFactory
import net.minecraft.client.render.block.entity.state.BlockEntityRenderState
import net.minecraft.client.render.command.ModelCommandRenderer.CrumblingOverlayCommand
import net.minecraft.client.render.command.OrderedRenderCommandQueue
import net.minecraft.client.render.state.CameraRenderState
import net.minecraft.client.texture.Sprite
import net.minecraft.client.util.math.MatrixStack
import net.minecraft.util.math.BlockPos
import net.minecraft.util.math.Vec3d
import net.minecraft.client.renderer.blockentity.BlockEntityRenderer
import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider
import net.minecraft.client.renderer.blockentity.state.BlockEntityRenderState
import net.minecraft.client.renderer.feature.ModelFeatureRenderer
import net.minecraft.client.renderer.SubmitNodeCollector
import net.minecraft.client.renderer.state.CameraRenderState
import net.minecraft.client.renderer.texture.TextureAtlasSprite
import com.mojang.blaze3d.vertex.PoseStack
import net.minecraft.core.BlockPos
import net.minecraft.world.phys.Vec3
import net.turtton.connectedtank.config.CTClientConfig
import net.turtton.connectedtank.config.CTClientConfig.RenderQuality
import net.turtton.connectedtank.render.FluidRenderHelper
import net.turtton.connectedtank.render.NeighborMask
import net.turtton.connectedtank.render.WaveParams

class ConnectedTankRenderState : BlockEntityRenderState() {
var sprite: Sprite? = null
var sprite: TextureAtlasSprite? = null
var argb: Int = 0
var localFillLevel: Float = 0f
var wave: WaveParams = WaveParams(animTime = 0f, gridSize = 4)
var neighbors: NeighborMask = NeighborMask()
}

class ConnectedTankBlockEntityRenderer(
@Suppress("UNUSED_PARAMETER") context: BlockEntityRendererFactory.Context,
@Suppress("UNUSED_PARAMETER") context: BlockEntityRendererProvider.Context,
) : BlockEntityRenderer<ConnectedTankBlockEntity, ConnectedTankRenderState> {
companion object {
private const val DECAY_TICKS = 60f
}

override fun createRenderState(): ConnectedTankRenderState = ConnectedTankRenderState()

override fun updateRenderState(
override fun extractRenderState(
entity: ConnectedTankBlockEntity,
state: ConnectedTankRenderState,
tickDelta: Float,
cameraPos: Vec3d,
crumbling: CrumblingOverlayCommand?,
cameraPos: Vec3,
crumbling: ModelFeatureRenderer.CrumblingOverlay?,
) {
super.updateRenderState(entity, state, tickDelta, cameraPos, crumbling)
super.extractRenderState(entity, state, tickDelta, cameraPos, crumbling)

state.localFillLevel = entity.localFillLevel
if (entity.localFillLevel <= 0f || entity.fluidVariant.isBlank) {
Expand All @@ -56,8 +56,8 @@ class ConnectedTankBlockEntityRenderer(
val color = FluidVariantRendering.getColor(entity.fluidVariant)
state.argb = (0xFF shl 24) or (color and 0x00FFFFFF)

val world = entity.world
val pos = entity.pos
val world = entity.level
val pos = entity.blockPos
val myGroupId = entity.groupId

fun sameGroupNeighbor(neighborPos: BlockPos): ConnectedTankBlockEntity? {
Expand All @@ -66,8 +66,8 @@ class ConnectedTankBlockEntityRenderer(
return if (neighbor.groupId == myGroupId) neighbor else null
}

val neighborDown = sameGroupNeighbor(pos.down())
val neighborUp = sameGroupNeighbor(pos.up())
val neighborDown = sameGroupNeighbor(pos.below())
val neighborUp = sameGroupNeighbor(pos.above())

// 垂直: 下タンクが満杯で同一グループのときのみ連続とみなす
val hasDown = neighborDown != null && neighborDown.localFillLevel >= 1.0f
Expand All @@ -89,7 +89,7 @@ class ConnectedTankBlockEntityRenderer(
)

val quality = CTClientConfig.instance.renderQuality
val worldTime = world?.time?.toFloat() ?: 0f
val worldTime = world?.gameTime?.toFloat() ?: 0f
val elapsedTicks = worldTime - entity.waveStartTick.toFloat()
val decayFactor = if (quality == RenderQuality.LOW) 0f else max(0f, 1f - elapsedTicks / DECAY_TICKS)
val animTime = worldTime + tickDelta
Expand All @@ -109,16 +109,16 @@ class ConnectedTankBlockEntityRenderer(
)
}

override fun render(
override fun submit(
state: ConnectedTankRenderState,
matrices: MatrixStack,
queue: OrderedRenderCommandQueue,
matrices: PoseStack,
queue: SubmitNodeCollector,
cameraState: CameraRenderState,
) {
val sprite = state.sprite ?: return
if (state.localFillLevel <= 0f) return

matrices.push()
matrices.pushPose()
FluidRenderHelper.renderFluid(
queue,
matrices,
Expand All @@ -128,25 +128,25 @@ class ConnectedTankBlockEntityRenderer(
state.wave,
state.neighbors,
)
matrices.pop()
matrices.popPose()
}
}
*/
//?} else {
import net.minecraft.client.render.VertexConsumerProvider
import net.minecraft.client.render.block.entity.BlockEntityRenderer
import net.minecraft.client.render.block.entity.BlockEntityRendererFactory
import net.minecraft.client.util.math.MatrixStack
import net.minecraft.util.math.BlockPos
import net.minecraft.util.math.Vec3d
import net.minecraft.client.renderer.MultiBufferSource
import net.minecraft.client.renderer.blockentity.BlockEntityRenderer
import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider
import com.mojang.blaze3d.vertex.PoseStack
import net.minecraft.core.BlockPos
import net.minecraft.world.phys.Vec3
import net.turtton.connectedtank.config.CTClientConfig
import net.turtton.connectedtank.config.CTClientConfig.RenderQuality
import net.turtton.connectedtank.render.FluidRenderHelper
import net.turtton.connectedtank.render.NeighborMask
import net.turtton.connectedtank.render.WaveParams

class ConnectedTankBlockEntityRenderer(
@Suppress("UNUSED_PARAMETER") context: BlockEntityRendererFactory.Context,
@Suppress("UNUSED_PARAMETER") context: BlockEntityRendererProvider.Context,
) : BlockEntityRenderer<ConnectedTankBlockEntity> {
companion object {
private const val DECAY_TICKS = 60f
Expand All @@ -155,20 +155,20 @@ class ConnectedTankBlockEntityRenderer(
override fun render(
entity: ConnectedTankBlockEntity,
tickDelta: Float,
matrices: MatrixStack,
vertexConsumers: VertexConsumerProvider,
matrices: PoseStack,
vertexConsumers: MultiBufferSource,
light: Int,
overlay: Int,
cameraPos: Vec3d,
cameraPos: Vec3,
) {
if (entity.localFillLevel <= 0f || entity.fluidVariant.isBlank) return

val sprite = FluidVariantRendering.getSprite(entity.fluidVariant) ?: return
val color = FluidVariantRendering.getColor(entity.fluidVariant)
val argb = (0xFF shl 24) or (color and 0x00FFFFFF)

val world = entity.world
val pos = entity.pos
val world = entity.level
val pos = entity.blockPos

val myGroupId = entity.groupId
fun sameGroupNeighbor(neighborPos: BlockPos): ConnectedTankBlockEntity? {
Expand All @@ -177,8 +177,8 @@ class ConnectedTankBlockEntityRenderer(
return if (neighbor.groupId == myGroupId) neighbor else null
}

val neighborDown = sameGroupNeighbor(pos.down())
val neighborUp = sameGroupNeighbor(pos.up())
val neighborDown = sameGroupNeighbor(pos.below())
val neighborUp = sameGroupNeighbor(pos.above())

// 垂直: 下タンクが満杯で同一グループのときのみ連続とみなす
val hasDown = neighborDown != null && neighborDown.localFillLevel >= 1.0f
Expand All @@ -190,10 +190,10 @@ class ConnectedTankBlockEntityRenderer(
val hasWest = sameGroupNeighbor(pos.west())?.let { it.localFillLevel > 0f } == true
val hasEast = sameGroupNeighbor(pos.east())?.let { it.localFillLevel > 0f } == true

matrices.push()
matrices.pushPose()

val quality = CTClientConfig.instance.renderQuality
val worldTime = world?.time?.toFloat() ?: 0f
val worldTime = world?.gameTime?.toFloat() ?: 0f
val elapsedTicks = worldTime - entity.waveStartTick.toFloat()
val decayFactor = if (quality == RenderQuality.LOW) 0f else max(0f, 1f - elapsedTicks / DECAY_TICKS)

Expand Down Expand Up @@ -228,7 +228,7 @@ class ConnectedTankBlockEntityRenderer(
),
)

matrices.pop()
matrices.popPose()
}
}
//?}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package net.turtton.connectedtank.config

import com.terraformersmc.modmenu.api.ConfigScreenFactory
import com.terraformersmc.modmenu.api.ModMenuApi
import net.minecraft.client.gui.screen.Screen
import net.minecraft.client.gui.screens.Screen
import net.turtton.connectedtank.ConnectedTank
import net.turtton.connectedtank.block.TankTier
import net.turtton.connectedtank.network.ConfigSyncPayload
Expand All @@ -20,8 +20,8 @@ class CTConfigScreen : ModMenuApi {

private object CTConfigScreenBuilder {
fun createConfigScreen(parent: Screen?): Screen {
val client = net.minecraft.client.MinecraftClient.getInstance()
val isExternalServer = client.world != null && !client.isInSingleplayer
val client = net.minecraft.client.Minecraft.getInstance()
val isExternalServer = client.level != null && !client.isLocalServer

val serverConfig = if (isExternalServer) {
SyncedServerConfig.syncedConfig ?: CTServerConfig.instance
Expand All @@ -30,10 +30,10 @@ private object CTConfigScreenBuilder {
}

val tankCapacityOption = dev.isxander.yacl3.api.Option.createBuilder<Int>()
.name(net.minecraft.text.Text.translatable("config.connectedtank.server.tankBucketCapacity"))
.name(net.minecraft.network.chat.Component.translatable("config.connectedtank.server.tankBucketCapacity"))
.description(
dev.isxander.yacl3.api.OptionDescription.of(
net.minecraft.text.Text.translatable("config.connectedtank.server.tankBucketCapacity.description"),
net.minecraft.network.chat.Component.translatable("config.connectedtank.server.tankBucketCapacity.description"),
),
)
.binding(
Expand All @@ -52,10 +52,10 @@ private object CTConfigScreenBuilder {
val clientConfig = CTClientConfig.instance

val renderQualityOption = dev.isxander.yacl3.api.Option.createBuilder<CTClientConfig.RenderQuality>()
.name(net.minecraft.text.Text.translatable("config.connectedtank.client.renderQuality"))
.name(net.minecraft.network.chat.Component.translatable("config.connectedtank.client.renderQuality"))
.description(
dev.isxander.yacl3.api.OptionDescription.of(
net.minecraft.text.Text.translatable("config.connectedtank.client.renderQuality.description"),
net.minecraft.network.chat.Component.translatable("config.connectedtank.client.renderQuality.description"),
),
)
.binding(
Expand All @@ -71,10 +71,10 @@ private object CTConfigScreenBuilder {

val tierMultiplierOptions = TankTier.entries.map { tier ->
dev.isxander.yacl3.api.Option.createBuilder<Int>()
.name(net.minecraft.text.Text.literal("${tier.name} multiplier"))
.name(net.minecraft.network.chat.Component.literal("${tier.name} multiplier"))
.description(
dev.isxander.yacl3.api.OptionDescription.of(
net.minecraft.text.Text.literal("Capacity multiplier for ${tier.name} tier (default: ${tier.defaultMultiplier})"),
net.minecraft.network.chat.Component.literal("Capacity multiplier for ${tier.name} tier (default: ${tier.defaultMultiplier})"),
),
)
.binding(
Expand All @@ -92,25 +92,25 @@ private object CTConfigScreenBuilder {
}

val serverCategoryBuilder = dev.isxander.yacl3.api.ConfigCategory.createBuilder()
.name(net.minecraft.text.Text.translatable("config.connectedtank.category.server"))
.name(net.minecraft.network.chat.Component.translatable("config.connectedtank.category.server"))
.option(tankCapacityOption)
for (option in tierMultiplierOptions) {
serverCategoryBuilder.option(option)
}

return dev.isxander.yacl3.api.YetAnotherConfigLib.createBuilder()
.title(net.minecraft.text.Text.translatable("config.connectedtank.title"))
.title(net.minecraft.network.chat.Component.translatable("config.connectedtank.title"))
.category(serverCategoryBuilder.build())
.category(
dev.isxander.yacl3.api.ConfigCategory.createBuilder()
.name(net.minecraft.text.Text.translatable("config.connectedtank.category.client"))
.name(net.minecraft.network.chat.Component.translatable("config.connectedtank.category.client"))
.option(renderQualityOption)
.build(),
)
.save {
if (!isExternalServer) {
CTServerConfig.instance.save()
client.server?.let { server ->
client.singleplayerServer?.let { server ->
server.execute { ConfigSyncPayload.broadcastToAll(server) }
}
}
Expand Down
Loading
Loading