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>
This commit is contained in:
Krzysztof Wiśniewski 2025-05-18 19:03:41 +02:00 committed by GitHub
parent f5fd3356d9
commit 1f4d23464a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 34 additions and 1 deletions

View File

@ -16,3 +16,4 @@ pub const paste = @import("worldedit/paste.zig");
pub const blueprint = @import("worldedit/blueprint.zig"); pub const blueprint = @import("worldedit/blueprint.zig");
pub const rotate = @import("worldedit/rotate.zig"); pub const rotate = @import("worldedit/rotate.zig");
pub const set = @import("worldedit/set.zig"); pub const set = @import("worldedit/set.zig");
pub const mask = @import("worldedit/mask.zig");

View File

@ -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>
\\/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.", .{});
}

View File

@ -41,7 +41,7 @@ pub fn execute(args: []const u8, source: *User) void {
var modifiedBlueprint = blueprint.clone(main.stackAllocator); var modifiedBlueprint = blueprint.clone(main.stackAllocator);
defer modifiedBlueprint.deinit(main.stackAllocator); defer modifiedBlueprint.deinit(main.stackAllocator);
modifiedBlueprint.set(pattern, null); modifiedBlueprint.set(pattern, source.worldEditData.mask);
modifiedBlueprint.paste(posStart, .{.preserveVoid = true}); modifiedBlueprint.paste(posStart, .{.preserveVoid = true});
}, },
.failure => |err| { .failure => |err| {

View File

@ -14,6 +14,7 @@ const Vec3i = vec.Vec3i;
const BinaryReader = main.utils.BinaryReader; const BinaryReader = main.utils.BinaryReader;
const BinaryWriter = main.utils.BinaryWriter; const BinaryWriter = main.utils.BinaryWriter;
const Blueprint = main.blueprint.Blueprint; const Blueprint = main.blueprint.Blueprint;
const Mask = main.blueprint.Mask;
const NeverFailingAllocator = main.heap.NeverFailingAllocator; const NeverFailingAllocator = main.heap.NeverFailingAllocator;
const CircularBufferQueue = main.utils.CircularBufferQueue; const CircularBufferQueue = main.utils.CircularBufferQueue;
@ -33,6 +34,7 @@ pub const WorldEditData = struct {
clipboard: ?Blueprint = null, clipboard: ?Blueprint = null,
undoHistory: History, undoHistory: History,
redoHistory: History, redoHistory: History,
mask: ?Mask = null,
const History = struct { const History = struct {
changes: CircularBufferQueue(Value), changes: CircularBufferQueue(Value),
@ -80,6 +82,9 @@ pub const WorldEditData = struct {
} }
self.undoHistory.deinit(); self.undoHistory.deinit();
self.redoHistory.deinit(); self.redoHistory.deinit();
if(self.mask) |mask| {
mask.deinit(main.globalAllocator);
}
} }
}; };