12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- 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,
- })
|