From 6f3f055d176832c3306831176ecfdb6fe34a7681 Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Sat, 6 Jun 2026 23:15:43 -0700 Subject: [PATCH 1/6] Almost just the Invetory window is broken --- src/Inventory.zig | 5 +++++ src/gui/windows/inventory.zig | 2 ++ src/sync.zig | 40 +++++++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+) diff --git a/src/Inventory.zig b/src/Inventory.zig index b07062a22c..a0938abe1d 100644 --- a/src/Inventory.zig +++ b/src/Inventory.zig @@ -531,6 +531,11 @@ pub const ClientInventory = struct { // MARK: ClientInventory main.sync.client.executeCommand(.{.craftProceduralItem = .init(destinations, workbenchInv)}); } + pub fn sortItems(target: ClientInventory) void { + const convertedInv: InventoryAndSlot = .{.inv = target.super, .slot = 0}; + main.sync.client.executeCommand(.{.sortItems = .{.target = convertedInv}}); + } + pub fn placeBlock(self: ClientInventory, slot: u32) void { std.debug.assert(self.type == .serverShared); main.renderer.MeshSelection.placeBlock(self, slot); diff --git a/src/gui/windows/inventory.zig b/src/gui/windows/inventory.zig index 44ff54009f..4159ab1a67 100644 --- a/src/gui/windows/inventory.zig +++ b/src/gui/windows/inventory.zig @@ -47,6 +47,8 @@ pub fn onOpen() void { // TODO: armor slots, backpack slot + stack-based backpack inventory, other items maybe? { const row = HorizontalList.init(); + const onUpdate: main.callbacks.SimpleCallback = .initWithPtr(Player.inventory.sortItems(), &@field(main.items.Inventory.ClientInventory, Player.inventory)); + row.add(Button.initIcon(.{32, 0}, .{32, 32}, craftingIcon, true, onUpdate)); blk: { row.add(GuiComponent.BagSlot.init(.{0, 0}, main.entity.components.@"cubyz:bag".client.getBag(main.game.Player.id) orelse break :blk)); } diff --git a/src/sync.zig b/src/sync.zig index 3dbcc26d27..fe78c26664 100644 --- a/src/sync.zig +++ b/src/sync.zig @@ -237,6 +237,7 @@ pub const Command = struct { // MARK: Command takeFromPlayerBag = 17, craftFrom = 13, craftProceduralItem = 15, + sortItems = 18, clear = 8, updateBlock = 9, addHealth = 10, @@ -257,6 +258,7 @@ pub const Command = struct { // MARK: Command takeFromPlayerBag: TakeFromPlayerBag, craftFrom: CraftFrom, craftProceduralItem: CraftProceduralItem, + sortItems: SortItems, clear: Clear, updateBlock: UpdateBlock, addHealth: AddHealth, @@ -1771,6 +1773,44 @@ pub const Command = struct { // MARK: Command }; } }; + + const SortItems = struct { // MARK: SortItems + target: InventoryAndSlot, + + fn run(self: SortItems, ctx: Context) error{serverFailure}!void { + // first compresses items before sorting + for (self.target.inv._items, 0..) |invStack, slot| { + if (invStack.item != .null) { + for (self.target.inv._items, @intCast(slot + 1)..) |checkedInvStack, checkedSlot| { + if (checkedInvStack.item != .null) { + if (std.meta.eql(invStack.item, checkedInvStack.item)) { + if (self.target.ref().amount >= invStack.item.stackSize()) return; + const amount = @min(invStack.item.stackSize() - self.target.ref().amount, self.target.ref().amount); + const dest: InventoryAndSlot = .{.inv = self.target.inv, .slot = @intCast(checkedSlot)}; + const source: InventoryAndSlot = .{.inv = self.target.inv, .slot = @intCast(slot)}; + ctx.execute(.{.move = .{ + .dest = dest, + .source = source, + .amount = amount, + }}); + } + } + } + } + } + // we sort out procedural tools first then generally try to put items with similar tags together + } + + fn serialize(self: SortItems, writer: *BinaryWriter) void { + self.target.write(writer); + } + + fn deserialize(reader: *BinaryReader, side: Side, user: ?*main.server.User) !SortItems { + return .{ + .target = try InventoryAndSlot.read(reader, side, user), + }; + } + }; }; pub threadlocal var threadContext: ThreadContext = .other; From 20bd7b8ec802ed91e01377d00fce8b253e3f3cbd Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Sun, 7 Jun 2026 10:39:31 -0700 Subject: [PATCH 2/6] the callback works but not the actual sorter --- src/Inventory.zig | 5 ----- src/gui/windows/inventory.zig | 9 +++++++-- src/sync.zig | 2 ++ 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/Inventory.zig b/src/Inventory.zig index a0938abe1d..b07062a22c 100644 --- a/src/Inventory.zig +++ b/src/Inventory.zig @@ -531,11 +531,6 @@ pub const ClientInventory = struct { // MARK: ClientInventory main.sync.client.executeCommand(.{.craftProceduralItem = .init(destinations, workbenchInv)}); } - pub fn sortItems(target: ClientInventory) void { - const convertedInv: InventoryAndSlot = .{.inv = target.super, .slot = 0}; - main.sync.client.executeCommand(.{.sortItems = .{.target = convertedInv}}); - } - pub fn placeBlock(self: ClientInventory, slot: u32) void { std.debug.assert(self.type == .serverShared); main.renderer.MeshSelection.placeBlock(self, slot); diff --git a/src/gui/windows/inventory.zig b/src/gui/windows/inventory.zig index 4159ab1a67..33998de05b 100644 --- a/src/gui/windows/inventory.zig +++ b/src/gui/windows/inventory.zig @@ -41,14 +41,19 @@ pub fn deinit() void { var itemSlots: [20]*ItemSlot = undefined; +pub fn sortItems(target: main.items.Inventory.ClientInventory) void { + const convertedInv: main.items.Inventory.InventoryAndSlot = .{.inv = target.super, .slot = 0}; + main.sync.client.executeCommand(.{.sortItems = .{.target = convertedInv}}); +} + pub fn onOpen() void { const list = VerticalList.init(.{padding, padding + 16}, 300, 0); // Some miscellanious slots and buttons: // TODO: armor slots, backpack slot + stack-based backpack inventory, other items maybe? { const row = HorizontalList.init(); - const onUpdate: main.callbacks.SimpleCallback = .initWithPtr(Player.inventory.sortItems(), &@field(main.items.Inventory.ClientInventory, Player.inventory)); - row.add(Button.initIcon(.{32, 0}, .{32, 32}, craftingIcon, true, onUpdate)); + const sortCallback: main.callbacks.SimpleCallback = .{.inner = @ptrCast(&sortItems), .data = &Player.inventory}; + row.add(Button.initIcon(.{32, 0}, .{32, 32}, craftingIcon, true, sortCallback)); blk: { row.add(GuiComponent.BagSlot.init(.{0, 0}, main.entity.components.@"cubyz:bag".client.getBag(main.game.Player.id) orelse break :blk)); } diff --git a/src/sync.zig b/src/sync.zig index fe78c26664..a7854e2c4c 100644 --- a/src/sync.zig +++ b/src/sync.zig @@ -1778,6 +1778,7 @@ pub const Command = struct { // MARK: Command target: InventoryAndSlot, fn run(self: SortItems, ctx: Context) error{serverFailure}!void { + std.log.debug("Running Sort", .{}); // first compresses items before sorting for (self.target.inv._items, 0..) |invStack, slot| { if (invStack.item != .null) { @@ -1788,6 +1789,7 @@ pub const Command = struct { // MARK: Command const amount = @min(invStack.item.stackSize() - self.target.ref().amount, self.target.ref().amount); const dest: InventoryAndSlot = .{.inv = self.target.inv, .slot = @intCast(checkedSlot)}; const source: InventoryAndSlot = .{.inv = self.target.inv, .slot = @intCast(slot)}; + std.log.debug("Moving objects", .{}); ctx.execute(.{.move = .{ .dest = dest, .source = source, From 0e6808c6a3e816db2a47ad30af8067dc213668d4 Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Sun, 7 Jun 2026 12:03:23 -0700 Subject: [PATCH 3/6] item compression now works --- src/sync.zig | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/sync.zig b/src/sync.zig index a7854e2c4c..bec915d851 100644 --- a/src/sync.zig +++ b/src/sync.zig @@ -1782,14 +1782,17 @@ pub const Command = struct { // MARK: Command // first compresses items before sorting for (self.target.inv._items, 0..) |invStack, slot| { if (invStack.item != .null) { - for (self.target.inv._items, @intCast(slot + 1)..) |checkedInvStack, checkedSlot| { + for (self.target.inv._items, 0..) |checkedInvStack, checkedSlot| { if (checkedInvStack.item != .null) { if (std.meta.eql(invStack.item, checkedInvStack.item)) { - if (self.target.ref().amount >= invStack.item.stackSize()) return; - const amount = @min(invStack.item.stackSize() - self.target.ref().amount, self.target.ref().amount); + if (self.target.ref().amount >= invStack.item.stackSize()) continue; + if (slot <= checkedSlot) continue; + const amount = @min(checkedInvStack.item.stackSize() - checkedInvStack.amount, invStack.amount); const dest: InventoryAndSlot = .{.inv = self.target.inv, .slot = @intCast(checkedSlot)}; const source: InventoryAndSlot = .{.inv = self.target.inv, .slot = @intCast(slot)}; std.log.debug("Moving objects", .{}); + std.log.debug("{}", .{invStack.item.stackSize() - invStack.amount}); + std.log.debug("{}", .{amount}); ctx.execute(.{.move = .{ .dest = dest, .source = source, From 2536e8d17b4c89eed3a347d812852ba23b343448 Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Sun, 7 Jun 2026 21:12:24 -0700 Subject: [PATCH 4/6] almost have procedural item sorting --- src/sync.zig | 48 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/src/sync.zig b/src/sync.zig index bec915d851..09c1ed85ee 100644 --- a/src/sync.zig +++ b/src/sync.zig @@ -1792,7 +1792,6 @@ pub const Command = struct { // MARK: Command const source: InventoryAndSlot = .{.inv = self.target.inv, .slot = @intCast(slot)}; std.log.debug("Moving objects", .{}); std.log.debug("{}", .{invStack.item.stackSize() - invStack.amount}); - std.log.debug("{}", .{amount}); ctx.execute(.{.move = .{ .dest = dest, .source = source, @@ -1804,6 +1803,53 @@ pub const Command = struct { // MARK: Command } } // we sort out procedural tools first then generally try to put items with similar tags together + for (self.target.inv._items, 0..) |invStack, slot| { + if (invStack.item == .proceduralItem) { + var dest: InventoryAndSlot = .{.inv = self.target.inv, .slot = 0}; + var source: InventoryAndSlot = .{.inv = self.target.inv, .slot = 0}; + for (self.target.inv._items, 0..) |checkedInvStack, checkedSlot| { + if (checkedInvStack.item != .proceduralItem) { + dest.slot = @intCast(checkedSlot); + source.slot = @intCast(slot); + break; + } + } + ctx.execute(.{.swap = .{ + .dest = dest, + .source = source, + }}); + } + } + for (self.target.inv._items, 0..) |invStack, slot| { + if (invStack.item != .proceduralItem) break; + std.log.debug("try tag sort", .{}); + var dest: InventoryAndSlot = .{.inv = self.target.inv, .slot = 0}; + var source: InventoryAndSlot = .{.inv = self.target.inv, .slot = 0}; + var foundSimilarTag = false; + std.log.debug("test {}", .{invStack.item.proceduralItem.type.tags().len}); + if (invStack.item.proceduralItem.type.tags().len == 0) continue; + std.log.debug("starting tag sort", .{}); + for (self.target.inv._items, 0..) |checkedInvStack, checkedSlot| { + if ((foundSimilarTag) or checkedInvStack.item != .proceduralItem) { + std.log.debug("found a proper swap", .{}); + dest.slot = @intCast(checkedSlot); + source.slot = @intCast(slot); + break; + } + if (checkedSlot == slot) continue; + if (checkedInvStack.item == .proceduralItem) { + if (checkedInvStack.item.proceduralItem.type.tags().len == 0) continue; + std.log.debug("{}", .{(invStack.item.proceduralItem.type.tags()[0])}); + if (checkedInvStack.item.proceduralItem.hasTag(invStack.item.proceduralItem.type.tags()[0])) foundSimilarTag = true; + } + } + std.log.debug("swapping {} {}", .{source.slot, dest.slot}); + ctx.execute(.{.swap = .{ + .dest = dest, + .source = source, + }}); + } + // then we sort normal items } fn serialize(self: SortItems, writer: *BinaryWriter) void { From 9b1e47d7257f0abaec95b26e232de1a4c84668d3 Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Sun, 7 Jun 2026 22:22:40 -0700 Subject: [PATCH 5/6] reordered tags and added more sorting tags --- assets/cubyz/blocks/basalt/_defaults.zig.zon | 2 +- assets/cubyz/blocks/chalk/_defaults.zig.zon | 2 +- assets/cubyz/blocks/ferrock/_defaults.zig.zon | 2 +- assets/cubyz/blocks/glacite/_defaults.zig.zon | 2 +- assets/cubyz/blocks/glass/_defaults.zig.zon | 2 +- .../blocks/glow_crystal/_defaults.zig.zon | 2 +- .../cubyz/blocks/limestone/_defaults.zig.zon | 2 +- assets/cubyz/blocks/marble/_defaults.zig.zon | 2 +- .../cubyz/blocks/nimbusite/_defaults.zig.zon | 2 +- .../cubyz/blocks/pyrolite/_defaults.zig.zon | 2 +- assets/cubyz/blocks/slate/_defaults.zig.zon | 2 +- .../cubyz/blocks/terracotta/_defaults.zig.zon | 2 +- .../cubyz/blocks/voidstone/_defaults.zig.zon | 2 +- src/sync.zig | 61 ++++++++++++++++++- 14 files changed, 71 insertions(+), 16 deletions(-) diff --git a/assets/cubyz/blocks/basalt/_defaults.zig.zon b/assets/cubyz/blocks/basalt/_defaults.zig.zon index a00d0417db..3696645b9e 100644 --- a/assets/cubyz/blocks/basalt/_defaults.zig.zon +++ b/assets/cubyz/blocks/basalt/_defaults.zig.zon @@ -1,5 +1,5 @@ .{ - .tags = .{.stone, .mineable, .basalt}, + .tags = .{.basalt, .stone, .mineable}, .blockHealth = 30, .blockResistance = 1, .drops = .{ diff --git a/assets/cubyz/blocks/chalk/_defaults.zig.zon b/assets/cubyz/blocks/chalk/_defaults.zig.zon index f6465e573a..c9d45d8b2d 100644 --- a/assets/cubyz/blocks/chalk/_defaults.zig.zon +++ b/assets/cubyz/blocks/chalk/_defaults.zig.zon @@ -1,5 +1,5 @@ .{ - .tags = .{.stone, .mineable}, + .tags = .{.chalk, .stone, .mineable}, .blockHealth = 12, .drops = .{ .{.items = .{.auto}}, diff --git a/assets/cubyz/blocks/ferrock/_defaults.zig.zon b/assets/cubyz/blocks/ferrock/_defaults.zig.zon index 854d6bd802..2d74325bfa 100644 --- a/assets/cubyz/blocks/ferrock/_defaults.zig.zon +++ b/assets/cubyz/blocks/ferrock/_defaults.zig.zon @@ -1,5 +1,5 @@ .{ - .tags = .{.stone, .mineable, .ferrock}, + .tags = .{.ferrock, .stone, .mineable}, .blockHealth = 32.5, .blockResistance = 1, .drops = .{ diff --git a/assets/cubyz/blocks/glacite/_defaults.zig.zon b/assets/cubyz/blocks/glacite/_defaults.zig.zon index 33c406bff3..7f6aead79d 100644 --- a/assets/cubyz/blocks/glacite/_defaults.zig.zon +++ b/assets/cubyz/blocks/glacite/_defaults.zig.zon @@ -1,5 +1,5 @@ .{ - .tags = .{.stone, .mineable, .glacite}, + .tags = .{.glacite, .stone, .mineable}, .blockHealth = 25, .blockResistance = 1, .drops = .{ diff --git a/assets/cubyz/blocks/glass/_defaults.zig.zon b/assets/cubyz/blocks/glass/_defaults.zig.zon index 8658e98332..52c6ffad76 100644 --- a/assets/cubyz/blocks/glass/_defaults.zig.zon +++ b/assets/cubyz/blocks/glass/_defaults.zig.zon @@ -1,5 +1,5 @@ .{ - .tags = .{.mineable}, + .tags = .{.glass, .mineable}, .blockHealth = 2.5, .drops = .{ .{.items = .{.auto}}, diff --git a/assets/cubyz/blocks/glow_crystal/_defaults.zig.zon b/assets/cubyz/blocks/glow_crystal/_defaults.zig.zon index be18503c28..05d8d14cbd 100644 --- a/assets/cubyz/blocks/glow_crystal/_defaults.zig.zon +++ b/assets/cubyz/blocks/glow_crystal/_defaults.zig.zon @@ -1,5 +1,5 @@ .{ - .tags = .{.mineable}, + .tags = .{.glow_crystal, .mineable}, .blockHealth = 5, .drops = .{ .{.items = .{.auto}}, diff --git a/assets/cubyz/blocks/limestone/_defaults.zig.zon b/assets/cubyz/blocks/limestone/_defaults.zig.zon index 95f5cf7cb7..a39201f542 100644 --- a/assets/cubyz/blocks/limestone/_defaults.zig.zon +++ b/assets/cubyz/blocks/limestone/_defaults.zig.zon @@ -1,5 +1,5 @@ .{ - .tags = .{.stone, .mineable, .limestone}, + .tags = .{.limestone, .stone, .mineable}, .blockHealth = 27.5, .blockResistance = 1, .drops = .{ diff --git a/assets/cubyz/blocks/marble/_defaults.zig.zon b/assets/cubyz/blocks/marble/_defaults.zig.zon index 8429253d55..7dc05ff6fb 100644 --- a/assets/cubyz/blocks/marble/_defaults.zig.zon +++ b/assets/cubyz/blocks/marble/_defaults.zig.zon @@ -1,5 +1,5 @@ .{ - .tags = .{.stone, .mineable, .marble}, + .tags = .{.marble, .stone, .mineable}, .blockHealth = 28, .drops = .{ .{.items = .{.auto}}, diff --git a/assets/cubyz/blocks/nimbusite/_defaults.zig.zon b/assets/cubyz/blocks/nimbusite/_defaults.zig.zon index c81b1d29d7..074590877c 100644 --- a/assets/cubyz/blocks/nimbusite/_defaults.zig.zon +++ b/assets/cubyz/blocks/nimbusite/_defaults.zig.zon @@ -1,5 +1,5 @@ .{ - .tags = .{.stone, .mineable, .nimbusite}, + .tags = .{.nimbusite, .stone, .mineable}, .blockHealth = 40, .blockResistance = 4, .drops = .{ diff --git a/assets/cubyz/blocks/pyrolite/_defaults.zig.zon b/assets/cubyz/blocks/pyrolite/_defaults.zig.zon index ad667e7363..8c1fbc4600 100644 --- a/assets/cubyz/blocks/pyrolite/_defaults.zig.zon +++ b/assets/cubyz/blocks/pyrolite/_defaults.zig.zon @@ -1,5 +1,5 @@ .{ - .tags = .{.mineable, .pyrolite}, + .tags = .{.pyrolite, .mineable}, .blockHealth = 40, .blockResistance = 25, .drops = .{ diff --git a/assets/cubyz/blocks/slate/_defaults.zig.zon b/assets/cubyz/blocks/slate/_defaults.zig.zon index b1952ed7c6..c01a1d4976 100644 --- a/assets/cubyz/blocks/slate/_defaults.zig.zon +++ b/assets/cubyz/blocks/slate/_defaults.zig.zon @@ -1,5 +1,5 @@ .{ - .tags = .{.stone, .mineable, .slate}, + .tags = .{.slate, .stone, .mineable}, .blockHealth = 30, .blockResistance = 1, .drops = .{ diff --git a/assets/cubyz/blocks/terracotta/_defaults.zig.zon b/assets/cubyz/blocks/terracotta/_defaults.zig.zon index a761dedf99..46b1514438 100644 --- a/assets/cubyz/blocks/terracotta/_defaults.zig.zon +++ b/assets/cubyz/blocks/terracotta/_defaults.zig.zon @@ -1,5 +1,5 @@ .{ - .tags = .{.mineable}, + .tags = .{.terracotta, .mineable}, .blockHealth = 20, .blockResistance = 1, .drops = .{ diff --git a/assets/cubyz/blocks/voidstone/_defaults.zig.zon b/assets/cubyz/blocks/voidstone/_defaults.zig.zon index d217646ba0..d109becfe0 100644 --- a/assets/cubyz/blocks/voidstone/_defaults.zig.zon +++ b/assets/cubyz/blocks/voidstone/_defaults.zig.zon @@ -1,5 +1,5 @@ .{ - .tags = .{.stone, .mineable, .voidStone}, + .tags = .{.voidstone, .stone, .mineable}, .blockHealth = 60, .blockResistance = 5, .drops = .{ diff --git a/src/sync.zig b/src/sync.zig index 09c1ed85ee..3395cac171 100644 --- a/src/sync.zig +++ b/src/sync.zig @@ -1826,17 +1826,20 @@ pub const Command = struct { // MARK: Command var dest: InventoryAndSlot = .{.inv = self.target.inv, .slot = 0}; var source: InventoryAndSlot = .{.inv = self.target.inv, .slot = 0}; var foundSimilarTag = false; - std.log.debug("test {}", .{invStack.item.proceduralItem.type.tags().len}); if (invStack.item.proceduralItem.type.tags().len == 0) continue; std.log.debug("starting tag sort", .{}); for (self.target.inv._items, 0..) |checkedInvStack, checkedSlot| { - if ((foundSimilarTag) or checkedInvStack.item != .proceduralItem) { + if ((foundSimilarTag)) { + if (checkedInvStack.item == .proceduralItem) { + if (checkedInvStack.item.proceduralItem.hasTag(invStack.item.proceduralItem.type.tags()[0])) continue; + } else { + continue; + } std.log.debug("found a proper swap", .{}); dest.slot = @intCast(checkedSlot); source.slot = @intCast(slot); break; } - if (checkedSlot == slot) continue; if (checkedInvStack.item == .proceduralItem) { if (checkedInvStack.item.proceduralItem.type.tags().len == 0) continue; std.log.debug("{}", .{(invStack.item.proceduralItem.type.tags()[0])}); @@ -1850,6 +1853,58 @@ pub const Command = struct { // MARK: Command }}); } // then we sort normal items + for (self.target.inv._items, 0..) |invStack, slot| { + if (invStack.item == .baseItem) { + var dest: InventoryAndSlot = .{.inv = self.target.inv, .slot = 0}; + var source: InventoryAndSlot = .{.inv = self.target.inv, .slot = 0}; + for (self.target.inv._items, 0..) |checkedInvStack, checkedSlot| { + if (checkedInvStack.item == .proceduralItem) continue; + if (checkedInvStack.item != .baseItem) { + dest.slot = @intCast(checkedSlot); + source.slot = @intCast(slot); + break; + } + } + ctx.execute(.{.swap = .{ + .dest = dest, + .source = source, + }}); + } + } + for (self.target.inv._items, 0..) |invStack, slot| { + if (invStack.item == .proceduralItem) continue; + if (invStack.item != .baseItem) break; + std.log.debug("try tag sort", .{}); + var dest: InventoryAndSlot = .{.inv = self.target.inv, .slot = 0}; + var source: InventoryAndSlot = .{.inv = self.target.inv, .slot = 0}; + var foundSimilarTag = false; + if (invStack.item.baseItem.tags().len == 0) continue; + std.log.debug("starting tag sort", .{}); + for (self.target.inv._items, 0..) |checkedInvStack, checkedSlot| { + if (invStack.item == .proceduralItem) continue; + if ((foundSimilarTag)) { + if (checkedInvStack.item == .baseItem) { + if (checkedInvStack.item.baseItem.hasTag(invStack.item.baseItem.tags()[0])) continue; + } else { + continue; + } + std.log.debug("found a proper swap", .{}); + dest.slot = @intCast(checkedSlot); + source.slot = @intCast(slot); + break; + } + if (checkedInvStack.item == .baseItem) { + if (checkedInvStack.item.baseItem.tags().len == 0) continue; + std.log.debug("{}", .{(invStack.item.baseItem.tags()[0])}); + if (checkedInvStack.item.baseItem.hasTag(invStack.item.baseItem.tags()[0])) foundSimilarTag = true; + } + } + std.log.debug("swapping {} {}", .{source.slot, dest.slot}); + ctx.execute(.{.swap = .{ + .dest = dest, + .source = source, + }}); + } } fn serialize(self: SortItems, writer: *BinaryWriter) void { From a6911c38a9dda97ae7a010994c8343f0aa98ecc8 Mon Sep 17 00:00:00 2001 From: Vinywar123 Date: Sun, 7 Jun 2026 23:06:32 -0700 Subject: [PATCH 6/6] tag adjustments and finilazation --- assets/cubyz/blocks/basalt/_defaults.zig.zon | 2 +- assets/cubyz/blocks/chalk/_defaults.zig.zon | 2 +- assets/cubyz/blocks/ferrock/_defaults.zig.zon | 2 +- assets/cubyz/blocks/glacite/_defaults.zig.zon | 2 +- assets/cubyz/blocks/glass/_defaults.zig.zon | 2 +- .../blocks/glow_crystal/_defaults.zig.zon | 2 +- assets/cubyz/blocks/marble/_defaults.zig.zon | 2 +- .../cubyz/blocks/nimbusite/_defaults.zig.zon | 2 +- .../cubyz/blocks/pyrolite/_defaults.zig.zon | 2 +- .../cubyz/blocks/sandstone/_defaults.zig.zon | 2 +- assets/cubyz/blocks/slate/_defaults.zig.zon | 2 +- .../cubyz/blocks/terracotta/_defaults.zig.zon | 2 +- src/sync.zig | 35 ++++++++++++------- 13 files changed, 34 insertions(+), 25 deletions(-) diff --git a/assets/cubyz/blocks/basalt/_defaults.zig.zon b/assets/cubyz/blocks/basalt/_defaults.zig.zon index 3696645b9e..b99d8271ca 100644 --- a/assets/cubyz/blocks/basalt/_defaults.zig.zon +++ b/assets/cubyz/blocks/basalt/_defaults.zig.zon @@ -1,5 +1,5 @@ .{ - .tags = .{.basalt, .stone, .mineable}, + .tags = .{.mineable, .stone, .basalt}, .blockHealth = 30, .blockResistance = 1, .drops = .{ diff --git a/assets/cubyz/blocks/chalk/_defaults.zig.zon b/assets/cubyz/blocks/chalk/_defaults.zig.zon index c9d45d8b2d..f3200610a8 100644 --- a/assets/cubyz/blocks/chalk/_defaults.zig.zon +++ b/assets/cubyz/blocks/chalk/_defaults.zig.zon @@ -1,5 +1,5 @@ .{ - .tags = .{.chalk, .stone, .mineable}, + .tags = .{.mineable, .stone, .chalk}, .blockHealth = 12, .drops = .{ .{.items = .{.auto}}, diff --git a/assets/cubyz/blocks/ferrock/_defaults.zig.zon b/assets/cubyz/blocks/ferrock/_defaults.zig.zon index 2d74325bfa..e9050de7bf 100644 --- a/assets/cubyz/blocks/ferrock/_defaults.zig.zon +++ b/assets/cubyz/blocks/ferrock/_defaults.zig.zon @@ -1,5 +1,5 @@ .{ - .tags = .{.ferrock, .stone, .mineable}, + .tags = .{.mineable, .stone, .ferrock}, .blockHealth = 32.5, .blockResistance = 1, .drops = .{ diff --git a/assets/cubyz/blocks/glacite/_defaults.zig.zon b/assets/cubyz/blocks/glacite/_defaults.zig.zon index 7f6aead79d..d750edf0c4 100644 --- a/assets/cubyz/blocks/glacite/_defaults.zig.zon +++ b/assets/cubyz/blocks/glacite/_defaults.zig.zon @@ -1,5 +1,5 @@ .{ - .tags = .{.glacite, .stone, .mineable}, + .tags = .{.mineable, .stone, .glacite}, .blockHealth = 25, .blockResistance = 1, .drops = .{ diff --git a/assets/cubyz/blocks/glass/_defaults.zig.zon b/assets/cubyz/blocks/glass/_defaults.zig.zon index 52c6ffad76..5172fb6058 100644 --- a/assets/cubyz/blocks/glass/_defaults.zig.zon +++ b/assets/cubyz/blocks/glass/_defaults.zig.zon @@ -1,5 +1,5 @@ .{ - .tags = .{.glass, .mineable}, + .tags = .{.mineable, .glass}, .blockHealth = 2.5, .drops = .{ .{.items = .{.auto}}, diff --git a/assets/cubyz/blocks/glow_crystal/_defaults.zig.zon b/assets/cubyz/blocks/glow_crystal/_defaults.zig.zon index 05d8d14cbd..8ee007b54d 100644 --- a/assets/cubyz/blocks/glow_crystal/_defaults.zig.zon +++ b/assets/cubyz/blocks/glow_crystal/_defaults.zig.zon @@ -1,5 +1,5 @@ .{ - .tags = .{.glow_crystal, .mineable}, + .tags = .{.mineable, .glow_crystal}, .blockHealth = 5, .drops = .{ .{.items = .{.auto}}, diff --git a/assets/cubyz/blocks/marble/_defaults.zig.zon b/assets/cubyz/blocks/marble/_defaults.zig.zon index 7dc05ff6fb..f3526d4229 100644 --- a/assets/cubyz/blocks/marble/_defaults.zig.zon +++ b/assets/cubyz/blocks/marble/_defaults.zig.zon @@ -1,5 +1,5 @@ .{ - .tags = .{.marble, .stone, .mineable}, + .tags = .{.mineable, .stone, .marble}, .blockHealth = 28, .drops = .{ .{.items = .{.auto}}, diff --git a/assets/cubyz/blocks/nimbusite/_defaults.zig.zon b/assets/cubyz/blocks/nimbusite/_defaults.zig.zon index 074590877c..c81b1d29d7 100644 --- a/assets/cubyz/blocks/nimbusite/_defaults.zig.zon +++ b/assets/cubyz/blocks/nimbusite/_defaults.zig.zon @@ -1,5 +1,5 @@ .{ - .tags = .{.nimbusite, .stone, .mineable}, + .tags = .{.stone, .mineable, .nimbusite}, .blockHealth = 40, .blockResistance = 4, .drops = .{ diff --git a/assets/cubyz/blocks/pyrolite/_defaults.zig.zon b/assets/cubyz/blocks/pyrolite/_defaults.zig.zon index 8c1fbc4600..d9cdc264a9 100644 --- a/assets/cubyz/blocks/pyrolite/_defaults.zig.zon +++ b/assets/cubyz/blocks/pyrolite/_defaults.zig.zon @@ -1,5 +1,5 @@ .{ - .tags = .{.pyrolite, .mineable}, + .tags = .{.mineable, .stone, .pyrolite}, .blockHealth = 40, .blockResistance = 25, .drops = .{ diff --git a/assets/cubyz/blocks/sandstone/_defaults.zig.zon b/assets/cubyz/blocks/sandstone/_defaults.zig.zon index afb82ce52b..03ae0c9d29 100644 --- a/assets/cubyz/blocks/sandstone/_defaults.zig.zon +++ b/assets/cubyz/blocks/sandstone/_defaults.zig.zon @@ -1,5 +1,5 @@ .{ - .tags = .{.stone, .mineable, .sandstone}, + .tags = .{.mineable, .stone, .sandstone}, .blockHealth = 20, .drops = .{ .{.items = .{.auto}}, diff --git a/assets/cubyz/blocks/slate/_defaults.zig.zon b/assets/cubyz/blocks/slate/_defaults.zig.zon index c01a1d4976..37d0dc24d1 100644 --- a/assets/cubyz/blocks/slate/_defaults.zig.zon +++ b/assets/cubyz/blocks/slate/_defaults.zig.zon @@ -1,5 +1,5 @@ .{ - .tags = .{.slate, .stone, .mineable}, + .tags = .{.mineable, .stone, .slate}, .blockHealth = 30, .blockResistance = 1, .drops = .{ diff --git a/assets/cubyz/blocks/terracotta/_defaults.zig.zon b/assets/cubyz/blocks/terracotta/_defaults.zig.zon index 46b1514438..5593e60c8b 100644 --- a/assets/cubyz/blocks/terracotta/_defaults.zig.zon +++ b/assets/cubyz/blocks/terracotta/_defaults.zig.zon @@ -1,5 +1,5 @@ .{ - .tags = .{.terracotta, .mineable}, + .tags = .{.mineable, .terracotta}, .blockHealth = 20, .blockResistance = 1, .drops = .{ diff --git a/src/sync.zig b/src/sync.zig index 3395cac171..49cc02fd9e 100644 --- a/src/sync.zig +++ b/src/sync.zig @@ -1777,9 +1777,7 @@ pub const Command = struct { // MARK: Command const SortItems = struct { // MARK: SortItems target: InventoryAndSlot, - fn run(self: SortItems, ctx: Context) error{serverFailure}!void { - std.log.debug("Running Sort", .{}); - // first compresses items before sorting + fn compressItems(self: SortItems, ctx: Context) void { for (self.target.inv._items, 0..) |invStack, slot| { if (invStack.item != .null) { for (self.target.inv._items, 0..) |checkedInvStack, checkedSlot| { @@ -1802,7 +1800,9 @@ pub const Command = struct { // MARK: Command } } } - // we sort out procedural tools first then generally try to put items with similar tags together + } + + fn sortProceduralItems(self: SortItems, ctx: Context) void { for (self.target.inv._items, 0..) |invStack, slot| { if (invStack.item == .proceduralItem) { var dest: InventoryAndSlot = .{.inv = self.target.inv, .slot = 0}; @@ -1822,12 +1822,10 @@ pub const Command = struct { // MARK: Command } for (self.target.inv._items, 0..) |invStack, slot| { if (invStack.item != .proceduralItem) break; - std.log.debug("try tag sort", .{}); var dest: InventoryAndSlot = .{.inv = self.target.inv, .slot = 0}; var source: InventoryAndSlot = .{.inv = self.target.inv, .slot = 0}; var foundSimilarTag = false; if (invStack.item.proceduralItem.type.tags().len == 0) continue; - std.log.debug("starting tag sort", .{}); for (self.target.inv._items, 0..) |checkedInvStack, checkedSlot| { if ((foundSimilarTag)) { if (checkedInvStack.item == .proceduralItem) { @@ -1835,7 +1833,6 @@ pub const Command = struct { // MARK: Command } else { continue; } - std.log.debug("found a proper swap", .{}); dest.slot = @intCast(checkedSlot); source.slot = @intCast(slot); break; @@ -1846,13 +1843,14 @@ pub const Command = struct { // MARK: Command if (checkedInvStack.item.proceduralItem.hasTag(invStack.item.proceduralItem.type.tags()[0])) foundSimilarTag = true; } } - std.log.debug("swapping {} {}", .{source.slot, dest.slot}); ctx.execute(.{.swap = .{ .dest = dest, .source = source, }}); } - // then we sort normal items + } + + fn sortBaseItems(self: SortItems, ctx: Context) void { for (self.target.inv._items, 0..) |invStack, slot| { if (invStack.item == .baseItem) { var dest: InventoryAndSlot = .{.inv = self.target.inv, .slot = 0}; @@ -1874,21 +1872,22 @@ pub const Command = struct { // MARK: Command for (self.target.inv._items, 0..) |invStack, slot| { if (invStack.item == .proceduralItem) continue; if (invStack.item != .baseItem) break; - std.log.debug("try tag sort", .{}); + std.log.debug("trying sort", .{}); var dest: InventoryAndSlot = .{.inv = self.target.inv, .slot = 0}; var source: InventoryAndSlot = .{.inv = self.target.inv, .slot = 0}; var foundSimilarTag = false; + std.log.debug("trying sort 2 {}", .{invStack.item}); + std.log.debug("trying sort 2 {}", .{invStack.item.baseItem.tags()}); if (invStack.item.baseItem.tags().len == 0) continue; - std.log.debug("starting tag sort", .{}); + std.log.debug("trying sort 3", .{}); for (self.target.inv._items, 0..) |checkedInvStack, checkedSlot| { - if (invStack.item == .proceduralItem) continue; if ((foundSimilarTag)) { if (checkedInvStack.item == .baseItem) { if (checkedInvStack.item.baseItem.hasTag(invStack.item.baseItem.tags()[0])) continue; } else { continue; } - std.log.debug("found a proper swap", .{}); + std.log.debug("found a proper swap for the items", .{}); dest.slot = @intCast(checkedSlot); source.slot = @intCast(slot); break; @@ -1907,6 +1906,16 @@ pub const Command = struct { // MARK: Command } } + fn run(self: SortItems, ctx: Context) error{serverFailure}!void { + std.log.debug("Running Sort", .{}); + // first compresses items before sorting + // we sort out procedural tools second then generally try to put items with similar tags together + // then we sort normal items + compressItems(self, ctx); + sortProceduralItems(self, ctx); + sortBaseItems(self, ctx); + } + fn serialize(self: SortItems, writer: *BinaryWriter) void { self.target.write(writer); }