diff --git a/src/blueprint.zig b/src/blueprint.zig index 62a46e20..f7c6452a 100644 --- a/src/blueprint.zig +++ b/src/blueprint.zig @@ -330,6 +330,9 @@ pub const Blueprint = struct { }; pub const Pattern = struct { + const weightSeparator = '%'; + const expressionSeparator = ','; + blocks: AliasTable(Entry), const Entry = struct { @@ -338,26 +341,28 @@ pub const Pattern = struct { }; pub fn initFromString(allocator: NeverFailingAllocator, source: []const u8) !@This() { - var specifiers = std.mem.splitScalar(u8, source, ','); + var specifiers = std.mem.splitScalar(u8, source, expressionSeparator); var totalWeight: f32 = 0; var weightedEntries: ListUnmanaged(struct {block: Block, weight: f32}) = .{}; defer weightedEntries.deinit(main.stackAllocator); while(specifiers.next()) |specifier| { - var iterator = std.mem.splitScalar(u8, specifier, '%'); + var blockId = specifier; + var weight: f32 = 1.0; - var weight: f32 = undefined; - var block = main.blocks.parseBlock(iterator.rest()); + if(std.mem.containsAtLeastScalar(u8, specifier, 1, weightSeparator)) { + var iterator = std.mem.splitScalar(u8, specifier, weightSeparator); + const weightString = iterator.first(); + blockId = iterator.rest(); - const first = iterator.first(); + weight = std.fmt.parseFloat(f32, weightString) catch return error.@"Weight not a valid number"; + if(weight <= 0) return error.@"Weight must be greater than 0"; + } + + _ = main.blocks.getBlockById(blockId) catch return error.@"Block not found"; + const block = main.blocks.parseBlock(blockId); - weight = std.fmt.parseFloat(f32, first) catch blk: { - // To distinguish somehow between mistyped numeric values and actual block IDs we check for addon name separator. - if(!std.mem.containsAtLeastScalar(u8, first, 1, ':')) return error.PatternSyntaxError; - block = main.blocks.parseBlock(first); - break :blk 1.0; - }; totalWeight += weight; weightedEntries.append(main.stackAllocator, .{.block = block, .weight = weight}); } diff --git a/src/server/command/worldedit/set.zig b/src/server/command/worldedit/set.zig index 3b7bdfcc..8a139cb6 100644 --- a/src/server/command/worldedit/set.zig +++ b/src/server/command/worldedit/set.zig @@ -23,7 +23,7 @@ pub fn execute(args: []const u8, source: *User) void { return source.sendMessage("#ff0000Position 2 isn't set", .{}); }; const pattern = Pattern.initFromString(main.stackAllocator, args) catch |err| { - source.sendMessage("#ff0000Error parsing pattern: {}", .{err}); + source.sendMessage("#ff0000Error parsing pattern: {s}", .{@errorName(err)}); return; }; defer pattern.deinit(main.stackAllocator);