From e9885940e24f60e2998963e9723613d96378897e Mon Sep 17 00:00:00 2001 From: mewhenthe Date: Sat, 2 May 2026 22:01:49 +0200 Subject: [PATCH] robot stuff wip i hate minecraft --- .../neoflock/neocomputers/block/RobotBlock.kt | 8 ++ .../neocomputers/block/model/RobotModel.kt | 31 +++---- .../neocomputers/entity/RobotEntity.kt | 1 + .../entity/render/RobotEntityRenderer.kt | 80 ++++++++++++++++++- 4 files changed, 101 insertions(+), 19 deletions(-) diff --git a/src/main/kotlin/org/neoflock/neocomputers/block/RobotBlock.kt b/src/main/kotlin/org/neoflock/neocomputers/block/RobotBlock.kt index e88e9dc..dd3faea 100644 --- a/src/main/kotlin/org/neoflock/neocomputers/block/RobotBlock.kt +++ b/src/main/kotlin/org/neoflock/neocomputers/block/RobotBlock.kt @@ -1,12 +1,16 @@ package org.neoflock.neocomputers.block import net.minecraft.core.BlockPos +import net.minecraft.world.level.BlockGetter import net.minecraft.world.level.block.Blocks import net.minecraft.world.level.block.EntityBlock import net.minecraft.world.level.block.RenderShape import net.minecraft.world.level.block.entity.BlockEntity import net.minecraft.world.level.block.state.BlockBehaviour import net.minecraft.world.level.block.state.BlockState +import net.minecraft.world.phys.shapes.CollisionContext +import net.minecraft.world.phys.shapes.Shapes +import net.minecraft.world.phys.shapes.VoxelShape import org.neoflock.neocomputers.NeoComputers import org.neoflock.neocomputers.entity.RobotEntity @@ -17,6 +21,10 @@ class RobotBlock : BaseBlock(Properties.of().noOcclusion()), EntityBlock { // to return RobotEntity(pos, state) } + override fun getShape(state: BlockState, level: BlockGetter, pos: BlockPos, context: CollisionContext): VoxelShape? { + return Shapes.box(0.1, 0.1, 0.1, 0.9, 0.9, 0.9) + } + override fun getRenderShape(state: BlockState): RenderShape { return RenderShape.INVISIBLE // this is so not good } diff --git a/src/main/kotlin/org/neoflock/neocomputers/block/model/RobotModel.kt b/src/main/kotlin/org/neoflock/neocomputers/block/model/RobotModel.kt index 50b75dd..96a5556 100644 --- a/src/main/kotlin/org/neoflock/neocomputers/block/model/RobotModel.kt +++ b/src/main/kotlin/org/neoflock/neocomputers/block/model/RobotModel.kt @@ -24,6 +24,7 @@ class RobotModel() : AbstractModel() { val l = 0.5f-size; val h = 0.5f+size; + // TODO: fix dimensions (i eyeballed it) override fun bake(atlas: (Material) -> TextureAtlasSprite) { // override fun bake(atlas: Function, state: ModelState): BakedModel { val sprite = atlas(Material(TextureAtlas.LOCATION_BLOCKS, ResourceLocation.fromNamespaceAndPath(NeoComputers.MODID, "block/robot"))) @@ -31,35 +32,35 @@ class RobotModel() : AbstractModel() { var verts: SchizoConsumer = SchizoConsumer() // top pyramid, enjoy reading this schizo mess - bakeTri(verts, Direction.WEST, sprite, l,l, l, h, 9f/16f,1F, 0f, 0f, 0f, 16f/32f) - bakeTri(verts, Direction.EAST, sprite, h, h, h, l, 9f/16f, 1F, 16/32f, 16/32f, 16/32f, 0f) - bakeTri(verts, Direction.SOUTH, sprite, l, h, h, h, 9f/16f, 1F, 0f, 16f/32f, 16f/32f, 16f/32f) - bakeTri(verts, Direction.NORTH, sprite, h, l, l,l, 9f/16f, 1F, 16/32f, 0f, 0f, 0f) + bakeTri(verts, Direction.WEST, sprite, l,l, l, h, 9f/16f,1f, 0f, 0f, 0f, 16f/32f) + bakeTri(verts, Direction.EAST, sprite, h, h, h, l, 9f/16f, 1f, 16/32f, 16/32f, 16/32f, 0f) + bakeTri(verts, Direction.SOUTH, sprite, l, h, h, h, 9f/16f, 1f, 0f, 16f/32f, 16f/32f, 16f/32f) + bakeTri(verts, Direction.NORTH, sprite, h, l, l,l, 9f/16f, 1f, 16/32f, 0f, 0f, 0f) - verts.startQuad(Direction.DOWN, sprite) + verts.startQuad(Direction.DOWN, sprite, 0) verts.vertex(l, 9f/16F, h, 0xFFFFFFFF.toInt(), 16f/32f, 16/32F) verts.vertex(l, 9f/16f, l, 0xFFFFFFFF.toInt(), 0F, 16/32F) verts.vertex(h, 9f/16f, l, 0xFFFFFFFF.toInt(), 0F, 1F) verts.vertex(h, 9f/16f, h, 0xFFFFFFFF.toInt(), 16/32F, 1F) // bottom - bakeTri(verts, Direction.WEST, sprite, l, h, l, l, 7f/16f, 0F, 0f, 0f, 0f, 16f/32f) - bakeTri(verts, Direction.EAST, sprite, h, l, h, h, 7f/16f, 0F, 0f, 0f, 0f, 16f/32f) - bakeTri(verts, Direction.SOUTH, sprite, h, h, l, h, 7f/16f, 0F, 0f, 0f, 0f, 16f/32f) - bakeTri(verts, Direction.NORTH, sprite, l, l, h,l, 7f/16f, 0F, 0f, 0f, 0f, 16f/32f) + bakeTri(verts, Direction.WEST, sprite, l, h, l, l, 8f/16f, 1/16f, 0f, 0f, 0f, 16f/32f) + bakeTri(verts, Direction.EAST, sprite, h, l, h, h, 8f/16f, 1/16f, 0f, 0f, 0f, 16f/32f) + bakeTri(verts, Direction.SOUTH, sprite, h, h, l, h, 8f/16f, 1/16f, 0f, 0f, 0f, 16f/32f) + bakeTri(verts, Direction.NORTH, sprite, l, l, h,l, 8f/16f, 1/16f, 0f, 0f, 0f, 16f/32f) - verts.startQuad(Direction.UP, sprite) - verts.vertex(h, 7f/16F, l, 0xFFFFFFFF.toInt(), 16/32F, 16/32F) - verts.vertex(l, 7f/16f, l, 0xFFFFFFFF.toInt(), 0F, 16/32F) - verts.vertex(l, 7f/16f, h, 0xFFFFFFFF.toInt(), 0F, 1F) - verts.vertex(h, 7f/16f, h, 0xFFFFFFFF.toInt(), 16/32F, 1F) + verts.startQuad(Direction.UP, sprite, 0) + verts.vertex(h, 8f/16F, l, 0xFFFFFFFF.toInt(), 16/32F, 16/32F) + verts.vertex(l, 8f/16f, l, 0xFFFFFFFF.toInt(), 0F, 16/32F) + verts.vertex(l, 8f/16f, h, 0xFFFFFFFF.toInt(), 0F, 1F) + verts.vertex(h, 8f/16f, h, 0xFFFFFFFF.toInt(), 16/32F, 1F) this.mesh = verts.mesh } fun bakeTri(verts: SchizoConsumer, normal: Direction, sprite: TextureAtlasSprite, lx: Float, lz: Float, rx: Float, rz: Float, dy: Float, uy: Float, lu: Float, lv: Float, ru: Float, rv: Float) { - verts.startQuad(normal, sprite) + verts.startQuad(normal, sprite, 0) verts.vertex(0.5F, uy, 0.5F, 0xFFFFFFFF.toInt(), 8F/32F, 8F/32F) verts.vertex(0.5F, uy, 0.5F, 0xFFFFFFFF.toInt(), 8F/32F, 8F/32F) verts.vertex(lx, dy, lz, 0xFFFFFFFF.toInt(), lu, lv) diff --git a/src/main/kotlin/org/neoflock/neocomputers/entity/RobotEntity.kt b/src/main/kotlin/org/neoflock/neocomputers/entity/RobotEntity.kt index 2b802db..8cd41a0 100644 --- a/src/main/kotlin/org/neoflock/neocomputers/entity/RobotEntity.kt +++ b/src/main/kotlin/org/neoflock/neocomputers/entity/RobotEntity.kt @@ -8,6 +8,7 @@ import org.neoflock.neocomputers.NeoComputers class RobotEntity(pos: BlockPos, state: BlockState) : BlockEntity(BlockEntities.ROBOT_ENTITY.get(), pos, state,) { val body: ModelPart? = null + val name = "Diddyx" //TODO: names init { NeoComputers.LOGGER.info("yooo") diff --git a/src/main/kotlin/org/neoflock/neocomputers/entity/render/RobotEntityRenderer.kt b/src/main/kotlin/org/neoflock/neocomputers/entity/render/RobotEntityRenderer.kt index e548dc6..c7576bf 100644 --- a/src/main/kotlin/org/neoflock/neocomputers/entity/render/RobotEntityRenderer.kt +++ b/src/main/kotlin/org/neoflock/neocomputers/entity/render/RobotEntityRenderer.kt @@ -1,19 +1,26 @@ package org.neoflock.neocomputers.entity.render +import com.mojang.blaze3d.systems.RenderSystem import com.mojang.blaze3d.vertex.DefaultVertexFormat import com.mojang.blaze3d.vertex.PoseStack import com.mojang.blaze3d.vertex.VertexConsumer import com.mojang.blaze3d.vertex.VertexFormat +import com.mojang.math.Axis import net.minecraft.client.Minecraft +import net.minecraft.client.gui.Font +import net.minecraft.client.gui.GuiGraphics import net.minecraft.client.model.geom.ModelPart +import net.minecraft.client.renderer.GameRenderer import net.minecraft.client.renderer.ItemBlockRenderTypes import net.minecraft.client.renderer.MultiBufferSource import net.minecraft.client.renderer.RenderStateShard import net.minecraft.client.renderer.RenderType +import net.minecraft.client.renderer.RenderType.CompositeState import net.minecraft.client.renderer.block.ModelBlockRenderer import net.minecraft.client.renderer.block.model.BakedQuad import net.minecraft.client.renderer.blockentity.BlockEntityRenderer import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider +import net.minecraft.client.renderer.entity.LivingEntityRenderer import net.minecraft.client.renderer.texture.OverlayTexture import net.minecraft.client.renderer.texture.TextureAtlas import net.minecraft.client.renderer.texture.TextureAtlasSprite @@ -21,8 +28,12 @@ import net.minecraft.client.resources.model.BakedModel import net.minecraft.client.resources.model.Material import net.minecraft.client.resources.model.ModelResourceLocation import net.minecraft.client.resources.model.ModelState +import net.minecraft.core.Direction +import net.minecraft.network.chat.Component import net.minecraft.resources.ResourceLocation import net.minecraft.util.RandomSource +import net.minecraft.world.item.DyeColor +import net.minecraft.world.phys.Vec3 import org.neoflock.neocomputers.NeoComputers import org.neoflock.neocomputers.block.model.RobotModel import org.neoflock.neocomputers.entity.RobotEntity @@ -36,15 +47,76 @@ class RobotEntityRenderer(val context: BlockEntityRendererProvider.Context) : Bl var model: BakedModel? = Minecraft.getInstance().modelManager.getModel(ModelResourceLocation.inventory(loc)) val renderer: ModelBlockRenderer = ModelBlockRenderer(Minecraft.getInstance().blockColors) // so ass + val STREAK_RENDER_TYPE = RenderType.create("nc_robot_streak", DefaultVertexFormat.POSITION_TEX_COLOR, VertexFormat.Mode.QUADS, RenderType.TRANSIENT_BUFFER_SIZE, + CompositeState.builder() + .setShaderState(RenderStateShard.ShaderStateShard { GameRenderer.getPositionTexColorShader() }) + .setTransparencyState(RenderStateShard.ADDITIVE_TRANSPARENCY) + .setTextureState(RenderStateShard.TextureStateShard(ResourceLocation.fromNamespaceAndPath(NeoComputers.MODID, "textures/block/robot.png"), false, false)) + .createCompositeState(false)) + override fun render(ent: RobotEntity, partialTick: Float, poseStack: PoseStack, bufferSource: MultiBufferSource, packedLight: Int, packedOverlay: Int) { - poseStack.pushPose() - poseStack.translate(0f, sin(ent.level!!.dayTime.toFloat()/20F)*0.02F, 0f) - val buffer = bufferSource.getBuffer(RenderType.entitySolid(TextureAtlas.LOCATION_BLOCKS)) +// poseStack.translate(0f, sin(ent.level!!.dayTime.toFloat()/20F)*0.02F, 0f) + val modelbuffer = bufferSource.getBuffer(RenderType.entitySolid(TextureAtlas.LOCATION_BLOCKS)) + val colorbuffer = bufferSource.getBuffer(STREAK_RENDER_TYPE) - renderer.renderModel(poseStack.last(), buffer, ent.blockState, model!!, 1f, 1f, 1f, packedLight, packedOverlay) + val col = DyeColor.LIGHT_GRAY.fireworkColor + val red = ((col and 0xFF0000) shr 8*2) / 255f + val green = ((col and 0xFF00) shr 8) / 255f + val blue = ((col and 0xFF)) / 255f + + renderer.renderModel(poseStack.last(), modelbuffer, ent.blockState, model!!, red, green, blue, packedLight, packedOverlay) + renderLight(poseStack, colorbuffer, (ent.level!!.dayTime%16).toInt()) + + + // TODO: crafting table and chest little models poseStack.popPose() + renderTag(ent, Component.literal(ent.name), poseStack, bufferSource, packedLight, partialTick) + } + + // offset is 0-15 + fun renderLight(poseStack: PoseStack, buffer: VertexConsumer, offset: Int) { + poseStack.pushPose() + + val u1 = 0.5f + val v1 = 0.5f + offset*1/32f + val u2 = 1F + val v2 = 17/32f + offset*1/32f + + for (i in 0..3) { + poseStack.rotateAround(Axis.YP.rotationDegrees(90f), 0.5f, 0.5f, 0.5f) + + buffer.addVertex(poseStack.last(),0.1f+2/16f, 7/16f, 0.9f-2/16f).setColor(1f, 0f, 0f, 1f).setUv(u2, v2) + buffer.addVertex(poseStack.last(),0.1f+2/16f, 9/16f, 0.9f-2/16f).setColor(1f, 0f, 0f, 1f).setUv(u2, v1) + buffer.addVertex(poseStack.last(),0.1f+2/16f, 9/16f, 0.1f+2/16f).setColor(1f, 0f, 0f, 1f).setUv(u1, v1) + buffer.addVertex(poseStack.last(),0.1f+2/16f, 7/16f, 0.1f+2/16f).setColor(1f, 0f, 0f, 1f).setUv(u1, v2) + } + + poseStack.popPose() + + + } + + fun renderTag(ent: RobotEntity, name: Component, stack: PoseStack, source: MultiBufferSource, light: Int, ptick: Float) { + val d = Minecraft.getInstance().cameraEntity!!.distanceToSqr(ent.blockPos.center) + if (d > 4096.0) return + + val vec = Vec3(0.5, 20 / 16.0, 0.5) + + stack.pushPose() + stack.translate(vec.x, vec.y, vec.z) +// stack.mulPose(context.entityRenderer.cameraOrientation()) + stack.scale(0.025F, -0.025F, 0.025F) + val opacity = Minecraft.getInstance().options.getBackgroundOpacity(0.25F) + val alpha: Int = (opacity * 255.0f).toInt() shl 24 +// val alpha = 255 + val halfwidth = (-context.font.width(name)) / 2; + RenderSystem.disableDepthTest() + context.font.drawInBatch(name, halfwidth.toFloat(), 2f, 0xFFFFFF, false, stack.last().pose(), source, Font.DisplayMode.SEE_THROUGH, alpha, light) + + RenderSystem.enableDepthTest() + stack.popPose() } } \ No newline at end of file