forked from Mirrorlandia_minetest/minetest
80 lines
2.4 KiB
Lua
80 lines
2.4 KiB
Lua
|
local S = minetest.get_translator("testtools")
|
||
|
|
||
|
minetest.register_entity("testtools:visual_box", {
|
||
|
initial_properties = {
|
||
|
visual = "cube",
|
||
|
textures = {
|
||
|
"blank.png", "blank.png", "blank.png",
|
||
|
"blank.png", "blank.png", "blank.png",
|
||
|
},
|
||
|
use_texture_alpha = true,
|
||
|
physical = false,
|
||
|
pointable = false,
|
||
|
static_save = false,
|
||
|
},
|
||
|
|
||
|
on_activate = function(self)
|
||
|
self.timestamp = minetest.get_us_time() + 5000000
|
||
|
end,
|
||
|
|
||
|
on_step = function(self)
|
||
|
if minetest.get_us_time() >= self.timestamp then
|
||
|
self.object:remove()
|
||
|
end
|
||
|
end,
|
||
|
})
|
||
|
|
||
|
local BOX_TYPES = {"node_box", "collision_box", "selection_box"}
|
||
|
local DEFAULT_BOX_TYPE = "selection_box"
|
||
|
|
||
|
local function visualizer_on_use(itemstack, user, pointed_thing)
|
||
|
if pointed_thing.type ~= "node" then
|
||
|
return
|
||
|
end
|
||
|
|
||
|
local meta = itemstack:get_meta()
|
||
|
local box_type = meta:get("box_type") or DEFAULT_BOX_TYPE
|
||
|
|
||
|
local result = minetest.get_node_boxes(box_type, pointed_thing.under)
|
||
|
local t = "testtools_visual_" .. box_type .. ".png"
|
||
|
|
||
|
for _, box in ipairs(result) do
|
||
|
local box_min = pointed_thing.under + vector.new(box[1], box[2], box[3])
|
||
|
local box_max = pointed_thing.under + vector.new(box[4], box[5], box[6])
|
||
|
local box_center = (box_min + box_max) / 2
|
||
|
local obj = minetest.add_entity(box_center, "testtools:visual_box")
|
||
|
if not obj then
|
||
|
break
|
||
|
end
|
||
|
obj:set_properties({
|
||
|
textures = {t, t, t, t, t, t},
|
||
|
-- Add a small offset to avoid Z-fighting.
|
||
|
visual_size = vector.add(box_max - box_min, 0.01),
|
||
|
})
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local function visualizer_on_place(itemstack, placer, pointed_thing)
|
||
|
local meta = itemstack:get_meta()
|
||
|
local prev_value = meta:get("box_type") or DEFAULT_BOX_TYPE
|
||
|
local prev_index = table.indexof(BOX_TYPES, prev_value)
|
||
|
assert(prev_index ~= -1)
|
||
|
|
||
|
local new_value = BOX_TYPES[(prev_index % #BOX_TYPES) + 1]
|
||
|
meta:set_string("box_type", new_value)
|
||
|
minetest.chat_send_player(placer:get_player_name(), S("[Node Box Visualizer] box_type = @1", new_value))
|
||
|
|
||
|
return itemstack
|
||
|
end
|
||
|
|
||
|
minetest.register_tool("testtools:node_box_visualizer", {
|
||
|
description = S("Node Box Visualizer") .. "\n" ..
|
||
|
S("Punch: Show node/collision/selection boxes of the pointed node") .. "\n" ..
|
||
|
S("Place: Change selected box type (default: selection box)"),
|
||
|
inventory_image = "testtools_node_box_visualizer.png",
|
||
|
groups = { testtool = 1, disable_repair = 1 },
|
||
|
on_use = visualizer_on_use,
|
||
|
on_place = visualizer_on_place,
|
||
|
on_secondary_use = visualizer_on_place,
|
||
|
})
|