mirror of
https://github.com/Uberi/Minetest-WorldEdit.git
synced 2024-12-25 02:00:39 +01:00
Add configurable brush item
texture was supposed to be a brush, i suck at this :(
This commit is contained in:
parent
4605596215
commit
7b1deb1b61
@ -463,3 +463,14 @@ Contracts the selection in all directions by `<amount>`. If specified, the selec
|
|||||||
or vertically in the y axis `[v]`.
|
or vertically in the y axis `[v]`.
|
||||||
|
|
||||||
//outset v 5
|
//outset v 5
|
||||||
|
|
||||||
|
### `//brush none/<command> [parameters]`
|
||||||
|
|
||||||
|
Assigns the given `<command>` to the currently held brush item, it will be ran with the first pointed solid node (as determined via raycast) as
|
||||||
|
WorldEdit position 1 when using that specific brush item.
|
||||||
|
Passing `none` instead clears the command assigned to the currently held brush item.
|
||||||
|
Note that this functionality requires the `worldedit_brush` mod enabled.
|
||||||
|
|
||||||
|
//brush cube 8 8 8 Cobblestone
|
||||||
|
//brush spr 12 glass
|
||||||
|
//brush none
|
||||||
|
2
worldedit_brush/depends.txt
Normal file
2
worldedit_brush/depends.txt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
worldedit
|
||||||
|
worldedit_commands
|
144
worldedit_brush/init.lua
Normal file
144
worldedit_brush/init.lua
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
if minetest.raycast == nil then
|
||||||
|
error(
|
||||||
|
"================================\n"..
|
||||||
|
"This mod requires a suitable version of 0.4.16-dev/0.5.0-dev\n"..
|
||||||
|
"that includes support for minetest.raycast() [since 7th July 2017]\n"..
|
||||||
|
"================================\n"
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
local BRUSH_MAX_DIST = 150
|
||||||
|
local BRUSH_ALLOWED_COMMANDS = {
|
||||||
|
-- basically everything that only needs pos1
|
||||||
|
"cube",
|
||||||
|
"cylinder",
|
||||||
|
"dome",
|
||||||
|
"hollowcube",
|
||||||
|
"hollowcylinder",
|
||||||
|
"hollowdome",
|
||||||
|
"hollowpyramid",
|
||||||
|
"hollowsphere",
|
||||||
|
"load",
|
||||||
|
"pyramid",
|
||||||
|
"sphere",
|
||||||
|
"spiral",
|
||||||
|
|
||||||
|
"cyl",
|
||||||
|
"do",
|
||||||
|
"hcube",
|
||||||
|
"hcyl",
|
||||||
|
"hdo",
|
||||||
|
"hpyr",
|
||||||
|
"hspr",
|
||||||
|
"l",
|
||||||
|
"pyr",
|
||||||
|
"spr",
|
||||||
|
"spl",
|
||||||
|
}
|
||||||
|
local brush_on_use = function(itemstack, placer)
|
||||||
|
local meta = itemstack:get_meta()
|
||||||
|
local name = placer:get_player_name()
|
||||||
|
|
||||||
|
local cmd = meta:get_string("command")
|
||||||
|
if cmd == "" then
|
||||||
|
worldedit.player_notify(name,
|
||||||
|
"This brush is not bound, use //brush to bind a command to it.")
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
local cmddef = minetest.registered_chatcommands["/" .. cmd]
|
||||||
|
if cmddef == nil then return false end -- shouldn't happen as //brush checks this
|
||||||
|
local has_privs, missing_privs = minetest.check_player_privs(name, cmddef.privs)
|
||||||
|
if not has_privs then
|
||||||
|
worldedit.player_notify(name,
|
||||||
|
"Missing privileges: " .. table.concat(missing_privs, ", "))
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
local raybegin = vector.add(placer:get_pos(), {x=0, y=2, z=0}) -- player head
|
||||||
|
local rayend = vector.add(raybegin, vector.multiply(placer:get_look_dir(), BRUSH_MAX_DIST))
|
||||||
|
local ray = minetest.raycast(raybegin, rayend, false, true)
|
||||||
|
local pointed_thing = ray:next()
|
||||||
|
if pointed_thing == nil then
|
||||||
|
worldedit.player_notify(name, "Too far away.")
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
assert(pointed_thing.type == "node")
|
||||||
|
worldedit.pos1[name] = pointed_thing.under
|
||||||
|
worldedit.pos2[name] = nil
|
||||||
|
worldedit.mark_region(name)
|
||||||
|
-- is this a horrible hack? oh yes.
|
||||||
|
worldedit._override_safe_regions = true
|
||||||
|
local player_notify_old = worldedit.player_notify
|
||||||
|
worldedit.player_notify = function(name, msg)
|
||||||
|
if string.match(msg, "^%d") then return end -- discard "1234 nodes added."
|
||||||
|
return player_notify_old(name, msg)
|
||||||
|
end
|
||||||
|
|
||||||
|
minetest.log("action", string.format("%s uses WorldEdit brush (//%s) at %s",
|
||||||
|
name, cmd, minetest.pos_to_string(pointed_thing.under)))
|
||||||
|
cmddef.func(name, meta:get_string("params"))
|
||||||
|
|
||||||
|
worldedit._override_safe_regions = false
|
||||||
|
worldedit.player_notify = player_notify_old
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
minetest.register_tool(":worldedit:brush", {
|
||||||
|
description = "WorldEdit Brush",
|
||||||
|
inventory_image = "worldedit_brush.png",
|
||||||
|
stack_max = 1, -- no need to stack these (metadata prevents this anyway)
|
||||||
|
range = 0,
|
||||||
|
on_use = function(itemstack, placer, pointed_thing)
|
||||||
|
brush_on_use(itemstack, placer)
|
||||||
|
return itemstack -- nothing consumed, nothing changed
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_chatcommand("/brush", {
|
||||||
|
privs = {worldedit=true},
|
||||||
|
params = "none/<cmd> [parameters]",
|
||||||
|
description = "Assign command to WorldEdit brush item",
|
||||||
|
func = function(name, param)
|
||||||
|
local found, _, cmd, params = param:find("^([^%s]+)%s+(.+)$")
|
||||||
|
if not found then
|
||||||
|
params = ""
|
||||||
|
found, _, cmd = param:find("^(.+)$")
|
||||||
|
end
|
||||||
|
if not found then
|
||||||
|
worldedit.player_notify(name, "Invalid usage.")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local itemstack = minetest.get_player_by_name(name):get_wielded_item()
|
||||||
|
if itemstack == nil or itemstack:get_name() ~= "worldedit:brush" then
|
||||||
|
worldedit.player_notify(name, "Not holding brush item.")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
cmd = cmd:lower()
|
||||||
|
local meta = itemstack:get_meta()
|
||||||
|
if cmd == "none" then
|
||||||
|
meta:from_table(nil)
|
||||||
|
worldedit.player_notify(name, "Brush assignment cleared.")
|
||||||
|
else
|
||||||
|
local cmddef
|
||||||
|
if table.indexof(BRUSH_ALLOWED_COMMANDS, cmd) ~= -1 then
|
||||||
|
cmddef = minetest.registered_chatcommands["/" .. cmd]
|
||||||
|
else
|
||||||
|
cmddef = nil
|
||||||
|
end
|
||||||
|
if cmddef == nil then
|
||||||
|
worldedit.player_notify(name, "Invalid command for brush use: //" .. cmd)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
meta:set_string("command", cmd)
|
||||||
|
meta:set_string("params", params)
|
||||||
|
local fullcmd = "//" .. cmd .. " " .. params
|
||||||
|
meta:set_string("description",
|
||||||
|
minetest.registered_tools["worldedit:brush"].description .. ": " .. fullcmd)
|
||||||
|
worldedit.player_notify(name, "Brush assigned to command: " .. fullcmd)
|
||||||
|
end
|
||||||
|
minetest.get_player_by_name(name):set_wielded_item(itemstack)
|
||||||
|
end,
|
||||||
|
})
|
BIN
worldedit_brush/textures/worldedit_brush.png
Normal file
BIN
worldedit_brush/textures/worldedit_brush.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 337 B |
@ -1,6 +1,8 @@
|
|||||||
local safe_region_callback = {}
|
local safe_region_callback = {}
|
||||||
local safe_region_param = {}
|
local safe_region_param = {}
|
||||||
|
|
||||||
|
worldedit._override_safe_regions = false -- internal use ONLY!
|
||||||
|
|
||||||
local function check_region(name, param)
|
local function check_region(name, param)
|
||||||
local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] --obtain positions
|
local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] --obtain positions
|
||||||
if pos1 == nil or pos2 == nil then
|
if pos1 == nil or pos2 == nil then
|
||||||
@ -20,7 +22,7 @@ local function safe_region(callback, nodes_needed)
|
|||||||
--check if the operation applies to a safe number of nodes
|
--check if the operation applies to a safe number of nodes
|
||||||
local count = nodes_needed(name, param)
|
local count = nodes_needed(name, param)
|
||||||
if count == nil then return end --invalid command
|
if count == nil then return end --invalid command
|
||||||
if count < 10000 then
|
if worldedit._override_safe_regions or count < 10000 then
|
||||||
return callback(name, param)
|
return callback(name, param)
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -44,20 +46,21 @@ minetest.register_chatcommand("/y", {
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
safe_region_callback[name], safe_region_param[name] = nil, nil --reset pending operation
|
reset_pending(name)
|
||||||
callback(name, param)
|
callback(name, param)
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_chatcommand("/n", {
|
minetest.register_chatcommand("/n", {
|
||||||
params = "",
|
params = "",
|
||||||
description = "Confirm a pending operation",
|
description = "Abort a pending operation",
|
||||||
func = function(name)
|
func = function(name)
|
||||||
if not safe_region_callback[name] then
|
if not safe_region_callback[name] then
|
||||||
worldedit.player_notify(name, "no operation pending")
|
worldedit.player_notify(name, "no operation pending")
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
safe_region_callback[name], safe_region_param[name] = nil, nil
|
|
||||||
|
reset_pending(name)
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user