From 1f4d23464a998c6af73b1873f9c29c0a3cafb425 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Wi=C5=9Bniewski?= Date: Sun, 18 May 2025 19:03:41 +0200 Subject: [PATCH] Add `/mask` command (#1337) * Add masks * Apply masks to /set * Change char used for tags * Remove mask command * Revert "Remove mask command" This reverts commit 83e8cdd9044452f11efdd4d515bee330491ea1f6. * Fix use of BlockTag * Fix use of BlockTag * Move Pattern into Blueprint * Improve error message on capture failure * Change memory management * Move EditMask to blueprint.zig * Polish mask command * Fix some fixes * Fix block formatting * Fix blueprint formatting * Implement some of the suggestions * Fix field renames * Unstupidify Entry.initFromString inverse handling * Use introspection to create Property enum * Make or_ and_ inverse etc. private * Use functions instead of generics * Rename getBlockById parameter * Update src/blueprint.zig Co-authored-by: IntegratedQuantum <43880493+IntegratedQuantum@users.noreply.github.com> * Improve error names * Add get method to Tag * Improve error names * Update src/blueprint.zig Co-authored-by: IntegratedQuantum <43880493+IntegratedQuantum@users.noreply.github.com> * Change how block dispatch is done * Add hasTag * Quick fixes of small bugs * Fix implementation of hasTag * Remove redundant try from parseBlockLike * Add test for inverse masks * Fix inversed mask check * Remove brush masks * Remove unused imports --------- Co-authored-by: IntegratedQuantum <43880493+IntegratedQuantum@users.noreply.github.com> --- src/server/command/_list.zig | 1 + src/server/command/worldedit/mask.zig | 27 +++++++++++++++++++++++++++ src/server/command/worldedit/set.zig | 2 +- src/server/server.zig | 5 +++++ 4 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 src/server/command/worldedit/mask.zig diff --git a/src/server/command/_list.zig b/src/server/command/_list.zig index c3f6471b..b43fe268 100644 --- a/src/server/command/_list.zig +++ b/src/server/command/_list.zig @@ -16,3 +16,4 @@ pub const paste = @import("worldedit/paste.zig"); pub const blueprint = @import("worldedit/blueprint.zig"); pub const rotate = @import("worldedit/rotate.zig"); pub const set = @import("worldedit/set.zig"); +pub const mask = @import("worldedit/mask.zig"); diff --git a/src/server/command/worldedit/mask.zig b/src/server/command/worldedit/mask.zig new file mode 100644 index 00000000..91fb2228 --- /dev/null +++ b/src/server/command/worldedit/mask.zig @@ -0,0 +1,27 @@ +const std = @import("std"); + +const main = @import("main"); +const User = main.server.User; + +const Mask = main.blueprint.Mask; + +pub const description = "Set edit mask. When used with no mask expression it will clear current mask."; +pub const usage = + \\/mask + \\/mask +; + +pub fn execute(args: []const u8, source: *User) void { + if(args.len == 0) { + if(source.worldEditData.mask) |mask| mask.deinit(main.globalAllocator); + source.worldEditData.mask = null; + source.sendMessage("#00ff00Mask cleared.", .{}); + return; + } + const mask = Mask.initFromString(main.globalAllocator, args) catch |err| { + source.sendMessage("#ff0000Error parsing mask: {}", .{err}); + return; + }; + source.worldEditData.mask = mask; + source.sendMessage("#00ff00Mask set.", .{}); +} diff --git a/src/server/command/worldedit/set.zig b/src/server/command/worldedit/set.zig index 0b38b894..640d3b56 100644 --- a/src/server/command/worldedit/set.zig +++ b/src/server/command/worldedit/set.zig @@ -41,7 +41,7 @@ pub fn execute(args: []const u8, source: *User) void { var modifiedBlueprint = blueprint.clone(main.stackAllocator); defer modifiedBlueprint.deinit(main.stackAllocator); - modifiedBlueprint.set(pattern, null); + modifiedBlueprint.set(pattern, source.worldEditData.mask); modifiedBlueprint.paste(posStart, .{.preserveVoid = true}); }, .failure => |err| { diff --git a/src/server/server.zig b/src/server/server.zig index e3fef13e..07aaaffb 100644 --- a/src/server/server.zig +++ b/src/server/server.zig @@ -14,6 +14,7 @@ const Vec3i = vec.Vec3i; const BinaryReader = main.utils.BinaryReader; const BinaryWriter = main.utils.BinaryWriter; const Blueprint = main.blueprint.Blueprint; +const Mask = main.blueprint.Mask; const NeverFailingAllocator = main.heap.NeverFailingAllocator; const CircularBufferQueue = main.utils.CircularBufferQueue; @@ -33,6 +34,7 @@ pub const WorldEditData = struct { clipboard: ?Blueprint = null, undoHistory: History, redoHistory: History, + mask: ?Mask = null, const History = struct { changes: CircularBufferQueue(Value), @@ -80,6 +82,9 @@ pub const WorldEditData = struct { } self.undoHistory.deinit(); self.redoHistory.deinit(); + if(self.mask) |mask| { + mask.deinit(main.globalAllocator); + } } };