From b217fd66a12545895afc7701e781205debf06e9a Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Sun, 12 Apr 2026 09:12:02 -0700 Subject: [PATCH 01/36] Golbo --- assets/cubyz/entityModels/golbo.zig.zon | 6 ++++++ assets/cubyz/entityModels/models/golbo.glb | Bin 0 -> 22484 bytes assets/cubyz/entityModels/textures/golbo.png | Bin 0 -> 2324 bytes 3 files changed, 6 insertions(+) create mode 100644 assets/cubyz/entityModels/golbo.zig.zon create mode 100644 assets/cubyz/entityModels/models/golbo.glb create mode 100644 assets/cubyz/entityModels/textures/golbo.png diff --git a/assets/cubyz/entityModels/golbo.zig.zon b/assets/cubyz/entityModels/golbo.zig.zon new file mode 100644 index 0000000000..c5d8e6838d --- /dev/null +++ b/assets/cubyz/entityModels/golbo.zig.zon @@ -0,0 +1,6 @@ +.{ + .model = "cubyz:snale", + .defaultTexture = "cubyz:snale", + .height = 2, + .coordinateSystem = .left_handed_y_up, +} diff --git a/assets/cubyz/entityModels/models/golbo.glb b/assets/cubyz/entityModels/models/golbo.glb new file mode 100644 index 0000000000000000000000000000000000000000..06b947719556826dbd727051af3b3bb1a854dc58 GIT binary patch literal 22484 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 TH$}vOM&R!oIC{I!v<3eQkBsXn literal 0 HcmV?d00001 diff --git a/assets/cubyz/entityModels/textures/golbo.png b/assets/cubyz/entityModels/textures/golbo.png new file mode 100644 index 0000000000000000000000000000000000000000..1dadd841df43e7c2d4518619f63b6abcfd361d2d GIT binary patch literal 2324 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 Date: Sun, 12 Apr 2026 09:15:05 -0700 Subject: [PATCH 02/36] oops not a branch --- assets/cubyz/entityModels/golbo.zig.zon | 6 ------ assets/cubyz/entityModels/models/golbo.glb | Bin 22484 -> 0 bytes assets/cubyz/entityModels/textures/golbo.png | Bin 2324 -> 0 bytes 3 files changed, 6 deletions(-) delete mode 100644 assets/cubyz/entityModels/golbo.zig.zon delete mode 100644 assets/cubyz/entityModels/models/golbo.glb delete mode 100644 assets/cubyz/entityModels/textures/golbo.png diff --git a/assets/cubyz/entityModels/golbo.zig.zon b/assets/cubyz/entityModels/golbo.zig.zon deleted file mode 100644 index c5d8e6838d..0000000000 --- a/assets/cubyz/entityModels/golbo.zig.zon +++ /dev/null @@ -1,6 +0,0 @@ -.{ - .model = "cubyz:snale", - .defaultTexture = "cubyz:snale", - .height = 2, - .coordinateSystem = .left_handed_y_up, -} diff --git a/assets/cubyz/entityModels/models/golbo.glb b/assets/cubyz/entityModels/models/golbo.glb deleted file mode 100644 index 06b947719556826dbd727051af3b3bb1a854dc58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22484 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 TH$}vOM&R!oIC{I!v<3eQkBsXn diff --git a/assets/cubyz/entityModels/textures/golbo.png b/assets/cubyz/entityModels/textures/golbo.png deleted file mode 100644 index 1dadd841df43e7c2d4518619f63b6abcfd361d2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2324 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 Date: Sat, 18 Jul 2026 20:18:24 -0700 Subject: [PATCH 03/36] almost complete --- src/items.zig | 20 ++++++++++++++++ src/proceduralItem/modifiers/far_reaching.zig | 24 +++++++++++++++++++ src/proceduralItem/modifiers/short.zig | 24 +++++++++++++++++++ src/renderer.zig | 14 ++++++++++- 4 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 src/proceduralItem/modifiers/far_reaching.zig create mode 100644 src/proceduralItem/modifiers/short.zig diff --git a/src/items.zig b/src/items.zig index 8fe590f816..ca6f0f063a 100644 --- a/src/items.zig +++ b/src/items.zig @@ -159,6 +159,7 @@ const Modifier = struct { combineModifiers: *const fn (data1: Data, data2: Data) ?Data, changeProceduralItemParameters: *const fn (proceduralItem: *ProceduralItem, data: Data) void, changeBlockDamage: *const fn (damage: f32, block: Block, data: Data) f32, + changeBlockRange: *const fn (data: Data) struct {f32, f32}, printTooltip: *const fn (outString: *main.ListManaged(u8), data: Data) void, loadData: *const fn (zon: ZonElement) Data, priority: f32, @@ -168,12 +169,16 @@ const Modifier = struct { pub fn changeBlockDamage(damage: f32, _: Block, _: Data) f32 { return damage; } + pub fn changeBlockRange(_: f32) struct {f32, f32} { + return .{0, 1}; // returns a flat 0 and a mult of 1 + } }; inline fn initFromModifierStruct(comptime ModifierStruct: type) VTable { return comptime .{ .changeProceduralItemParameters = @ptrCast(if (@hasDecl(ModifierStruct, "changeProceduralItemParameters")) &ModifierStruct.changeProceduralItemParameters else &VTable.Defaults.changeProceduralItemParameters), .changeBlockDamage = @ptrCast(if (@hasDecl(ModifierStruct, "changeBlockDamage")) &ModifierStruct.changeBlockDamage else &VTable.Defaults.changeBlockDamage), + .changeBlockRange = @ptrCast(if (@hasDecl(ModifierStruct, "changeBlockRange")) &ModifierStruct.changeBlockRange else &VTable.Defaults.changeBlockRange), .combineModifiers = @ptrCast(&ModifierStruct.combineModifiers), .printTooltip = @ptrCast(&ModifierStruct.printTooltip), .loadData = @ptrCast(&ModifierStruct.loadData), @@ -199,6 +204,10 @@ const Modifier = struct { return self.vTable.changeBlockDamage(damage, block, self.data); } + pub fn changeBlockRange(self: Modifier) struct {f32, f32} { + return self.vTable.changeBlockRange(self.data); + } + pub fn printTooltip(self: Modifier, outString: *main.ListManaged(u8)) void { self.vTable.printTooltip(outString, self.data); } @@ -916,6 +925,17 @@ pub const ProceduralItem = struct { // MARK: ProceduralItem return main.game.Player.defaultBlockDamage; } + pub fn getBlockRange(self: *ProceduralItem) struct {f32, f32} { + var flatRange: f32 = 0; + var multRange: f32 = 1; + for (self.modifiers) |modifier| { + const flatRangeDiff, const multRangeDiff = modifier.changeBlockRange(); + flatRange += flatRangeDiff; + multRange = multRange*multRangeDiff; + } + return .{flatRange, multRange}; + } + pub fn onUseReturnBroken(self: *ProceduralItem) bool { self.durability -|= 1; return self.durability == 0; diff --git a/src/proceduralItem/modifiers/far_reaching.zig b/src/proceduralItem/modifiers/far_reaching.zig new file mode 100644 index 0000000000..6290f5aa22 --- /dev/null +++ b/src/proceduralItem/modifiers/far_reaching.zig @@ -0,0 +1,24 @@ +const std = @import("std"); + +const main = @import("main"); +const ProceduralItem = main.items.ProceduralItem; + +pub const Data = packed struct(u128) { strength: f32, pad: u96 = undefined }; + +pub const priority = 1; + +pub fn loadData(zon: main.ZonElement) Data { + return .{.strength = std.math.clamp(zon.get(f32, "strength") orelse 0, 0, 1)}; +} + +pub fn combineModifiers(data1: Data, data2: Data) ?Data { + return .{.strength = 1.0 - 1.0/(1.0 + std.math.hypot(1.0/(1.0 - data1.strength) - 1.0, 1.0/(1.0 - data2.strength) - 1.0))}; +} + +pub fn changeProceduralItemParameters(proceduralItem: *ProceduralItem, data: Data) void { + proceduralItem.setProperty(.damage, proceduralItem.getProperty(.damage)*(1 - data.strength)); +} + +pub fn printTooltip(outString: *main.ListManaged(u8), data: Data) void { + outString.print("#fcb5e3**Weak**#808080 *Decreases damage by **{d:.0}%", .{data.strength*100}); +} diff --git a/src/proceduralItem/modifiers/short.zig b/src/proceduralItem/modifiers/short.zig new file mode 100644 index 0000000000..6290f5aa22 --- /dev/null +++ b/src/proceduralItem/modifiers/short.zig @@ -0,0 +1,24 @@ +const std = @import("std"); + +const main = @import("main"); +const ProceduralItem = main.items.ProceduralItem; + +pub const Data = packed struct(u128) { strength: f32, pad: u96 = undefined }; + +pub const priority = 1; + +pub fn loadData(zon: main.ZonElement) Data { + return .{.strength = std.math.clamp(zon.get(f32, "strength") orelse 0, 0, 1)}; +} + +pub fn combineModifiers(data1: Data, data2: Data) ?Data { + return .{.strength = 1.0 - 1.0/(1.0 + std.math.hypot(1.0/(1.0 - data1.strength) - 1.0, 1.0/(1.0 - data2.strength) - 1.0))}; +} + +pub fn changeProceduralItemParameters(proceduralItem: *ProceduralItem, data: Data) void { + proceduralItem.setProperty(.damage, proceduralItem.getProperty(.damage)*(1 - data.strength)); +} + +pub fn printTooltip(outString: *main.ListManaged(u8), data: Data) void { + outString.print("#fcb5e3**Weak**#808080 *Decreases damage by **{d:.0}%", .{data.strength*100}); +} diff --git a/src/renderer.zig b/src/renderer.zig index b194bd3e27..f67dd6a560 100644 --- a/src/renderer.zig +++ b/src/renderer.zig @@ -910,13 +910,25 @@ pub const MeshSelection = struct { // MARK: MeshSelection var selectionNormal: Vec3f = undefined; var lastPos: Vec3d = undefined; var lastDir: Vec3f = undefined; + fn getSelectRange(baseRange: f64, heldItem: main.items.Item) f64 { + var flatRange: f32 = 1; + var multRange: f32 = 0; + if (heldItem == .proceduralItem) { + const flatRangeDiff, const multRangeDiff = heldItem.proceduralItem.getBlockRange(); + flatRange += flatRangeDiff; + multRange = multRange*multRangeDiff; + } + const range: f64 = (baseRange + flatRange)*multRange; + return range; + } pub fn select(pos: Vec3d, _dir: Vec3f, item: main.items.Item) void { lastPos = pos; const dir: Vec3d = @floatCast(_dir); lastDir = _dir; // Test blocks: - const closestDistance: f64 = 6.0; // selection now limited + const defaultClosestDistance: f64 = 6.0; // selection now limited + const closestDistance: f64 = getSelectRange(defaultClosestDistance, item); // selection now limited // Implementation of "A Fast Voxel Traversal Algorithm for Ray Tracing" http://www.cse.yorku.ca/~amana/research/grid.pdf const step: Vec3i = std.math.sign(dir); const invDir = @as(Vec3d, @splat(1))/dir; From 34667aef67e6269efc77340ed411fd5ca745cfde Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Sat, 18 Jul 2026 20:19:03 -0700 Subject: [PATCH 04/36] Revert "almost complete" This reverts commit a52aad22e3300bbe606427758f25770eb3bb9335. --- src/items.zig | 20 ---------------- src/proceduralItem/modifiers/far_reaching.zig | 24 ------------------- src/proceduralItem/modifiers/short.zig | 24 ------------------- src/renderer.zig | 14 +---------- 4 files changed, 1 insertion(+), 81 deletions(-) delete mode 100644 src/proceduralItem/modifiers/far_reaching.zig delete mode 100644 src/proceduralItem/modifiers/short.zig diff --git a/src/items.zig b/src/items.zig index ca6f0f063a..8fe590f816 100644 --- a/src/items.zig +++ b/src/items.zig @@ -159,7 +159,6 @@ const Modifier = struct { combineModifiers: *const fn (data1: Data, data2: Data) ?Data, changeProceduralItemParameters: *const fn (proceduralItem: *ProceduralItem, data: Data) void, changeBlockDamage: *const fn (damage: f32, block: Block, data: Data) f32, - changeBlockRange: *const fn (data: Data) struct {f32, f32}, printTooltip: *const fn (outString: *main.ListManaged(u8), data: Data) void, loadData: *const fn (zon: ZonElement) Data, priority: f32, @@ -169,16 +168,12 @@ const Modifier = struct { pub fn changeBlockDamage(damage: f32, _: Block, _: Data) f32 { return damage; } - pub fn changeBlockRange(_: f32) struct {f32, f32} { - return .{0, 1}; // returns a flat 0 and a mult of 1 - } }; inline fn initFromModifierStruct(comptime ModifierStruct: type) VTable { return comptime .{ .changeProceduralItemParameters = @ptrCast(if (@hasDecl(ModifierStruct, "changeProceduralItemParameters")) &ModifierStruct.changeProceduralItemParameters else &VTable.Defaults.changeProceduralItemParameters), .changeBlockDamage = @ptrCast(if (@hasDecl(ModifierStruct, "changeBlockDamage")) &ModifierStruct.changeBlockDamage else &VTable.Defaults.changeBlockDamage), - .changeBlockRange = @ptrCast(if (@hasDecl(ModifierStruct, "changeBlockRange")) &ModifierStruct.changeBlockRange else &VTable.Defaults.changeBlockRange), .combineModifiers = @ptrCast(&ModifierStruct.combineModifiers), .printTooltip = @ptrCast(&ModifierStruct.printTooltip), .loadData = @ptrCast(&ModifierStruct.loadData), @@ -204,10 +199,6 @@ const Modifier = struct { return self.vTable.changeBlockDamage(damage, block, self.data); } - pub fn changeBlockRange(self: Modifier) struct {f32, f32} { - return self.vTable.changeBlockRange(self.data); - } - pub fn printTooltip(self: Modifier, outString: *main.ListManaged(u8)) void { self.vTable.printTooltip(outString, self.data); } @@ -925,17 +916,6 @@ pub const ProceduralItem = struct { // MARK: ProceduralItem return main.game.Player.defaultBlockDamage; } - pub fn getBlockRange(self: *ProceduralItem) struct {f32, f32} { - var flatRange: f32 = 0; - var multRange: f32 = 1; - for (self.modifiers) |modifier| { - const flatRangeDiff, const multRangeDiff = modifier.changeBlockRange(); - flatRange += flatRangeDiff; - multRange = multRange*multRangeDiff; - } - return .{flatRange, multRange}; - } - pub fn onUseReturnBroken(self: *ProceduralItem) bool { self.durability -|= 1; return self.durability == 0; diff --git a/src/proceduralItem/modifiers/far_reaching.zig b/src/proceduralItem/modifiers/far_reaching.zig deleted file mode 100644 index 6290f5aa22..0000000000 --- a/src/proceduralItem/modifiers/far_reaching.zig +++ /dev/null @@ -1,24 +0,0 @@ -const std = @import("std"); - -const main = @import("main"); -const ProceduralItem = main.items.ProceduralItem; - -pub const Data = packed struct(u128) { strength: f32, pad: u96 = undefined }; - -pub const priority = 1; - -pub fn loadData(zon: main.ZonElement) Data { - return .{.strength = std.math.clamp(zon.get(f32, "strength") orelse 0, 0, 1)}; -} - -pub fn combineModifiers(data1: Data, data2: Data) ?Data { - return .{.strength = 1.0 - 1.0/(1.0 + std.math.hypot(1.0/(1.0 - data1.strength) - 1.0, 1.0/(1.0 - data2.strength) - 1.0))}; -} - -pub fn changeProceduralItemParameters(proceduralItem: *ProceduralItem, data: Data) void { - proceduralItem.setProperty(.damage, proceduralItem.getProperty(.damage)*(1 - data.strength)); -} - -pub fn printTooltip(outString: *main.ListManaged(u8), data: Data) void { - outString.print("#fcb5e3**Weak**#808080 *Decreases damage by **{d:.0}%", .{data.strength*100}); -} diff --git a/src/proceduralItem/modifiers/short.zig b/src/proceduralItem/modifiers/short.zig deleted file mode 100644 index 6290f5aa22..0000000000 --- a/src/proceduralItem/modifiers/short.zig +++ /dev/null @@ -1,24 +0,0 @@ -const std = @import("std"); - -const main = @import("main"); -const ProceduralItem = main.items.ProceduralItem; - -pub const Data = packed struct(u128) { strength: f32, pad: u96 = undefined }; - -pub const priority = 1; - -pub fn loadData(zon: main.ZonElement) Data { - return .{.strength = std.math.clamp(zon.get(f32, "strength") orelse 0, 0, 1)}; -} - -pub fn combineModifiers(data1: Data, data2: Data) ?Data { - return .{.strength = 1.0 - 1.0/(1.0 + std.math.hypot(1.0/(1.0 - data1.strength) - 1.0, 1.0/(1.0 - data2.strength) - 1.0))}; -} - -pub fn changeProceduralItemParameters(proceduralItem: *ProceduralItem, data: Data) void { - proceduralItem.setProperty(.damage, proceduralItem.getProperty(.damage)*(1 - data.strength)); -} - -pub fn printTooltip(outString: *main.ListManaged(u8), data: Data) void { - outString.print("#fcb5e3**Weak**#808080 *Decreases damage by **{d:.0}%", .{data.strength*100}); -} diff --git a/src/renderer.zig b/src/renderer.zig index f67dd6a560..b194bd3e27 100644 --- a/src/renderer.zig +++ b/src/renderer.zig @@ -910,25 +910,13 @@ pub const MeshSelection = struct { // MARK: MeshSelection var selectionNormal: Vec3f = undefined; var lastPos: Vec3d = undefined; var lastDir: Vec3f = undefined; - fn getSelectRange(baseRange: f64, heldItem: main.items.Item) f64 { - var flatRange: f32 = 1; - var multRange: f32 = 0; - if (heldItem == .proceduralItem) { - const flatRangeDiff, const multRangeDiff = heldItem.proceduralItem.getBlockRange(); - flatRange += flatRangeDiff; - multRange = multRange*multRangeDiff; - } - const range: f64 = (baseRange + flatRange)*multRange; - return range; - } pub fn select(pos: Vec3d, _dir: Vec3f, item: main.items.Item) void { lastPos = pos; const dir: Vec3d = @floatCast(_dir); lastDir = _dir; // Test blocks: - const defaultClosestDistance: f64 = 6.0; // selection now limited - const closestDistance: f64 = getSelectRange(defaultClosestDistance, item); // selection now limited + const closestDistance: f64 = 6.0; // selection now limited // Implementation of "A Fast Voxel Traversal Algorithm for Ray Tracing" http://www.cse.yorku.ca/~amana/research/grid.pdf const step: Vec3i = std.math.sign(dir); const invDir = @as(Vec3d, @splat(1))/dir; From f6b5eed2bcbe13095730629a5eab755b41cf5f38 Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Tue, 6 Oct 2026 19:36:41 -0700 Subject: [PATCH 05/36] removed unnessicacy function --- src/game.zig | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/game.zig b/src/game.zig index cb7b157be7..60bc60bc89 100644 --- a/src/game.zig +++ b/src/game.zig @@ -187,19 +187,6 @@ pub const Player = struct { // MARK: Player } } - pub fn placeBlock(mods: main.Window.Key.Modifiers) void { - if (main.renderer.MeshSelection.selectedBlockPos) |blockPos| blk: { - const mesh = main.renderer.mesh_storage.getMesh(.initFromWorldPos(blockPos, 1)) orelse break :blk; - const block = mesh.chunk.getBlock(blockPos[0] - mesh.pos.wx, blockPos[1] - mesh.pos.wy, blockPos[2] - mesh.pos.wz); - const onInteract = block.onInteract(); - if (!mods.shift) { - if (onInteract.run(.{.blockPos = blockPos, .block = block, .chunk = mesh.chunk}) == .handled) return; - } - } - - inventory.placeBlock(selectedSlot); - } - pub fn kill(spawnPos: Vec3d) void { Player.super.pos = spawnPos; Player.super.vel = .{0, 0, 0}; From d29fe32852c9d0370d96e63d8a8c240ec4b6f889 Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Tue, 6 Oct 2026 19:37:25 -0700 Subject: [PATCH 06/36] Revert "removed unnessicacy function" This reverts commit f6b5eed2bcbe13095730629a5eab755b41cf5f38. --- src/game.zig | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/game.zig b/src/game.zig index 60bc60bc89..cb7b157be7 100644 --- a/src/game.zig +++ b/src/game.zig @@ -187,6 +187,19 @@ pub const Player = struct { // MARK: Player } } + pub fn placeBlock(mods: main.Window.Key.Modifiers) void { + if (main.renderer.MeshSelection.selectedBlockPos) |blockPos| blk: { + const mesh = main.renderer.mesh_storage.getMesh(.initFromWorldPos(blockPos, 1)) orelse break :blk; + const block = mesh.chunk.getBlock(blockPos[0] - mesh.pos.wx, blockPos[1] - mesh.pos.wy, blockPos[2] - mesh.pos.wz); + const onInteract = block.onInteract(); + if (!mods.shift) { + if (onInteract.run(.{.blockPos = blockPos, .block = block, .chunk = mesh.chunk}) == .handled) return; + } + } + + inventory.placeBlock(selectedSlot); + } + pub fn kill(spawnPos: Vec3d) void { Player.super.pos = spawnPos; Player.super.vel = .{0, 0, 0}; From 6c2de9c482ec431ef98e27703478c8104ce89ba3 Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Wed, 15 Jul 2026 18:45:21 -0700 Subject: [PATCH 07/36] finish --- assets/cubyz/recipes/cloth_recipes.zig.zon | 6 +++++ .../block/client/open_crafting_window.zig | 25 +++++++++++++++++++ src/gui/windows/inventory_crafting.zig | 19 ++++++++++++++ src/items.zig | 20 ++++++++++++++- src/items/recipes.zig | 15 ++++++++--- src/tag.zig | 1 + 6 files changed, 82 insertions(+), 4 deletions(-) create mode 100644 src/callbacks/block/client/open_crafting_window.zig diff --git a/assets/cubyz/recipes/cloth_recipes.zig.zon b/assets/cubyz/recipes/cloth_recipes.zig.zon index 9a5e00ffa3..2b2f19a71d 100644 --- a/assets/cubyz/recipes/cloth_recipes.zig.zon +++ b/assets/cubyz/recipes/cloth_recipes.zig.zon @@ -4,4 +4,10 @@ .output = "cubyz:cloth/block/{color}", .reversible = true, }, + .{ + .inputs = .{"4 cubyz:copper_ingot"}, + .output = "cubyz:silver_ingot", + .reversible = true, + .craftingTags = .{.alchemy} + }, } diff --git a/src/callbacks/block/client/open_crafting_window.zig b/src/callbacks/block/client/open_crafting_window.zig new file mode 100644 index 0000000000..e7270cb881 --- /dev/null +++ b/src/callbacks/block/client/open_crafting_window.zig @@ -0,0 +1,25 @@ +const std = @import("std"); + +const main = @import("main"); +const Block = main.blocks.Block; +const vec = main.vec; +const Vec3i = vec.Vec3i; +const ZonElement = main.ZonElement; + +craftingTags: []main.Tag, + +pub fn init(zon: ZonElement, _: main.callbacks.Creator) ?*@This() { + const result = main.worldArena.create(@This()); + const craftingTags = main.Tag.loadTagsFromZon(main.stackAllocator, zon.getChild("craftingTags")); + if (craftingTags.len == 0) std.log.err("Missing craftingTags \"name\" for open_crafting_window event.", .{}) + result.* = .{ + .craftingTags = craftingTags + }; + return result; +} + +pub fn run(self: *@This(), _: main.callbacks.ClientBlockCallback.Params) main.callbacks.Result { + main.gui.windowlist.inventory_crafting.openFromCallback(craftingTags) + main.Window.setMouseGrabbed(false); + return .handled; +} diff --git a/src/gui/windows/inventory_crafting.zig b/src/gui/windows/inventory_crafting.zig index 9224473a95..ba56aab8f7 100644 --- a/src/gui/windows/inventory_crafting.zig +++ b/src/gui/windows/inventory_crafting.zig @@ -37,13 +37,24 @@ var itemAmount: main.ListManaged(u32) = undefined; var inventories: main.ListManaged(ClientInventory) = undefined; pub var arrowTexture: Texture = undefined; +pub var craftableFromTags: []main.Tag = undefined; pub fn init() void { arrowTexture = Texture.initFromFile("assets/cubyz/ui/inventory/crafting_arrow.png"); + craftableFromTags = main.stackAllocator.alloc(main.Tag, 1); + craftableFromTags[0] = main.Tag.handCraftable; } pub fn deinit() void { arrowTexture.deinit(); + main.stackAllocator.free(craftableFromTags); +} + +pub fn openFromCallback(craftingTags: []main.Tag) void { + gui.closeWindowFromRef(&window); + gui.openWindowFromRef(&window); + craftableFromTags = craftingTags; + main.Window.setMouseGrabbed(false); } fn addItemStackToAvailable(itemStack: ItemStack) void { @@ -93,6 +104,14 @@ fn findAvailableRecipes(list: *VerticalList) bool { } continue :outer; // Ingredient not found. } + middle: for (recipe.craftingTags) |tag| { + for (craftableFromTags) |craftingStationTag| { + if (tag == craftingStationTag) { + continue :middle; + } + } + continue :outer; // Ingredient not found or not craftable by this. + } // All ingredients found: Add it to the list. const inv = ClientInventory.init(main.globalAllocator, recipe.sourceItems.len + 1, .{.crafting = recipe}, .other, .{}); diff --git a/src/items.zig b/src/items.zig index 28ca3aea16..da9213bf29 100644 --- a/src/items.zig +++ b/src/items.zig @@ -1321,16 +1321,21 @@ pub const Recipe = struct { // MARK: Recipe sourceAmounts: []u16, resultItem: BaseItemIndex, resultAmount: u16, + craftingTags: []Tag, fn getValidRecipe(self: Recipe) error{Invalid}!*Recipe { outer: for (main.items.getRecipes()) |*recipe| { if (recipe.resultItem != self.resultItem) continue; if (recipe.resultAmount != self.resultAmount) continue; if (recipe.sourceItems.len != self.sourceItems.len) continue; + if (recipe.craftingTags.len != self.craftingTags.len) continue; for (recipe.sourceItems, recipe.sourceAmounts, self.sourceItems, self.sourceAmounts) |recipeItem, recipeAmount, selfItem, selfAmount| { if (recipeItem != selfItem) continue :outer; if (recipeAmount != selfAmount) continue :outer; } + for (recipe.craftingTags, self.craftingTags) |recipeCraftingTag, selfCraftingTag| { + if (recipeCraftingTag != selfCraftingTag) continue :outer; + } return recipe; } return error.Invalid; @@ -1339,11 +1344,16 @@ pub const Recipe = struct { // MARK: Recipe pub fn toBytes(self: *const Recipe, writer: *BinaryWriter) void { writer.writeEnum(BaseItemIndex, self.resultItem); writer.writeVarInt(u16, self.resultAmount); + writer.writeVarInt(u16, self.resultAmount); writer.writeVarInt(usize, self.sourceItems.len); for (self.sourceItems, self.sourceAmounts) |item, amount| { writer.writeEnum(BaseItemIndex, item); writer.writeVarInt(u16, amount); } + writer.writeVarInt(usize, self.craftingTags.len); + for (self.craftingTags) |tag| { + writer.writeEnum(Tag, tag); + } } pub fn fromBytes(reader: *BinaryReader) !*Recipe { @@ -1361,7 +1371,15 @@ pub const Recipe = struct { // MARK: Recipe sourceAmounts.append(main.stackAllocator, try reader.readVarInt(u16)); } - return getValidRecipe(.{.sourceItems = sourceItems.items, .sourceAmounts = sourceAmounts.items, .resultItem = resultItem, .resultAmount = resultAmount}); + const tagCount = try reader.readVarInt(usize); + var craftingTagTypes: main.List(Tag) = .initCapacity(main.stackAllocator, @min(256, tagCount)); + defer craftingTagTypes.deinit(main.stackAllocator); + + while (reader.remaining.len > 0 and craftingTagTypes.items.len < tagCount) { + craftingTagTypes.append(main.stackAllocator, try reader.readEnum(Tag)); + } + + return getValidRecipe(.{.sourceItems = sourceItems.items, .sourceAmounts = sourceAmounts.items, .resultItem = resultItem, .resultAmount = resultAmount, .craftingTags = craftingTagTypes.items}); } }; diff --git a/src/items/recipes.zig b/src/items/recipes.zig index ab79b3bb0e..cd18049891 100644 --- a/src/items/recipes.zig +++ b/src/items/recipes.zig @@ -190,7 +190,7 @@ fn generateItemCombos(allocator: NeverFailingAllocator, recipe: []const ZonEleme return newInputCombos; } -pub fn addRecipe(itemCombo: []const ItemWithAmount, list: *main.ListManaged(Recipe)) void { +pub fn addRecipe(itemCombo: []const ItemWithAmount, list: *main.ListManaged(Recipe), craftingTags: []Tag) void { const inputs = itemCombo[0 .. itemCombo.len - 1]; const output = itemCombo[itemCombo.len - 1]; const recipe = Recipe{ @@ -198,11 +198,15 @@ pub fn addRecipe(itemCombo: []const ItemWithAmount, list: *main.ListManaged(Reci .sourceAmounts = main.worldArena.alloc(u16, inputs.len), .resultItem = output.item, .resultAmount = output.amount, + .craftingTags = main.worldArena.alloc(Tag, craftingTags.len) }; for (inputs, 0..) |input, i| { recipe.sourceItems[i] = input.item; recipe.sourceAmounts[i] = input.amount; } + for (craftingTags, 0..) |tag, i| { + recipe.craftingTags[i] = tag; + } list.append(recipe); } @@ -218,11 +222,16 @@ pub fn parseRecipe(zon: ZonElement, list: *main.ListManaged(Recipe)) !void { return error.InvalidReversibleRecipe; } + var defaultCraftingTags = arena.alloc(main.Tag, 1); + defaultCraftingTags[0] = main.Tag.handCraftable; + const foundCraftingTags = Tag.loadTagsFromZon(arena, zon.getChild("craftingTags")); + const craftingTags = if (foundCraftingTags.len != 0) foundCraftingTags else defaultCraftingTags; + const itemCombos = try generateItemCombos(arena, recipeItems); for (itemCombos) |itemCombo| { - addRecipe(itemCombo, list); + addRecipe(itemCombo, list, craftingTags); if (reversible) { - addRecipe(&.{itemCombo[1], itemCombo[0]}, list); + addRecipe(&.{itemCombo[1], itemCombo[0]}, list, craftingTags); } } } diff --git a/src/tag.zig b/src/tag.zig index 5474f581af..b09cbfcc09 100644 --- a/src/tag.zig +++ b/src/tag.zig @@ -12,6 +12,7 @@ pub const Tag = enum(u32) { fluidPlaceable = 3, chiselable = 4, playerModel = 5, + handCraftable = 6, _, pub fn initTags() void { From 5270b3d3d71b5fd3f6faca16564e45b804bfd0aa Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Wed, 15 Jul 2026 20:44:22 -0700 Subject: [PATCH 08/36] i dont understand why this is leaking --- .../cubyz/blocks/transmutation_workbench.zig.zon | 14 ++++++++++++++ src/callbacks/block/client/_list.zig | 1 + src/callbacks/block/client/edit_sign.zig | 2 +- src/callbacks/block/client/open_chest.zig | 2 +- .../block/client/open_crafting_window.zig | 6 +++--- src/callbacks/block/client/open_window.zig | 2 +- src/gui/windows/inventory_crafting.zig | 1 + src/items/recipes.zig | 5 ++++- 8 files changed, 26 insertions(+), 7 deletions(-) create mode 100644 assets/cubyz/blocks/transmutation_workbench.zig.zon diff --git a/assets/cubyz/blocks/transmutation_workbench.zig.zon b/assets/cubyz/blocks/transmutation_workbench.zig.zon new file mode 100644 index 0000000000..cde732cf25 --- /dev/null +++ b/assets/cubyz/blocks/transmutation_workbench.zig.zon @@ -0,0 +1,14 @@ +.{ + .tags = .{.diggable}, + .blockHealth = 6.5, + .drops = .{ + .{.items = .{.auto}}, + }, + .model = "cubyz:cube", + .rotation = "cubyz:stairs", + .texture = "cubyz:aerosoil", + .onInteract = .{ + .type = .open_crafting_window, + .craftingTags = .{.alchemy} + }, +} diff --git a/src/callbacks/block/client/_list.zig b/src/callbacks/block/client/_list.zig index 9a77fb7eb6..c056756e4a 100644 --- a/src/callbacks/block/client/_list.zig +++ b/src/callbacks/block/client/_list.zig @@ -1,3 +1,4 @@ pub const edit_sign = @import("edit_sign.zig"); pub const open_chest = @import("open_chest.zig"); pub const open_window = @import("open_window.zig"); +pub const open_crafting_window = @import("open_crafting_window.zig"); diff --git a/src/callbacks/block/client/edit_sign.zig b/src/callbacks/block/client/edit_sign.zig index ba6b1de9ae..860baf9105 100644 --- a/src/callbacks/block/client/edit_sign.zig +++ b/src/callbacks/block/client/edit_sign.zig @@ -12,7 +12,7 @@ pub fn init(_: ZonElement, _: main.callbacks.Creator) ?*anyopaque { pub fn run(_: *anyopaque, params: main.callbacks.ClientBlockCallback.Params) main.callbacks.Result { if (params.block.blockEntity() == null or !std.mem.eql(u8, params.block.blockEntity().?.id, "cubyz:sign")) { - std.log.err("Can only edit sign if block entity of the block is a sign.", .{}); + std.log.err("Error: Can only edit sign if block entity of the block is a sign.", .{}); return .ignored; } main.block_entity.BlockEntityTypes.@"cubyz:sign".StorageClient.mutex.lock(); diff --git a/src/callbacks/block/client/open_chest.zig b/src/callbacks/block/client/open_chest.zig index a4846117ab..e4fe21cf13 100644 --- a/src/callbacks/block/client/open_chest.zig +++ b/src/callbacks/block/client/open_chest.zig @@ -12,7 +12,7 @@ pub fn init(_: ZonElement, _: main.callbacks.Creator) ?*anyopaque { pub fn run(_: *anyopaque, params: main.callbacks.ClientBlockCallback.Params) main.callbacks.Result { if (params.block.blockEntity() == null or !std.mem.eql(u8, params.block.blockEntity().?.id, "cubyz:chest")) { - std.log.err("Can only open chest if block entity of the block is a chest.", .{}); + std.log.err("Error: Can only open chest if block entity of the block is a chest.", .{}); return .ignored; } main.network.protocols.blockEntityUpdate.sendClientDataUpdateToServer(main.game.world.?.conn, params.blockPos); diff --git a/src/callbacks/block/client/open_crafting_window.zig b/src/callbacks/block/client/open_crafting_window.zig index e7270cb881..2740d59d65 100644 --- a/src/callbacks/block/client/open_crafting_window.zig +++ b/src/callbacks/block/client/open_crafting_window.zig @@ -11,15 +11,15 @@ craftingTags: []main.Tag, pub fn init(zon: ZonElement, _: main.callbacks.Creator) ?*@This() { const result = main.worldArena.create(@This()); const craftingTags = main.Tag.loadTagsFromZon(main.stackAllocator, zon.getChild("craftingTags")); - if (craftingTags.len == 0) std.log.err("Missing craftingTags \"name\" for open_crafting_window event.", .{}) + if (craftingTags.len == 0) std.log.err("Error: Missing craftingTags \"name\" for open_crafting_window event.", .{}); result.* = .{ - .craftingTags = craftingTags + .craftingTags = craftingTags, }; return result; } pub fn run(self: *@This(), _: main.callbacks.ClientBlockCallback.Params) main.callbacks.Result { - main.gui.windowlist.inventory_crafting.openFromCallback(craftingTags) + main.gui.windowlist.inventory_crafting.openFromCallback(self.craftingTags); main.Window.setMouseGrabbed(false); return .handled; } diff --git a/src/callbacks/block/client/open_window.zig b/src/callbacks/block/client/open_window.zig index f67fa9bfc0..ea08f8722a 100644 --- a/src/callbacks/block/client/open_window.zig +++ b/src/callbacks/block/client/open_window.zig @@ -12,7 +12,7 @@ pub fn init(zon: ZonElement, _: main.callbacks.Creator) ?*@This() { const result = main.worldArena.create(@This()); result.* = .{ .windowName = main.worldArena.dupe(u8, zon.get([]const u8, "name") orelse { - std.log.err("Missing field \"name\" for open_window event.", .{}); + std.log.err("Error: Missing field \"name\" for open_window event.", .{}); return null; }), }; diff --git a/src/gui/windows/inventory_crafting.zig b/src/gui/windows/inventory_crafting.zig index ba56aab8f7..84c80c1297 100644 --- a/src/gui/windows/inventory_crafting.zig +++ b/src/gui/windows/inventory_crafting.zig @@ -43,6 +43,7 @@ pub fn init() void { arrowTexture = Texture.initFromFile("assets/cubyz/ui/inventory/crafting_arrow.png"); craftableFromTags = main.stackAllocator.alloc(main.Tag, 1); craftableFromTags[0] = main.Tag.handCraftable; + main.stackAllocator.free(craftableFromTags); } pub fn deinit() void { diff --git a/src/items/recipes.zig b/src/items/recipes.zig index cd18049891..04dc0de36a 100644 --- a/src/items/recipes.zig +++ b/src/items/recipes.zig @@ -198,7 +198,7 @@ pub fn addRecipe(itemCombo: []const ItemWithAmount, list: *main.ListManaged(Reci .sourceAmounts = main.worldArena.alloc(u16, inputs.len), .resultItem = output.item, .resultAmount = output.amount, - .craftingTags = main.worldArena.alloc(Tag, craftingTags.len) + .craftingTags = main.worldArena.alloc(Tag, craftingTags.len), }; for (inputs, 0..) |input, i| { recipe.sourceItems[i] = input.item; @@ -226,6 +226,9 @@ pub fn parseRecipe(zon: ZonElement, list: *main.ListManaged(Recipe)) !void { defaultCraftingTags[0] = main.Tag.handCraftable; const foundCraftingTags = Tag.loadTagsFromZon(arena, zon.getChild("craftingTags")); const craftingTags = if (foundCraftingTags.len != 0) foundCraftingTags else defaultCraftingTags; + defer arena.free(foundCraftingTags); + defer arena.free(defaultCraftingTags); + defer arena.free(craftingTags); const itemCombos = try generateItemCombos(arena, recipeItems); for (itemCombos) |itemCombo| { From af0e1566fb22f2019ffb5c2bbd0f988c6459fb15 Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Wed, 15 Jul 2026 20:57:38 -0700 Subject: [PATCH 09/36] formatting --- assets/cubyz/recipes/cloth_recipes.zig.zon | 2 +- src/callbacks/block/client/open_crafting_window.zig | 1 + src/gui/windows/inventory_crafting.zig | 3 +-- src/items/recipes.zig | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/assets/cubyz/recipes/cloth_recipes.zig.zon b/assets/cubyz/recipes/cloth_recipes.zig.zon index 2b2f19a71d..a8da98d2d1 100644 --- a/assets/cubyz/recipes/cloth_recipes.zig.zon +++ b/assets/cubyz/recipes/cloth_recipes.zig.zon @@ -8,6 +8,6 @@ .inputs = .{"4 cubyz:copper_ingot"}, .output = "cubyz:silver_ingot", .reversible = true, - .craftingTags = .{.alchemy} + .craftingTags = .{.alchemy}, }, } diff --git a/src/callbacks/block/client/open_crafting_window.zig b/src/callbacks/block/client/open_crafting_window.zig index 2740d59d65..3ce9930513 100644 --- a/src/callbacks/block/client/open_crafting_window.zig +++ b/src/callbacks/block/client/open_crafting_window.zig @@ -21,5 +21,6 @@ pub fn init(zon: ZonElement, _: main.callbacks.Creator) ?*@This() { pub fn run(self: *@This(), _: main.callbacks.ClientBlockCallback.Params) main.callbacks.Result { main.gui.windowlist.inventory_crafting.openFromCallback(self.craftingTags); main.Window.setMouseGrabbed(false); + defer main.stackAllocator.free(self.craftingTags); return .handled; } diff --git a/src/gui/windows/inventory_crafting.zig b/src/gui/windows/inventory_crafting.zig index 84c80c1297..77d8e5fdfd 100644 --- a/src/gui/windows/inventory_crafting.zig +++ b/src/gui/windows/inventory_crafting.zig @@ -43,7 +43,6 @@ pub fn init() void { arrowTexture = Texture.initFromFile("assets/cubyz/ui/inventory/crafting_arrow.png"); craftableFromTags = main.stackAllocator.alloc(main.Tag, 1); craftableFromTags[0] = main.Tag.handCraftable; - main.stackAllocator.free(craftableFromTags); } pub fn deinit() void { @@ -111,7 +110,7 @@ fn findAvailableRecipes(list: *VerticalList) bool { continue :middle; } } - continue :outer; // Ingredient not found or not craftable by this. + continue :outer; // Recipe not craftable by this. } // All ingredients found: Add it to the list. const inv = ClientInventory.init(main.globalAllocator, recipe.sourceItems.len + 1, .{.crafting = recipe}, .other, .{}); diff --git a/src/items/recipes.zig b/src/items/recipes.zig index 04dc0de36a..a32b929d37 100644 --- a/src/items/recipes.zig +++ b/src/items/recipes.zig @@ -226,8 +226,8 @@ pub fn parseRecipe(zon: ZonElement, list: *main.ListManaged(Recipe)) !void { defaultCraftingTags[0] = main.Tag.handCraftable; const foundCraftingTags = Tag.loadTagsFromZon(arena, zon.getChild("craftingTags")); const craftingTags = if (foundCraftingTags.len != 0) foundCraftingTags else defaultCraftingTags; - defer arena.free(foundCraftingTags); defer arena.free(defaultCraftingTags); + defer arena.free(foundCraftingTags); defer arena.free(craftingTags); const itemCombos = try generateItemCombos(arena, recipeItems); From 62114ed91e3f486cb09f0c0603475aa5edd59089 Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Wed, 15 Jul 2026 20:59:23 -0700 Subject: [PATCH 10/36] Update transmutation_workbench.zig.zon --- assets/cubyz/blocks/transmutation_workbench.zig.zon | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/cubyz/blocks/transmutation_workbench.zig.zon b/assets/cubyz/blocks/transmutation_workbench.zig.zon index cde732cf25..032cfdfb4c 100644 --- a/assets/cubyz/blocks/transmutation_workbench.zig.zon +++ b/assets/cubyz/blocks/transmutation_workbench.zig.zon @@ -9,6 +9,6 @@ .texture = "cubyz:aerosoil", .onInteract = .{ .type = .open_crafting_window, - .craftingTags = .{.alchemy} + .craftingTags = .{.alchemy}, }, } From fead97906d892028156ad4c681f26436ab2927df Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Thu, 16 Jul 2026 13:17:05 -0700 Subject: [PATCH 11/36] its not yelling about a leak anymore --- src/callbacks/block/client/open_crafting_window.zig | 4 ++-- src/items/recipes.zig | 3 --- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/callbacks/block/client/open_crafting_window.zig b/src/callbacks/block/client/open_crafting_window.zig index 3ce9930513..9d6f39e3dd 100644 --- a/src/callbacks/block/client/open_crafting_window.zig +++ b/src/callbacks/block/client/open_crafting_window.zig @@ -10,7 +10,7 @@ craftingTags: []main.Tag, pub fn init(zon: ZonElement, _: main.callbacks.Creator) ?*@This() { const result = main.worldArena.create(@This()); - const craftingTags = main.Tag.loadTagsFromZon(main.stackAllocator, zon.getChild("craftingTags")); + const craftingTags = main.Tag.loadTagsFromZon(main.worldArena, zon.getChild("craftingTags")); if (craftingTags.len == 0) std.log.err("Error: Missing craftingTags \"name\" for open_crafting_window event.", .{}); result.* = .{ .craftingTags = craftingTags, @@ -21,6 +21,6 @@ pub fn init(zon: ZonElement, _: main.callbacks.Creator) ?*@This() { pub fn run(self: *@This(), _: main.callbacks.ClientBlockCallback.Params) main.callbacks.Result { main.gui.windowlist.inventory_crafting.openFromCallback(self.craftingTags); main.Window.setMouseGrabbed(false); - defer main.stackAllocator.free(self.craftingTags); + defer main.worldArena.free(self.craftingTags); return .handled; } diff --git a/src/items/recipes.zig b/src/items/recipes.zig index a32b929d37..13a3a7dac3 100644 --- a/src/items/recipes.zig +++ b/src/items/recipes.zig @@ -226,9 +226,6 @@ pub fn parseRecipe(zon: ZonElement, list: *main.ListManaged(Recipe)) !void { defaultCraftingTags[0] = main.Tag.handCraftable; const foundCraftingTags = Tag.loadTagsFromZon(arena, zon.getChild("craftingTags")); const craftingTags = if (foundCraftingTags.len != 0) foundCraftingTags else defaultCraftingTags; - defer arena.free(defaultCraftingTags); - defer arena.free(foundCraftingTags); - defer arena.free(craftingTags); const itemCombos = try generateItemCombos(arena, recipeItems); for (itemCombos) |itemCombo| { From ec20e1d94ceef6dbddfa43500eff3950c7b8700b Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Sat, 18 Jul 2026 08:09:19 -0700 Subject: [PATCH 12/36] Update open_crafting_window.zig --- src/callbacks/block/client/open_crafting_window.zig | 1 - 1 file changed, 1 deletion(-) diff --git a/src/callbacks/block/client/open_crafting_window.zig b/src/callbacks/block/client/open_crafting_window.zig index 9d6f39e3dd..e26bc30074 100644 --- a/src/callbacks/block/client/open_crafting_window.zig +++ b/src/callbacks/block/client/open_crafting_window.zig @@ -21,6 +21,5 @@ pub fn init(zon: ZonElement, _: main.callbacks.Creator) ?*@This() { pub fn run(self: *@This(), _: main.callbacks.ClientBlockCallback.Params) main.callbacks.Result { main.gui.windowlist.inventory_crafting.openFromCallback(self.craftingTags); main.Window.setMouseGrabbed(false); - defer main.worldArena.free(self.craftingTags); return .handled; } From 6c22f1a6ec4a027d6106d0ac49010928944333c4 Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Wed, 22 Jul 2026 10:47:22 -0700 Subject: [PATCH 13/36] Update inventory_crafting.zig --- src/gui/windows/inventory_crafting.zig | 1 - 1 file changed, 1 deletion(-) diff --git a/src/gui/windows/inventory_crafting.zig b/src/gui/windows/inventory_crafting.zig index 77d8e5fdfd..56363cc26b 100644 --- a/src/gui/windows/inventory_crafting.zig +++ b/src/gui/windows/inventory_crafting.zig @@ -47,7 +47,6 @@ pub fn init() void { pub fn deinit() void { arrowTexture.deinit(); - main.stackAllocator.free(craftableFromTags); } pub fn openFromCallback(craftingTags: []main.Tag) void { From 350d9f66ee1855c6a68622eedcf6d38a33fe2736 Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Wed, 22 Jul 2026 11:41:11 -0700 Subject: [PATCH 14/36] fixed getting stuck with crafting table recipie bug --- src/gui/GuiWindow.zig | 2 ++ src/gui/gui.zig | 1 + src/gui/windows/inventory_crafting.zig | 5 +++++ src/items.zig | 1 - 4 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/gui/GuiWindow.zig b/src/gui/GuiWindow.zig index a71bd7fc2f..6db34e2706 100644 --- a/src/gui/GuiWindow.zig +++ b/src/gui/GuiWindow.zig @@ -73,6 +73,8 @@ onOpenFn: *const fn () void = &defaultFunction, onCloseFn: *const fn () void = &defaultFunction, +onToggleWindowFn: *const fn () void = &defaultFunction, + var grabbedWindow: *const GuiWindow = undefined; var windowMoving: bool = false; var grabPosition: ?Vec2f = null; diff --git a/src/gui/gui.zig b/src/gui/gui.zig index 87a440a874..512ba7a7d5 100644 --- a/src/gui/gui.zig +++ b/src/gui/gui.zig @@ -649,6 +649,7 @@ pub fn toggleGameMenu() void { _ = openWindows.swapRemove(i); window.onCloseFn(); } else { + window.onToggleWindowFn(); i += 1; } } diff --git a/src/gui/windows/inventory_crafting.zig b/src/gui/windows/inventory_crafting.zig index 56363cc26b..720ecfc043 100644 --- a/src/gui/windows/inventory_crafting.zig +++ b/src/gui/windows/inventory_crafting.zig @@ -189,6 +189,11 @@ pub fn onClose() void { inventories.deinit(); } +pub fn onToggleWindowFn() void { + craftableFromTags[0] = main.Tag.handCraftable; + refresh(); +} + pub fn update() void { refresh(); } diff --git a/src/items.zig b/src/items.zig index da9213bf29..609990aadd 100644 --- a/src/items.zig +++ b/src/items.zig @@ -1344,7 +1344,6 @@ pub const Recipe = struct { // MARK: Recipe pub fn toBytes(self: *const Recipe, writer: *BinaryWriter) void { writer.writeEnum(BaseItemIndex, self.resultItem); writer.writeVarInt(u16, self.resultAmount); - writer.writeVarInt(u16, self.resultAmount); writer.writeVarInt(usize, self.sourceItems.len); for (self.sourceItems, self.sourceAmounts) |item, amount| { writer.writeEnum(BaseItemIndex, item); From a0f73d63054e65d880c86c01e96dc3f7e22ecebf Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Wed, 22 Jul 2026 13:44:18 -0700 Subject: [PATCH 15/36] Update inventory_crafting.zig --- src/gui/windows/inventory_crafting.zig | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gui/windows/inventory_crafting.zig b/src/gui/windows/inventory_crafting.zig index 720ecfc043..7383dde3dc 100644 --- a/src/gui/windows/inventory_crafting.zig +++ b/src/gui/windows/inventory_crafting.zig @@ -47,6 +47,7 @@ pub fn init() void { pub fn deinit() void { arrowTexture.deinit(); + main.stackAllocator.free(craftableFromTags); } pub fn openFromCallback(craftingTags: []main.Tag) void { From a9618e9c2c5157c43a09cf823a0e3575e0f76c28 Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Thu, 27 Aug 2026 10:42:33 -0700 Subject: [PATCH 16/36] still kinda broken --- src/gui/gui.zig | 2 +- src/gui/windows/inventory_crafting.zig | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/gui/gui.zig b/src/gui/gui.zig index 512ba7a7d5..b63c50d7fe 100644 --- a/src/gui/gui.zig +++ b/src/gui/gui.zig @@ -131,7 +131,7 @@ pub fn initWindowList() void { const windowStruct = @field(windowlist, decl.name); windowStruct.window.id = decl.name; addWindow(&windowStruct.window); - const functionNames = [_][]const u8{"render", "update", "updateSelected", "updateHovered", "onOpen", "onClose"}; + const functionNames = [_][]const u8{"render", "update", "updateSelected", "updateHovered", "onOpen", "onClose", "onToggleWindow"}; inline for (functionNames) |function| { if (@hasDecl(windowStruct, function)) { @field(windowStruct.window, function ++ "Fn") = &@field(windowStruct, function); diff --git a/src/gui/windows/inventory_crafting.zig b/src/gui/windows/inventory_crafting.zig index 7383dde3dc..a7f8e7dc31 100644 --- a/src/gui/windows/inventory_crafting.zig +++ b/src/gui/windows/inventory_crafting.zig @@ -41,13 +41,11 @@ pub var craftableFromTags: []main.Tag = undefined; pub fn init() void { arrowTexture = Texture.initFromFile("assets/cubyz/ui/inventory/crafting_arrow.png"); - craftableFromTags = main.stackAllocator.alloc(main.Tag, 1); - craftableFromTags[0] = main.Tag.handCraftable; + craftableFromTags = .{main.Tag.handCraftable}; } pub fn deinit() void { arrowTexture.deinit(); - main.stackAllocator.free(craftableFromTags); } pub fn openFromCallback(craftingTags: []main.Tag) void { @@ -190,8 +188,9 @@ pub fn onClose() void { inventories.deinit(); } -pub fn onToggleWindowFn() void { - craftableFromTags[0] = main.Tag.handCraftable; +pub fn onToggleWindow() void { + craftableFromTags[0] = .{main.Tag.handCraftable}; + std.log.debug("hello", .{}); refresh(); } From 7d2407423465f177525cecbd96c3a1fedbf9985d Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Tue, 8 Sep 2026 19:19:54 -0700 Subject: [PATCH 17/36] moved to next pr --- src/gui/windows/inventory_crafting.zig | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/src/gui/windows/inventory_crafting.zig b/src/gui/windows/inventory_crafting.zig index a7f8e7dc31..9224473a95 100644 --- a/src/gui/windows/inventory_crafting.zig +++ b/src/gui/windows/inventory_crafting.zig @@ -37,24 +37,15 @@ var itemAmount: main.ListManaged(u32) = undefined; var inventories: main.ListManaged(ClientInventory) = undefined; pub var arrowTexture: Texture = undefined; -pub var craftableFromTags: []main.Tag = undefined; pub fn init() void { arrowTexture = Texture.initFromFile("assets/cubyz/ui/inventory/crafting_arrow.png"); - craftableFromTags = .{main.Tag.handCraftable}; } pub fn deinit() void { arrowTexture.deinit(); } -pub fn openFromCallback(craftingTags: []main.Tag) void { - gui.closeWindowFromRef(&window); - gui.openWindowFromRef(&window); - craftableFromTags = craftingTags; - main.Window.setMouseGrabbed(false); -} - fn addItemStackToAvailable(itemStack: ItemStack) void { if (itemStack.item == .baseItem) { const baseItem = itemStack.item.baseItem; @@ -102,14 +93,6 @@ fn findAvailableRecipes(list: *VerticalList) bool { } continue :outer; // Ingredient not found. } - middle: for (recipe.craftingTags) |tag| { - for (craftableFromTags) |craftingStationTag| { - if (tag == craftingStationTag) { - continue :middle; - } - } - continue :outer; // Recipe not craftable by this. - } // All ingredients found: Add it to the list. const inv = ClientInventory.init(main.globalAllocator, recipe.sourceItems.len + 1, .{.crafting = recipe}, .other, .{}); @@ -188,12 +171,6 @@ pub fn onClose() void { inventories.deinit(); } -pub fn onToggleWindow() void { - craftableFromTags[0] = .{main.Tag.handCraftable}; - std.log.debug("hello", .{}); - refresh(); -} - pub fn update() void { refresh(); } From 447a92b5cc4bad200e8241354e6e2708646f37c1 Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Tue, 8 Sep 2026 19:21:06 -0700 Subject: [PATCH 18/36] moved to other pr --- .../block/client/open_crafting_window.zig | 25 ------------------- 1 file changed, 25 deletions(-) delete mode 100644 src/callbacks/block/client/open_crafting_window.zig diff --git a/src/callbacks/block/client/open_crafting_window.zig b/src/callbacks/block/client/open_crafting_window.zig deleted file mode 100644 index e26bc30074..0000000000 --- a/src/callbacks/block/client/open_crafting_window.zig +++ /dev/null @@ -1,25 +0,0 @@ -const std = @import("std"); - -const main = @import("main"); -const Block = main.blocks.Block; -const vec = main.vec; -const Vec3i = vec.Vec3i; -const ZonElement = main.ZonElement; - -craftingTags: []main.Tag, - -pub fn init(zon: ZonElement, _: main.callbacks.Creator) ?*@This() { - const result = main.worldArena.create(@This()); - const craftingTags = main.Tag.loadTagsFromZon(main.worldArena, zon.getChild("craftingTags")); - if (craftingTags.len == 0) std.log.err("Error: Missing craftingTags \"name\" for open_crafting_window event.", .{}); - result.* = .{ - .craftingTags = craftingTags, - }; - return result; -} - -pub fn run(self: *@This(), _: main.callbacks.ClientBlockCallback.Params) main.callbacks.Result { - main.gui.windowlist.inventory_crafting.openFromCallback(self.craftingTags); - main.Window.setMouseGrabbed(false); - return .handled; -} From 7df53f49e7781f2342a393f33e6b2f8441a3450a Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Tue, 8 Sep 2026 19:22:14 -0700 Subject: [PATCH 19/36] also moved --- src/callbacks/block/client/_list.zig | 1 - 1 file changed, 1 deletion(-) diff --git a/src/callbacks/block/client/_list.zig b/src/callbacks/block/client/_list.zig index c056756e4a..9a77fb7eb6 100644 --- a/src/callbacks/block/client/_list.zig +++ b/src/callbacks/block/client/_list.zig @@ -1,4 +1,3 @@ pub const edit_sign = @import("edit_sign.zig"); pub const open_chest = @import("open_chest.zig"); pub const open_window = @import("open_window.zig"); -pub const open_crafting_window = @import("open_crafting_window.zig"); From b0132cda6a4374d4b145b5f82e4b1bd77bb041c7 Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Tue, 13 Oct 2026 15:29:58 -0700 Subject: [PATCH 20/36] gonna be honest i dunno why i added this --- src/callbacks/block/client/edit_sign.zig | 2 +- src/callbacks/block/client/open_chest.zig | 2 +- src/callbacks/block/client/open_window.zig | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/callbacks/block/client/edit_sign.zig b/src/callbacks/block/client/edit_sign.zig index 860baf9105..ba6b1de9ae 100644 --- a/src/callbacks/block/client/edit_sign.zig +++ b/src/callbacks/block/client/edit_sign.zig @@ -12,7 +12,7 @@ pub fn init(_: ZonElement, _: main.callbacks.Creator) ?*anyopaque { pub fn run(_: *anyopaque, params: main.callbacks.ClientBlockCallback.Params) main.callbacks.Result { if (params.block.blockEntity() == null or !std.mem.eql(u8, params.block.blockEntity().?.id, "cubyz:sign")) { - std.log.err("Error: Can only edit sign if block entity of the block is a sign.", .{}); + std.log.err("Can only edit sign if block entity of the block is a sign.", .{}); return .ignored; } main.block_entity.BlockEntityTypes.@"cubyz:sign".StorageClient.mutex.lock(); diff --git a/src/callbacks/block/client/open_chest.zig b/src/callbacks/block/client/open_chest.zig index e4fe21cf13..a4846117ab 100644 --- a/src/callbacks/block/client/open_chest.zig +++ b/src/callbacks/block/client/open_chest.zig @@ -12,7 +12,7 @@ pub fn init(_: ZonElement, _: main.callbacks.Creator) ?*anyopaque { pub fn run(_: *anyopaque, params: main.callbacks.ClientBlockCallback.Params) main.callbacks.Result { if (params.block.blockEntity() == null or !std.mem.eql(u8, params.block.blockEntity().?.id, "cubyz:chest")) { - std.log.err("Error: Can only open chest if block entity of the block is a chest.", .{}); + std.log.err("Can only open chest if block entity of the block is a chest.", .{}); return .ignored; } main.network.protocols.blockEntityUpdate.sendClientDataUpdateToServer(main.game.world.?.conn, params.blockPos); diff --git a/src/callbacks/block/client/open_window.zig b/src/callbacks/block/client/open_window.zig index ea08f8722a..f67fa9bfc0 100644 --- a/src/callbacks/block/client/open_window.zig +++ b/src/callbacks/block/client/open_window.zig @@ -12,7 +12,7 @@ pub fn init(zon: ZonElement, _: main.callbacks.Creator) ?*@This() { const result = main.worldArena.create(@This()); result.* = .{ .windowName = main.worldArena.dupe(u8, zon.get([]const u8, "name") orelse { - std.log.err("Error: Missing field \"name\" for open_window event.", .{}); + std.log.err("Missing field \"name\" for open_window event.", .{}); return null; }), }; From 7ea78916c2b82ede6c9d36fc7848649d1edd8505 Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Tue, 13 Oct 2026 15:32:31 -0700 Subject: [PATCH 21/36] this is for a different pr --- src/gui/GuiWindow.zig | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/gui/GuiWindow.zig b/src/gui/GuiWindow.zig index 6db34e2706..a71bd7fc2f 100644 --- a/src/gui/GuiWindow.zig +++ b/src/gui/GuiWindow.zig @@ -73,8 +73,6 @@ onOpenFn: *const fn () void = &defaultFunction, onCloseFn: *const fn () void = &defaultFunction, -onToggleWindowFn: *const fn () void = &defaultFunction, - var grabbedWindow: *const GuiWindow = undefined; var windowMoving: bool = false; var grabPosition: ?Vec2f = null; From 343606aef8179a9fe6eedb3cbec9742a9cbe5db2 Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Tue, 13 Oct 2026 15:34:05 -0700 Subject: [PATCH 22/36] again not for this --- .../cubyz/blocks/transmutation_workbench.zig.zon | 14 -------------- assets/cubyz/recipes/cloth_recipes.zig.zon | 6 ------ src/gui/gui.zig | 2 +- 3 files changed, 1 insertion(+), 21 deletions(-) delete mode 100644 assets/cubyz/blocks/transmutation_workbench.zig.zon diff --git a/assets/cubyz/blocks/transmutation_workbench.zig.zon b/assets/cubyz/blocks/transmutation_workbench.zig.zon deleted file mode 100644 index 032cfdfb4c..0000000000 --- a/assets/cubyz/blocks/transmutation_workbench.zig.zon +++ /dev/null @@ -1,14 +0,0 @@ -.{ - .tags = .{.diggable}, - .blockHealth = 6.5, - .drops = .{ - .{.items = .{.auto}}, - }, - .model = "cubyz:cube", - .rotation = "cubyz:stairs", - .texture = "cubyz:aerosoil", - .onInteract = .{ - .type = .open_crafting_window, - .craftingTags = .{.alchemy}, - }, -} diff --git a/assets/cubyz/recipes/cloth_recipes.zig.zon b/assets/cubyz/recipes/cloth_recipes.zig.zon index a8da98d2d1..9a5e00ffa3 100644 --- a/assets/cubyz/recipes/cloth_recipes.zig.zon +++ b/assets/cubyz/recipes/cloth_recipes.zig.zon @@ -4,10 +4,4 @@ .output = "cubyz:cloth/block/{color}", .reversible = true, }, - .{ - .inputs = .{"4 cubyz:copper_ingot"}, - .output = "cubyz:silver_ingot", - .reversible = true, - .craftingTags = .{.alchemy}, - }, } diff --git a/src/gui/gui.zig b/src/gui/gui.zig index b63c50d7fe..512ba7a7d5 100644 --- a/src/gui/gui.zig +++ b/src/gui/gui.zig @@ -131,7 +131,7 @@ pub fn initWindowList() void { const windowStruct = @field(windowlist, decl.name); windowStruct.window.id = decl.name; addWindow(&windowStruct.window); - const functionNames = [_][]const u8{"render", "update", "updateSelected", "updateHovered", "onOpen", "onClose", "onToggleWindow"}; + const functionNames = [_][]const u8{"render", "update", "updateSelected", "updateHovered", "onOpen", "onClose"}; inline for (functionNames) |function| { if (@hasDecl(windowStruct, function)) { @field(windowStruct.window, function ++ "Fn") = &@field(windowStruct, function); From 5c380e23e268090f8e753ac84f1a29909fa563ae Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Tue, 13 Oct 2026 15:35:11 -0700 Subject: [PATCH 23/36] for different --- src/gui/gui.zig | 1 - 1 file changed, 1 deletion(-) diff --git a/src/gui/gui.zig b/src/gui/gui.zig index 512ba7a7d5..87a440a874 100644 --- a/src/gui/gui.zig +++ b/src/gui/gui.zig @@ -649,7 +649,6 @@ pub fn toggleGameMenu() void { _ = openWindows.swapRemove(i); window.onCloseFn(); } else { - window.onToggleWindowFn(); i += 1; } } From 9c561133178f27d72b44cbd96b23ea30825d2c50 Mon Sep 17 00:00:00 2001 From: Crepestrom Date: Wed, 21 Oct 2026 10:17:48 -0700 Subject: [PATCH 24/36] Update src/items.zig Co-authored-by: IntegratedQuantum <43880493+IntegratedQuantum@users.noreply.github.com> --- src/items.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/items.zig b/src/items.zig index 3b2ab213db..6fc537f150 100644 --- a/src/items.zig +++ b/src/items.zig @@ -1321,7 +1321,7 @@ pub const Recipe = struct { // MARK: Recipe sourceAmounts: []u16, resultItem: BaseItemIndex, resultAmount: u16, - craftingTags: []Tag, + craftingTags: []const Tag, fn getValidRecipe(self: Recipe) error{Invalid}!*Recipe { outer: for (main.items.getRecipes()) |*recipe| { From 4403827f4b86fbb59fefb323dd4f6c9a3bd45c13 Mon Sep 17 00:00:00 2001 From: Crepestrom Date: Wed, 21 Oct 2026 10:18:20 -0700 Subject: [PATCH 25/36] Update src/items.zig Co-authored-by: IntegratedQuantum <43880493+IntegratedQuantum@users.noreply.github.com> --- src/items.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/items.zig b/src/items.zig index 6fc537f150..18d3cdb793 100644 --- a/src/items.zig +++ b/src/items.zig @@ -1374,7 +1374,7 @@ pub const Recipe = struct { // MARK: Recipe var craftingTagTypes: main.List(Tag) = .initCapacity(main.stackAllocator, @min(256, tagCount)); defer craftingTagTypes.deinit(main.stackAllocator); - while (reader.remaining.len > 0 and craftingTagTypes.items.len < tagCount) { + while (craftingTagTypes.items.len < tagCount) { craftingTagTypes.append(main.stackAllocator, try reader.readEnum(Tag)); } From ad277bf713ceb72053f4591a962bab9712e4e681 Mon Sep 17 00:00:00 2001 From: Crepestrom Date: Wed, 21 Oct 2026 10:18:55 -0700 Subject: [PATCH 26/36] Update src/items/recipes.zig Co-authored-by: IntegratedQuantum <43880493+IntegratedQuantum@users.noreply.github.com> --- src/items/recipes.zig | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/items/recipes.zig b/src/items/recipes.zig index 13a3a7dac3..ce044028ed 100644 --- a/src/items/recipes.zig +++ b/src/items/recipes.zig @@ -222,8 +222,7 @@ pub fn parseRecipe(zon: ZonElement, list: *main.ListManaged(Recipe)) !void { return error.InvalidReversibleRecipe; } - var defaultCraftingTags = arena.alloc(main.Tag, 1); - defaultCraftingTags[0] = main.Tag.handCraftable; + const defaultCraftingTags: []const Tag = &.{.handCraftable}; const foundCraftingTags = Tag.loadTagsFromZon(arena, zon.getChild("craftingTags")); const craftingTags = if (foundCraftingTags.len != 0) foundCraftingTags else defaultCraftingTags; From bf7843edd07ce6cc8d2c2e1c857b9d77a7493ad1 Mon Sep 17 00:00:00 2001 From: Crepestrom Date: Wed, 21 Oct 2026 10:19:14 -0700 Subject: [PATCH 27/36] Update src/items/recipes.zig Co-authored-by: IntegratedQuantum <43880493+IntegratedQuantum@users.noreply.github.com> --- src/items/recipes.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/items/recipes.zig b/src/items/recipes.zig index ce044028ed..5eb4661aad 100644 --- a/src/items/recipes.zig +++ b/src/items/recipes.zig @@ -198,7 +198,7 @@ pub fn addRecipe(itemCombo: []const ItemWithAmount, list: *main.ListManaged(Reci .sourceAmounts = main.worldArena.alloc(u16, inputs.len), .resultItem = output.item, .resultAmount = output.amount, - .craftingTags = main.worldArena.alloc(Tag, craftingTags.len), + .craftingTags = main.worldArena.dupe(Tag, craftingTags.len), }; for (inputs, 0..) |input, i| { recipe.sourceItems[i] = input.item; From bf46fefaf8fa763559acc59d5d370d5c3e896ce6 Mon Sep 17 00:00:00 2001 From: Crepestrom Date: Wed, 21 Oct 2026 10:19:23 -0700 Subject: [PATCH 28/36] Update src/items/recipes.zig Co-authored-by: IntegratedQuantum <43880493+IntegratedQuantum@users.noreply.github.com> --- src/items/recipes.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/items/recipes.zig b/src/items/recipes.zig index 5eb4661aad..f682396bcb 100644 --- a/src/items/recipes.zig +++ b/src/items/recipes.zig @@ -190,7 +190,7 @@ fn generateItemCombos(allocator: NeverFailingAllocator, recipe: []const ZonEleme return newInputCombos; } -pub fn addRecipe(itemCombo: []const ItemWithAmount, list: *main.ListManaged(Recipe), craftingTags: []Tag) void { +pub fn addRecipe(itemCombo: []const ItemWithAmount, list: *main.ListManaged(Recipe), craftingTags: []const Tag) void { const inputs = itemCombo[0 .. itemCombo.len - 1]; const output = itemCombo[itemCombo.len - 1]; const recipe = Recipe{ From 1b89fbf14f580a64a220df01a3f3bfa352dd1704 Mon Sep 17 00:00:00 2001 From: Crepestrom Date: Wed, 21 Oct 2026 10:22:35 -0700 Subject: [PATCH 29/36] Update src/items/recipes.zig Co-authored-by: IntegratedQuantum <43880493+IntegratedQuantum@users.noreply.github.com> --- src/items/recipes.zig | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/items/recipes.zig b/src/items/recipes.zig index f682396bcb..0a9e586a16 100644 --- a/src/items/recipes.zig +++ b/src/items/recipes.zig @@ -204,9 +204,6 @@ pub fn addRecipe(itemCombo: []const ItemWithAmount, list: *main.ListManaged(Reci recipe.sourceItems[i] = input.item; recipe.sourceAmounts[i] = input.amount; } - for (craftingTags, 0..) |tag, i| { - recipe.craftingTags[i] = tag; - } list.append(recipe); } From c9cd34feed20cd3090184367f00cc9c786ba6bb5 Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Wed, 21 Oct 2026 10:31:01 -0700 Subject: [PATCH 30/36] changed the binary reader and writer --- src/items.zig | 5 ++--- src/items/recipes.zig | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/items.zig b/src/items.zig index 18d3cdb793..83f805b92e 100644 --- a/src/items.zig +++ b/src/items.zig @@ -1349,9 +1349,8 @@ pub const Recipe = struct { // MARK: Recipe writer.writeEnum(BaseItemIndex, item); writer.writeVarInt(u16, amount); } - writer.writeVarInt(usize, self.craftingTags.len); for (self.craftingTags) |tag| { - writer.writeEnum(Tag, tag); + writer.writeSliceWithSize(tag.getName()); } } @@ -1375,7 +1374,7 @@ pub const Recipe = struct { // MARK: Recipe defer craftingTagTypes.deinit(main.stackAllocator); while (craftingTagTypes.items.len < tagCount) { - craftingTagTypes.append(main.stackAllocator, try reader.readEnum(Tag)); + craftingTagTypes.append(main.stackAllocator, Tag.get(try reader.readSliceWithSize())); } return getValidRecipe(.{.sourceItems = sourceItems.items, .sourceAmounts = sourceAmounts.items, .resultItem = resultItem, .resultAmount = resultAmount, .craftingTags = craftingTagTypes.items}); diff --git a/src/items/recipes.zig b/src/items/recipes.zig index f682396bcb..4918e5700e 100644 --- a/src/items/recipes.zig +++ b/src/items/recipes.zig @@ -198,7 +198,7 @@ pub fn addRecipe(itemCombo: []const ItemWithAmount, list: *main.ListManaged(Reci .sourceAmounts = main.worldArena.alloc(u16, inputs.len), .resultItem = output.item, .resultAmount = output.amount, - .craftingTags = main.worldArena.dupe(Tag, craftingTags.len), + .craftingTags = main.worldArena.dupe(Tag, craftingTags), }; for (inputs, 0..) |input, i| { recipe.sourceItems[i] = input.item; From 318ec632c445071bddb7220e3d3ff6a66fb66524 Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Wed, 21 Oct 2026 10:37:03 -0700 Subject: [PATCH 31/36] im gonna do this because i dont want players to be able to register random tags to the server --- src/items.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/items.zig b/src/items.zig index 83f805b92e..2b55241767 100644 --- a/src/items.zig +++ b/src/items.zig @@ -1374,7 +1374,7 @@ pub const Recipe = struct { // MARK: Recipe defer craftingTagTypes.deinit(main.stackAllocator); while (craftingTagTypes.items.len < tagCount) { - craftingTagTypes.append(main.stackAllocator, Tag.get(try reader.readSliceWithSize())); + craftingTagTypes.append(main.stackAllocator, try Tag.get(try reader.readSliceWithSize())); } return getValidRecipe(.{.sourceItems = sourceItems.items, .sourceAmounts = sourceAmounts.items, .resultItem = resultItem, .resultAmount = resultAmount, .craftingTags = craftingTagTypes.items}); From e8f6fecdcde81ef28d853ce9ed67547ed0b99ddb Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Wed, 21 Oct 2026 11:03:25 -0700 Subject: [PATCH 32/36] ooops need to return a error type --- src/items.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/items.zig b/src/items.zig index 2b55241767..caeca89476 100644 --- a/src/items.zig +++ b/src/items.zig @@ -1374,7 +1374,7 @@ pub const Recipe = struct { // MARK: Recipe defer craftingTagTypes.deinit(main.stackAllocator); while (craftingTagTypes.items.len < tagCount) { - craftingTagTypes.append(main.stackAllocator, try Tag.get(try reader.readSliceWithSize())); + craftingTagTypes.append(main.stackAllocator, Tag.get(try reader.readSliceWithSize()) orelse return error.invalidTag); } return getValidRecipe(.{.sourceItems = sourceItems.items, .sourceAmounts = sourceAmounts.items, .resultItem = resultItem, .resultAmount = resultAmount, .craftingTags = craftingTagTypes.items}); From f324620ac8374c5e71860415828f5530e4496184 Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Wed, 21 Oct 2026 15:16:56 -0700 Subject: [PATCH 33/36] that wasnt needed --- src/items.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/items.zig b/src/items.zig index caeca89476..6f69f37536 100644 --- a/src/items.zig +++ b/src/items.zig @@ -1370,7 +1370,7 @@ pub const Recipe = struct { // MARK: Recipe } const tagCount = try reader.readVarInt(usize); - var craftingTagTypes: main.List(Tag) = .initCapacity(main.stackAllocator, @min(256, tagCount)); + var craftingTagTypes: main.List(Tag) = .initCapacity(main.stackAllocator, tagCount); defer craftingTagTypes.deinit(main.stackAllocator); while (craftingTagTypes.items.len < tagCount) { From fb93f6d5cf54f3bf9e54fc9f249e75ba521620fd Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Wed, 21 Oct 2026 15:19:50 -0700 Subject: [PATCH 34/36] should have written that int --- src/items.zig | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/items.zig b/src/items.zig index 6f69f37536..fde05ab406 100644 --- a/src/items.zig +++ b/src/items.zig @@ -1349,6 +1349,7 @@ pub const Recipe = struct { // MARK: Recipe writer.writeEnum(BaseItemIndex, item); writer.writeVarInt(u16, amount); } + writer.writeVarInt(usize, self.craftingTags.len); for (self.craftingTags) |tag| { writer.writeSliceWithSize(tag.getName()); } @@ -1374,6 +1375,7 @@ pub const Recipe = struct { // MARK: Recipe defer craftingTagTypes.deinit(main.stackAllocator); while (craftingTagTypes.items.len < tagCount) { + std.log.debug("running {}", .{tagCount}); craftingTagTypes.append(main.stackAllocator, Tag.get(try reader.readSliceWithSize()) orelse return error.invalidTag); } From 0dcb42d34119aa3930360c1e39b6001ef53fdf7d Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Thu, 22 Oct 2026 11:21:37 -0700 Subject: [PATCH 35/36] added limit --- src/items.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/items.zig b/src/items.zig index fba66c1e0b..f7bbc8de6d 100644 --- a/src/items.zig +++ b/src/items.zig @@ -1371,7 +1371,7 @@ pub const Recipe = struct { // MARK: Recipe } const tagCount = try reader.readVarInt(usize); - var craftingTagTypes: main.List(Tag) = .initCapacity(main.stackAllocator, tagCount); + var craftingTagTypes: main.List(Tag) = .initCapacity(main.stackAllocator, @min(256, tagCount)); defer craftingTagTypes.deinit(main.stackAllocator); while (craftingTagTypes.items.len < tagCount) { From cc4eb5a490898b77320575ec400c2f8f192e3cb8 Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Thu, 22 Oct 2026 11:22:21 -0700 Subject: [PATCH 36/36] removed debugging print --- src/items.zig | 1 - 1 file changed, 1 deletion(-) diff --git a/src/items.zig b/src/items.zig index f7bbc8de6d..c6b7e3802a 100644 --- a/src/items.zig +++ b/src/items.zig @@ -1375,7 +1375,6 @@ pub const Recipe = struct { // MARK: Recipe defer craftingTagTypes.deinit(main.stackAllocator); while (craftingTagTypes.items.len < tagCount) { - std.log.debug("running {}", .{tagCount}); craftingTagTypes.append(main.stackAllocator, Tag.get(try reader.readSliceWithSize()) orelse return error.invalidTag); }