//subdivide: upgrade to use new async & notify core APIs

This commit is contained in:
Starbeamrainbowlabs 2024-10-17 02:26:44 +01:00
parent 6ef17fed27
commit 6ea9a5acc8
Signed by: sbrl
GPG key ID: 1BE5172E637709C2
2 changed files with 23 additions and 16 deletions

View file

@ -22,6 +22,8 @@ Note to self: See the bottom of this file for the release template text.
- Added `//uasparse` command to show the vectors produced by a given UAS expression. - Implementation by @VorTechnix - Added `//uasparse` command to show the vectors produced by a given UAS expression. - Implementation by @VorTechnix
- Added new player notification system with coloured output - thanks, @VorTechnix! - Added new player notification system with coloured output - thanks, @VorTechnix!
- Please be patient as we switch all usages over to the new system. - Please be patient as we switch all usages over to the new system.
- [internal] Added initial async command support. This means that WEA is now aware of when async commands like `//for`, `//subdivide` etc actually complete
- Macro support may be coming at some point in the future!
### Bugfixes and changes ### Bugfixes and changes
- When commands produce an error, the name of the command that produced the error is now also printed. Useful when using e.g. [`//multi`](https://worldeditadditions.mooncarrot.space/Reference/#multi) etc. - When commands produce an error, the name of the command that produced the error is now also printed. Useful when using e.g. [`//multi`](https://worldeditadditions.mooncarrot.space/Reference/#multi) etc.

View file

@ -36,6 +36,7 @@ worldeditadditions_core.register_command("subdivide", {
description = "Subdivides the given worldedit area into chunks and runs a worldedit command multiple times to cover the defined region. Note that the given command must NOT be prepended with any forward slashes - just like //cubeapply.", description = "Subdivides the given worldedit area into chunks and runs a worldedit command multiple times to cover the defined region. Note that the given command must NOT be prepended with any forward slashes - just like //cubeapply.",
privs = { worldedit = true }, privs = { worldedit = true },
require_pos = 2, require_pos = 2,
async = true,
parse = function(params_text) parse = function(params_text)
local parts = wea_c.split(params_text, "%s+", false) local parts = wea_c.split(params_text, "%s+", false)
@ -69,7 +70,7 @@ worldeditadditions_core.register_command("subdivide", {
nodes_needed = function(name) nodes_needed = function(name)
return worldedit.volume(worldedit.pos1[name], worldedit.pos2[name]) return worldedit.volume(worldedit.pos1[name], worldedit.pos2[name])
end, end,
func = function(name, chunk_size, cmd_name, args) func = function(callback, name, chunk_size, cmd_name, args)
local time_total = wea_c.get_ms_time() local time_total = wea_c.get_ms_time()
local pos1, pos2 = Vector3.sort(worldedit.pos1[name], worldedit.pos2[name]) local pos1, pos2 = Vector3.sort(worldedit.pos1[name], worldedit.pos2[name])
@ -106,7 +107,7 @@ worldeditadditions_core.register_command("subdivide", {
stats.chunk_size.y + 1, -- y stats.chunk_size.y + 1, -- y
stats.chunk_size.z + 1 -- z stats.chunk_size.z + 1 -- z
) )
worldedit.player_notify(name, string.format( wea_c.notify.info(name, string.format(
"%sStarting - chunk size: %s, %d chunks total (%d nodes)", "%sStarting - chunk size: %s, %d chunks total (%d nodes)",
msg_prefix, msg_prefix,
tostring(chunk_size_display), tostring(chunk_size_display),
@ -115,21 +116,24 @@ worldeditadditions_core.register_command("subdivide", {
)) ))
end end
worldedit.player_notify_suppress(name) wea_c.notify.suppress_for_function(name, function()
wea_c.pos.set1(name, cpos1) -- We still call `worldedit.player_notify_suppress` here because we may be subdividing a WorldEdit function as opposed to one from WEA
wea_c.pos.set2(name, cpos2) worldedit.player_notify_suppress(name)
-- worldedit.pos1[name] = cpos1 wea_c.pos.set1(name, cpos1)
-- worldedit.pos2[name] = cpos2 wea_c.pos.set2(name, cpos2)
-- worldedit.marker_update(name) -- worldedit.pos1[name] = cpos1
cmd.func(name, wea_c.table.unpack(cmd_args_parsed)) -- worldedit.pos2[name] = cpos2
if will_trigger_saferegion(name, cmd_name, args) then -- worldedit.marker_update(name)
minetest.registered_chatcommands["/y"].func(name) cmd.func(name, wea_c.table.unpack(cmd_args_parsed))
end if will_trigger_saferegion(name, cmd_name, args) then
worldedit.player_notify_unsuppress(name) minetest.registered_chatcommands["/y"].func(name)
end
worldedit.player_notify_unsuppress(name)
end)
-- Send updates every 2 seconds, and after the first 3 chunks are done -- Send updates every 2 seconds, and after the first 3 chunks are done
if wea_c.get_ms_time() - time_last_msg > 2 * 1000 or stats.chunks_completed == 3 or stats.chunks_completed == stats.chunks_total then if wea_c.get_ms_time() - time_last_msg > 2 * 1000 or stats.chunks_completed == 3 or stats.chunks_completed == stats.chunks_total then
worldedit.player_notify(name, wea_c.notify.info(name,
string.format("%s%d / %d (~%.2f%%) complete | last chunk: %s, average: %s, %.2f%% emerge overhead, ETA: ~%s", string.format("%s%d / %d (~%.2f%%) complete | last chunk: %s, average: %s, %.2f%% emerge overhead, ETA: ~%s",
msg_prefix, msg_prefix,
stats.chunks_completed, stats.chunks_total, stats.chunks_completed, stats.chunks_total,
@ -143,6 +147,7 @@ worldeditadditions_core.register_command("subdivide", {
time_last_msg = wea_c.get_ms_time() time_last_msg = wea_c.get_ms_time()
end end
end, function(_, _, stats) end, function(_, _, stats)
-- Called on completion
wea_c.pos.set1(name, pos1) wea_c.pos.set1(name, pos1)
wea_c.pos.set2(name, pos2) wea_c.pos.set2(name, pos2)
@ -150,7 +155,7 @@ worldeditadditions_core.register_command("subdivide", {
-- worldedit.pos2[name] = pos2 -- worldedit.pos2[name] = pos2
-- worldedit.marker_update(name) -- worldedit.marker_update(name)
-- Called on completion
minetest.log("action", string.format("%s used //subdivide at %s - %s, with %d chunks and %d total nodes in %s", minetest.log("action", string.format("%s used //subdivide at %s - %s, with %d chunks and %d total nodes in %s",
name, name,
tostring(pos1), tostring(pos1),
@ -159,7 +164,7 @@ worldeditadditions_core.register_command("subdivide", {
stats.volume_nodes, stats.volume_nodes,
wea_c.format.human_time(stats.times.total) wea_c.format.human_time(stats.times.total)
)) ))
worldedit.player_notify(name, string.format( callback(true, string.format(
"%sComplete: %d chunks processed in %s (%.2f%% emerge overhead, emerge totals: %s)", "%sComplete: %d chunks processed in %s (%.2f%% emerge overhead, emerge totals: %s)",
msg_prefix, msg_prefix,
stats.chunks_completed, stats.chunks_completed,