From a51e3ac2667d02575ed3ccf8a5947d04324e1961 Mon Sep 17 00:00:00 2001 From: Delta Date: Thu, 20 Aug 2026 19:08:11 +0200 Subject: [PATCH 1/2] Move `BlockDrop` struct to its own file --- src/blocks.zig | 21 +-------------------- src/callbacks/block/server/decay.zig | 3 ++- src/server/BlockDrop.zig | 22 ++++++++++++++++++++++ src/server/server.zig | 1 + src/sync.zig | 7 ++++--- 5 files changed, 30 insertions(+), 24 deletions(-) create mode 100644 src/server/BlockDrop.zig diff --git a/src/blocks.zig b/src/blocks.zig index b84ec963ba..1d80dc6003 100644 --- a/src/blocks.zig +++ b/src/blocks.zig @@ -28,31 +28,12 @@ const BlockTouchCallback = main.callbacks.BlockTouchCallback; const sbb = main.server.terrain.sbb; const blueprint = main.blueprint; const Assets = main.assets.Assets; +const BlockDrop = main.server.BlockDrop; const c = @import("c"); pub const maxBlockCount: usize = 65536; // 16 bit limit -pub const BlockDrop = struct { - items: []const items.ItemStack, - chance: f32, - forbiddenToolTags: []Tag, - allowedToolTags: ?[]Tag = null, - - pub fn isDroppedWhenBrokenWithItem(self: BlockDrop, item: Item) bool { - if (item != .proceduralItem) return self.allowedToolTags == null; - - const proceduralItem = item.proceduralItem; - for (self.forbiddenToolTags) |tag| if (proceduralItem.hasTag(tag)) return false; - if (self.allowedToolTags) |tags| { - for (tags) |tag| if (proceduralItem.hasTag(tag)) return true; - return false; - } - - return true; - } -}; - /// Ores can be found underground in veins. /// TODO: Add support for non-stone ores. pub const Ore = struct { diff --git a/src/callbacks/block/server/decay.zig b/src/callbacks/block/server/decay.zig index 0d85f03fa0..6b55c18d78 100644 --- a/src/callbacks/block/server/decay.zig +++ b/src/callbacks/block/server/decay.zig @@ -10,10 +10,11 @@ const Vec3f = vec.Vec3f; const ZonElement = main.ZonElement; const server = main.server; const branch = main.rotation.rotations.@"cubyz:branch"; +const BlockDrop = main.server.BlockDrop; decayReplacement: blocks.Block, prevention: []const main.Tag, -blockDrops: []const blocks.BlockDrop, +blockDrops: []const BlockDrop, pub fn init(zon: ZonElement, creator: main.callbacks.Creator) ?*@This() { const block = switch (creator) { diff --git a/src/server/BlockDrop.zig b/src/server/BlockDrop.zig new file mode 100644 index 0000000000..edd3ed5efe --- /dev/null +++ b/src/server/BlockDrop.zig @@ -0,0 +1,22 @@ +const main = @import("main"); +const Tag = main.Tag; +const Items = main.items; +const Item = Items.Item; + +items: []const Items.ItemStack, +chance: f32, +forbiddenToolTags: []Tag, +allowedToolTags: ?[]Tag = null, + +pub fn isDroppedWhenBrokenWithItem(self: @This(), item: Item) bool { + if (item != .proceduralItem) return self.allowedToolTags == null; + + const proceduralItem = item.proceduralItem; + for (self.forbiddenToolTags) |tag| if (proceduralItem.hasTag(tag)) return false; + if (self.allowedToolTags) |tags| { + for (tags) |tag| if (proceduralItem.hasTag(tag)) return true; + return false; + } + + return true; +} diff --git a/src/server/server.zig b/src/server/server.zig index 4860d956cd..e88dc507fc 100644 --- a/src/server/server.zig +++ b/src/server/server.zig @@ -30,6 +30,7 @@ pub const stdin_handler = @import("stdin_handler.zig"); pub const storage = @import("storage.zig"); pub const permission = @import("permission.zig"); pub const players = @import("players.zig"); +pub const BlockDrop = @import("BlockDrop.zig"); pub const command = @import("command.zig"); diff --git a/src/sync.zig b/src/sync.zig index 7d08c4aeca..1304f3bc0b 100644 --- a/src/sync.zig +++ b/src/sync.zig @@ -18,6 +18,7 @@ const Vec3d = vec.Vec3d; const Vec3f = vec.Vec3f; const Vec3i = vec.Vec3i; const ZonElement = main.ZonElement; +const BlockDrop = main.server.BlockDrop; const @"cubyz:bag" = main.entity.components.@"cubyz:bag"; @@ -1549,14 +1550,14 @@ pub const Command = struct { // MARK: Command min: Vec3f, max: Vec3f, - pub fn drop(self: BlockDropLocation, pos: Vec3i, newBlock: Block, _drop: main.blocks.BlockDrop) void { + pub fn drop(self: BlockDropLocation, pos: Vec3i, newBlock: Block, _drop: BlockDrop) void { if (newBlock.collide()) { self.dropOutside(pos, _drop); } else { self.dropInside(pos, _drop); } } - fn dropInside(self: BlockDropLocation, pos: Vec3i, _drop: main.blocks.BlockDrop) void { + fn dropInside(self: BlockDropLocation, pos: Vec3i, _drop: BlockDrop) void { for (_drop.items) |itemStack| { main.server.world.?.drop(itemStack.clone(), self.insidePos(pos), self.dropDir(), self.dropVelocity()); } @@ -1572,7 +1573,7 @@ pub const Command = struct { // MARK: Command const width = (max - min)*half; return center + width*main.random.nextFloatVectorSigned(3, &main.seed)*half; } - fn dropOutside(self: BlockDropLocation, pos: Vec3i, _drop: main.blocks.BlockDrop) void { + fn dropOutside(self: BlockDropLocation, pos: Vec3i, _drop: BlockDrop) void { for (_drop.items) |itemStack| { main.server.world.?.drop(itemStack.clone(), self.outsidePos(pos), self.dropDir(), self.dropVelocity()); } From 57647ea1907bb708cbb79353511551c1ad7fb6cf Mon Sep 17 00:00:00 2001 From: Delta Date: Thu, 20 Aug 2026 19:23:58 +0200 Subject: [PATCH 2/2] Rename `item` variable so that alias name can be the same as its value --- src/blocks.zig | 2 +- src/callbacks/block/server/check_support_blocks.zig | 2 +- src/callbacks/block/server/decay.zig | 2 +- src/server/BlockDrop.zig | 6 +++--- src/sync.zig | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/blocks.zig b/src/blocks.zig index 1d80dc6003..528d39ff37 100644 --- a/src/blocks.zig +++ b/src/blocks.zig @@ -252,7 +252,7 @@ pub fn loadBlockDrop(blockId: []const u8, zon: ZonElement) []const BlockDrop { } blockDrops[i] = .{ - .items = resultItems.items, + .itemStacks = resultItems.items, .chance = blockDrop.get(f32, "chance") orelse 1, .forbiddenToolTags = Tag.loadTagsFromZon(main.worldArena, blockDrop.getChild("forbiddenToolTags")), .allowedToolTags = allowedToolTags, diff --git a/src/callbacks/block/server/check_support_blocks.zig b/src/callbacks/block/server/check_support_blocks.zig index c2f41c5a63..30296ababf 100644 --- a/src/callbacks/block/server/check_support_blocks.zig +++ b/src/callbacks/block/server/check_support_blocks.zig @@ -49,7 +49,7 @@ pub fn run(_: *@This(), params: main.callbacks.ServerBlockCallback.Params) main. for (drops) |drop| { if (!drop.isDroppedWhenBrokenWithItem(.null)) continue; if (drop.chance == 1 or main.random.nextFloat(&main.seed) < drop.chance) { - for (drop.items) |stack| { + for (drop.itemStacks) |stack| { var dir = main.vec.normalize(main.random.nextFloatVectorSigned(3, &main.seed)); // Bias upwards dir[2] += main.random.nextFloat(&main.seed)*4.0; diff --git a/src/callbacks/block/server/decay.zig b/src/callbacks/block/server/decay.zig index 6b55c18d78..eb6e2bb28e 100644 --- a/src/callbacks/block/server/decay.zig +++ b/src/callbacks/block/server/decay.zig @@ -137,7 +137,7 @@ pub fn run(self: *@This(), params: main.callbacks.ServerBlockCallback.Params) ma if (world.cmpxchgBlock(wx, wy, wz, leaf, self.decayReplacement) == null) { for (self.blockDrops) |drop| { if (drop.chance == 1 or main.random.nextFloat(&main.seed) < drop.chance) { - for (drop.items) |stack| { + for (drop.itemStacks) |stack| { var dir = main.vec.normalize(main.random.nextFloatVectorSigned(3, &main.seed)); // Bias upwards dir[2] += main.random.nextFloat(&main.seed)*4.0; diff --git a/src/server/BlockDrop.zig b/src/server/BlockDrop.zig index edd3ed5efe..31a049beb1 100644 --- a/src/server/BlockDrop.zig +++ b/src/server/BlockDrop.zig @@ -1,9 +1,9 @@ const main = @import("main"); const Tag = main.Tag; -const Items = main.items; -const Item = Items.Item; +const items = main.items; +const Item = items.Item; -items: []const Items.ItemStack, +itemStacks: []const items.ItemStack, chance: f32, forbiddenToolTags: []Tag, allowedToolTags: ?[]Tag = null, diff --git a/src/sync.zig b/src/sync.zig index 1304f3bc0b..e7947f7db9 100644 --- a/src/sync.zig +++ b/src/sync.zig @@ -1558,7 +1558,7 @@ pub const Command = struct { // MARK: Command } } fn dropInside(self: BlockDropLocation, pos: Vec3i, _drop: BlockDrop) void { - for (_drop.items) |itemStack| { + for (_drop.itemStacks) |itemStack| { main.server.world.?.drop(itemStack.clone(), self.insidePos(pos), self.dropDir(), self.dropVelocity()); } } @@ -1574,7 +1574,7 @@ pub const Command = struct { // MARK: Command return center + width*main.random.nextFloatVectorSigned(3, &main.seed)*half; } fn dropOutside(self: BlockDropLocation, pos: Vec3i, _drop: BlockDrop) void { - for (_drop.items) |itemStack| { + for (_drop.itemStacks) |itemStack| { main.server.world.?.drop(itemStack.clone(), self.outsidePos(pos), self.dropDir(), self.dropVelocity()); } }