From 4d62da9ae81bc3ab1b98417528399bb817099868 Mon Sep 17 00:00:00 2001 From: IntegratedQuantum Date: Mon, 12 May 2025 18:05:45 +0200 Subject: [PATCH] Rename solid to replacable fixes #1358 --- assets/cubyz/blocks/air.zig.zon | 2 +- assets/cubyz/blocks/bolete.zig.zon | 2 +- assets/cubyz/blocks/fog/_defaults.zig.zon | 2 +- assets/cubyz/blocks/glimmergill.zig.zon | 2 +- assets/cubyz/blocks/lava.zig.zon | 2 +- assets/cubyz/blocks/sulfur_torch.zig.zon | 2 +- assets/cubyz/blocks/toadstool.zig.zon | 2 +- assets/cubyz/blocks/torch.zig.zon | 2 +- assets/cubyz/blocks/void.zig.zon | 1 - assets/cubyz/blocks/water.zig.zon | 2 +- src/blocks.zig | 10 ++++++---- src/renderer.zig | 2 +- src/rotation.zig | 2 +- src/rotation/branch.zig | 6 +++--- src/rotation/fence.zig | 2 +- src/rotation/torch.zig | 4 ++-- src/server/storage.zig | 3 ++- 17 files changed, 25 insertions(+), 23 deletions(-) diff --git a/assets/cubyz/blocks/air.zig.zon b/assets/cubyz/blocks/air.zig.zon index ec6a40a3..f2f60f61 100644 --- a/assets/cubyz/blocks/air.zig.zon +++ b/assets/cubyz/blocks/air.zig.zon @@ -4,7 +4,7 @@ .transparent = true, .absorbedLight = 0x000000, .viewThrough = true, - .solid = false, + .replacable = true, .rotation = .no_rotation, .degradable = true, .hasItem = false, diff --git a/assets/cubyz/blocks/bolete.zig.zon b/assets/cubyz/blocks/bolete.zig.zon index a72a90d9..a1995396 100644 --- a/assets/cubyz/blocks/bolete.zig.zon +++ b/assets/cubyz/blocks/bolete.zig.zon @@ -4,7 +4,7 @@ .drops = .{ .{.items = .{.auto}}, }, - .solid = false, + .replacable = true, .viewThrough = true, .degradable = true, .absorbedLight = 0x010101, diff --git a/assets/cubyz/blocks/fog/_defaults.zig.zon b/assets/cubyz/blocks/fog/_defaults.zig.zon index c0b004ff..5826717d 100644 --- a/assets/cubyz/blocks/fog/_defaults.zig.zon +++ b/assets/cubyz/blocks/fog/_defaults.zig.zon @@ -5,7 +5,7 @@ .degradable = true, .transparent = true, .hasBackFace = true, - .solid = false, + .replacable = true, .collide = false, .model = "cubyz:cube", diff --git a/assets/cubyz/blocks/glimmergill.zig.zon b/assets/cubyz/blocks/glimmergill.zig.zon index 17603a1c..ad5247e2 100644 --- a/assets/cubyz/blocks/glimmergill.zig.zon +++ b/assets/cubyz/blocks/glimmergill.zig.zon @@ -4,7 +4,7 @@ .drops = .{ .{.items = .{.auto}}, }, - .solid = false, + .replacable = true, .degradable = true, .viewThrough = true, .absorbedLight = 0x010101, diff --git a/assets/cubyz/blocks/lava.zig.zon b/assets/cubyz/blocks/lava.zig.zon index 85a5d98a..4a0d539a 100644 --- a/assets/cubyz/blocks/lava.zig.zon +++ b/assets/cubyz/blocks/lava.zig.zon @@ -2,7 +2,7 @@ .tags = .{.fluid}, .drops = .{}, .selectable = false, - .solid = false, + .replacable = true, .degradable = true, .transparent = true, .hasBackFace = true, diff --git a/assets/cubyz/blocks/sulfur_torch.zig.zon b/assets/cubyz/blocks/sulfur_torch.zig.zon index 1019d8d7..977f52d1 100644 --- a/assets/cubyz/blocks/sulfur_torch.zig.zon +++ b/assets/cubyz/blocks/sulfur_torch.zig.zon @@ -4,7 +4,7 @@ .drops = .{ .{.items = .{.auto}}, }, - .solid = false, + .replacable = true, .emittedLight = 0x2b81b2, .viewThrough = true, .absorbedLight = 0x010101, diff --git a/assets/cubyz/blocks/toadstool.zig.zon b/assets/cubyz/blocks/toadstool.zig.zon index 7b5b83fd..3899ef9d 100644 --- a/assets/cubyz/blocks/toadstool.zig.zon +++ b/assets/cubyz/blocks/toadstool.zig.zon @@ -4,7 +4,7 @@ .drops = .{ .{.items = .{.auto}}, }, - .solid = false, + .replacable = true, .degradable = true, .viewThrough = true, .absorbedLight = 0x010101, diff --git a/assets/cubyz/blocks/torch.zig.zon b/assets/cubyz/blocks/torch.zig.zon index f3e62191..5b7280c3 100644 --- a/assets/cubyz/blocks/torch.zig.zon +++ b/assets/cubyz/blocks/torch.zig.zon @@ -4,7 +4,7 @@ .drops = .{ .{.items = .{.auto}}, }, - .solid = false, + .replacable = true, .emittedLight = 0xa58d73, .viewThrough = true, .absorbedLight = 0x010101, diff --git a/assets/cubyz/blocks/void.zig.zon b/assets/cubyz/blocks/void.zig.zon index 0e072d8d..693839a0 100644 --- a/assets/cubyz/blocks/void.zig.zon +++ b/assets/cubyz/blocks/void.zig.zon @@ -5,7 +5,6 @@ .absorbedLight = 0x000000, .viewThrough = true, .hasBackFace = true, - .solid = true, .rotation = .no_rotation, .degradable = false, .collide = false, diff --git a/assets/cubyz/blocks/water.zig.zon b/assets/cubyz/blocks/water.zig.zon index dcd5ff1b..8bef14ff 100644 --- a/assets/cubyz/blocks/water.zig.zon +++ b/assets/cubyz/blocks/water.zig.zon @@ -2,7 +2,7 @@ .tags = .{.fluid}, .drops = .{}, .selectable = false, - .solid = false, + .replacable = true, .degradable = true, .transparent = true, .hasBackFace = true, diff --git a/src/blocks.zig b/src/blocks.zig index 15e9fed9..2133aa81 100644 --- a/src/blocks.zig +++ b/src/blocks.zig @@ -54,7 +54,8 @@ var _id: [maxBlockCount][]u8 = undefined; var _blockHealth: [maxBlockCount]f32 = undefined; var _blockResistance: [maxBlockCount]f32 = undefined; -var _solid: [maxBlockCount]bool = undefined; +/// Whether you can replace it with another block, mainly used for fluids/gases +var _replacable: [maxBlockCount]bool = undefined; var _selectable: [maxBlockCount]bool = undefined; var _blockDrops: [maxBlockCount][]BlockDrop = undefined; /// Meaning undegradable parts of trees or other structures can grow through this block. @@ -114,7 +115,7 @@ pub fn register(_: []const u8, id: []const u8, zon: ZonElement) u16 { _absorption[size] = zon.get(u32, "absorbedLight", 0xffffff); _degradable[size] = zon.get(bool, "degradable", false); _selectable[size] = zon.get(bool, "selectable", true); - _solid[size] = zon.get(bool, "solid", true); + _replacable[size] = zon.get(bool, "replacable", false); _gui[size] = allocator.dupe(u8, zon.get([]const u8, "gui", "")); _transparent[size] = zon.get(bool, "transparent", false); _collide[size] = zon.get(bool, "collide", true); @@ -300,8 +301,9 @@ pub const Block = packed struct { // MARK: Block return _blockResistance[self.typ]; } - pub inline fn solid(self: Block) bool { - return _solid[self.typ]; + /// Whether you can replace it with another block, mainly used for fluids/gases + pub inline fn replacable(self: Block) bool { + return _replacable[self.typ]; } pub inline fn selectable(self: Block) bool { diff --git a/src/renderer.zig b/src/renderer.zig index 8f3bac59..42625d07 100644 --- a/src/renderer.zig +++ b/src/renderer.zig @@ -990,7 +990,7 @@ pub const MeshSelection = struct { // MARK: MeshSelection return; } } else { - if(block.solid()) return; + if(!block.replacable()) return; block.typ = itemBlock; block.data = 0; if(rotationMode.generateData(main.game.world.?, neighborPos, relPos, lastDir, neighborDir, neighborOfSelection, &block, neighborBlock, true)) { diff --git a/src/rotation.zig b/src/rotation.zig index 5bdfa8e0..d65eb7a3 100644 --- a/src/rotation.zig +++ b/src/rotation.zig @@ -98,7 +98,7 @@ pub const RotationMode = struct { // MARK: RotationMode shouldDropSourceBlockOnSuccess.* = true; if(oldBlock == newBlock) return .no; if(oldBlock.typ == newBlock.typ) return .yes; - if(oldBlock.solid()) { + if(!oldBlock.replacable()) { var damage: f32 = 1; const isTool = item.item != null and item.item.? == .tool; if(isTool) { diff --git a/src/rotation/branch.zig b/src/rotation/branch.zig index 89c60cda..a77061cc 100644 --- a/src/rotation/branch.zig +++ b/src/rotation/branch.zig @@ -351,13 +351,13 @@ pub fn generateData( ) bool { const canConnectToNeighbor = currentBlock.mode() == neighborBlock.mode() and currentBlock.modeData() == neighborBlock.modeData(); - if(blockPlacing or canConnectToNeighbor or neighborBlock.solid()) { + if(blockPlacing or canConnectToNeighbor or !neighborBlock.replacable()) { const neighborModel = blocks.meshes.model(neighborBlock).model(); var currentData = BranchData.init(currentBlock.data); // Branch block upon placement should extend towards a block it was placed // on if the block is solid or also uses branch model. - const targetVal = ((neighborBlock.solid() and (!neighborBlock.viewThrough() or canConnectToNeighbor)) and (canConnectToNeighbor or neighborModel.isNeighborOccluded[neighbor.?.reverse().toInt()])); + const targetVal = ((!neighborBlock.replacable() and (!neighborBlock.viewThrough() or canConnectToNeighbor)) and (canConnectToNeighbor or neighborModel.isNeighborOccluded[neighbor.?.reverse().toInt()])); currentData.setConnection(neighbor.?, targetVal); const result: u16 = currentData.enabledConnections; @@ -379,7 +379,7 @@ pub fn updateData(block: *Block, neighbor: Neighbor, neighborBlock: Block) bool if(canConnectToNeighbor) { const neighborData = BranchData.init(neighborBlock.data); currentData.setConnection(neighbor, neighborData.isConnected(neighbor.reverse())); - } else if(!neighborBlock.solid()) { + } else if(neighborBlock.replacable()) { currentData.setConnection(neighbor, false); } diff --git a/src/rotation/fence.zig b/src/rotation/fence.zig index d74b4a3b..f6d33f6f 100644 --- a/src/rotation/fence.zig +++ b/src/rotation/fence.zig @@ -106,7 +106,7 @@ pub fn updateData(block: *Block, neighbor: Neighbor, neighborBlock: Block) bool const blockBaseModelIndex = blocks.meshes.modelIndexStart(block.*); const neighborBaseModelIndex = blocks.meshes.modelIndexStart(neighborBlock); const neighborModel = blocks.meshes.model(neighborBlock).model(); - const targetVal = neighborBlock.solid() and (blockBaseModelIndex == neighborBaseModelIndex or neighborModel.isNeighborOccluded[neighbor.reverse().toInt()]); + const targetVal = !neighborBlock.replacable() and (blockBaseModelIndex == neighborBaseModelIndex or neighborModel.isNeighborOccluded[neighbor.reverse().toInt()]); var currentData: FenceData = @bitCast(@as(u4, @truncate(block.data))); switch(neighbor) { .dirNegX => { diff --git a/src/rotation/torch.zig b/src/rotation/torch.zig index 33aa2581..68b17fc8 100644 --- a/src/rotation/torch.zig +++ b/src/rotation/torch.zig @@ -122,7 +122,7 @@ pub fn rotateZ(data: u16, angle: Degrees) u16 { pub fn generateData(_: *main.game.World, _: Vec3i, _: Vec3f, _: Vec3f, relativeDir: Vec3i, neighbor: ?Neighbor, currentData: *Block, neighborBlock: Block, _: bool) bool { if(neighbor == null) return false; const neighborModel = blocks.meshes.model(neighborBlock).model(); - const neighborSupport = neighborBlock.solid() and neighborModel.neighborFacingQuads[neighbor.?.reverse().toInt()].len != 0; + const neighborSupport = !neighborBlock.replacable() and neighborModel.neighborFacingQuads[neighbor.?.reverse().toInt()].len != 0; if(!neighborSupport) return false; var data: TorchData = @bitCast(@as(u5, @truncate(currentData.data))); if(relativeDir[0] == 1) data.posX = true; @@ -140,7 +140,7 @@ pub fn generateData(_: *main.game.World, _: Vec3i, _: Vec3f, _: Vec3f, relativeD pub fn updateData(block: *Block, neighbor: Neighbor, neighborBlock: Block) bool { const neighborModel = blocks.meshes.model(neighborBlock).model(); - const neighborSupport = neighborBlock.solid() and neighborModel.neighborFacingQuads[neighbor.reverse().toInt()].len != 0; + const neighborSupport = !neighborBlock.replacable() and neighborModel.neighborFacingQuads[neighbor.reverse().toInt()].len != 0; var currentData: TorchData = @bitCast(@as(u5, @truncate(block.data))); switch(neighbor) { .dirNegX => { diff --git a/src/server/storage.zig b/src/server/storage.zig index a9a3cf5d..a61d8bf6 100644 --- a/src/server/storage.zig +++ b/src/server/storage.zig @@ -274,7 +274,8 @@ pub const ChunkCompression = struct { // MARK: ChunkCompression for(0..chunk.chunkVolume) |i| { uncompressedData[i] = @intCast(ch.data.data.getValue(i)); if(allowLossy) { - if(ch.data.palette[uncompressedData[i]].solid()) { + const model = main.blocks.meshes.model(ch.data.palette[uncompressedData[i]]).model(); + if(model.allNeighborsOccluded) { solidMask[i >> 5] |= @as(u32, 1) << @intCast(i & 31); } else { solidMask[i >> 5] &= ~(@as(u32, 1) << @intCast(i & 31));