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); + } } };