forked from Mirrorlandia_minetest/minetest
DevTest: Formspec tests, children getter, better lighttool (#10918)
This commit is contained in:
parent
88f514ad7a
commit
9113538142
@ -362,20 +362,51 @@ Number]
|
|||||||
animated_image[5.5,0.5;5,2;;testformspec_animation.png;4;100]
|
animated_image[5.5,0.5;5,2;;testformspec_animation.png;4;100]
|
||||||
animated_image[5.5,2.75;5,2;;testformspec_animation.jpg;4;100]
|
animated_image[5.5,2.75;5,2;;testformspec_animation.jpg;4;100]
|
||||||
|
|
||||||
|
]],
|
||||||
|
|
||||||
|
-- Model
|
||||||
|
[[
|
||||||
|
formspec_version[3]
|
||||||
|
size[12,13]
|
||||||
style[m1;bgcolor=black]
|
style[m1;bgcolor=black]
|
||||||
model[0.5,6;4,4;m1;testformspec_character.b3d;testformspec_character.png]
|
style[m2;bgcolor=black]
|
||||||
model[5,6;4,4;m2;testformspec_chest.obj;default_chest_top.png,default_chest_top.png,default_chest_side.png,default_chest_side.png,default_chest_front.png,default_chest_inside.png;30,1;true;true]
|
label[5,1;all defaults]
|
||||||
|
label[5,5.1;angle = 0, 180
|
||||||
|
continuous = false
|
||||||
|
mouse control = false
|
||||||
|
frame loop range = 0,30]
|
||||||
|
label[5,9.2;continuous = true
|
||||||
|
mouse control = true]
|
||||||
|
model[0.5,0.1;4,4;m1;testformspec_character.b3d;testformspec_character.png]
|
||||||
|
model[0.5,4.2;4,4;m2;testformspec_character.b3d;testformspec_character.png;0,180;false;false;0,30]
|
||||||
|
model[0.5,8.3;4,4;m3;testformspec_chest.obj;default_chest_top.png,default_chest_top.png,default_chest_side.png,default_chest_side.png,default_chest_front.png,default_chest_inside.png;30,1;true;true]
|
||||||
]],
|
]],
|
||||||
|
|
||||||
-- Scroll containers
|
-- Scroll containers
|
||||||
"formspec_version[3]size[12,13]" ..
|
"formspec_version[3]size[12,13]" ..
|
||||||
scroll_fs,
|
scroll_fs,
|
||||||
|
|
||||||
|
-- Sound
|
||||||
|
[[
|
||||||
|
formspec_version[3]
|
||||||
|
size[12,13]
|
||||||
|
style[snd_btn;sound=soundstuff_mono]
|
||||||
|
style[snd_ibtn;sound=soundstuff_mono]
|
||||||
|
style[snd_drp;sound=soundstuff_mono]
|
||||||
|
style[snd_chk;sound=soundstuff_mono]
|
||||||
|
style[snd_tab;sound=soundstuff_mono]
|
||||||
|
button[0.5,0.5;2,1;snd_btn;Sound]
|
||||||
|
image_button[0.5,2;2,1;testformspec_item.png;snd_ibtn;Sound]
|
||||||
|
dropdown[0.5,4;4;snd_drp;Sound,Two,Three;]
|
||||||
|
checkbox[0.5,5.5.5;snd_chk;Sound;]
|
||||||
|
tabheader[0.5,7;8,0.65;snd_tab;Soundtab1,Soundtab2,Soundtab3;1;false;false]
|
||||||
|
]],
|
||||||
}
|
}
|
||||||
|
|
||||||
local function show_test_formspec(pname, page_id)
|
local function show_test_formspec(pname, page_id)
|
||||||
page_id = page_id or 2
|
page_id = page_id or 2
|
||||||
|
|
||||||
local fs = pages[page_id] .. "tabheader[0,0;8,0.65;maintabs;Real Coord,Styles,Noclip,Hypertext,Tabs,Invs,Anim,ScrollC;" .. page_id .. ";false;false]"
|
local fs = pages[page_id] .. "tabheader[0,0;8,0.65;maintabs;Real Coord,Styles,Noclip,Hypertext,Tabs,Invs,Anim,Model,ScrollC,Sound;" .. page_id .. ";false;false]"
|
||||||
|
|
||||||
minetest.show_formspec(pname, "testformspec:formspec", fs)
|
minetest.show_formspec(pname, "testformspec:formspec", fs)
|
||||||
end
|
end
|
||||||
|
@ -33,6 +33,13 @@ Usage:
|
|||||||
* Punch node: Make it fall
|
* Punch node: Make it fall
|
||||||
* Place: Try to teleport up to 2 units upwards, then make it fall
|
* Place: Try to teleport up to 2 units upwards, then make it fall
|
||||||
|
|
||||||
|
## Node Meta Editor
|
||||||
|
Edit and view metadata of nodes.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
|
||||||
|
* Punch: Open node metadata editor
|
||||||
|
|
||||||
## Entity Rotator
|
## Entity Rotator
|
||||||
Changes the entity rotation (with `set_rotation`).
|
Changes the entity rotation (with `set_rotation`).
|
||||||
|
|
||||||
@ -90,6 +97,13 @@ Usage:
|
|||||||
* Place: Increase move distance
|
* Place: Increase move distance
|
||||||
* Sneak+place: Decrease move distance
|
* Sneak+place: Decrease move distance
|
||||||
|
|
||||||
|
## Children Getter
|
||||||
|
Shows list of objects that are attached to an object (aka "children") in chat.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
* Punch object: Show children of punched object
|
||||||
|
* Punch air: Show your own children
|
||||||
|
|
||||||
## Entity Visual Scaler
|
## Entity Visual Scaler
|
||||||
Change visual size of entities
|
Change visual size of entities
|
||||||
|
|
||||||
@ -97,3 +111,10 @@ Usage:
|
|||||||
|
|
||||||
* Punch entity to increase visual size
|
* Punch entity to increase visual size
|
||||||
* Sneak+punch entity to decrease visual size
|
* Sneak+punch entity to decrease visual size
|
||||||
|
|
||||||
|
## Light Tool
|
||||||
|
Show light level of node.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
* Punch: Show light info of node in front of the punched node's side
|
||||||
|
* Place: Show light info of the node that you touched
|
||||||
|
@ -3,8 +3,6 @@ local F = minetest.formspec_escape
|
|||||||
|
|
||||||
dofile(minetest.get_modpath("testtools") .. "/light.lua")
|
dofile(minetest.get_modpath("testtools") .. "/light.lua")
|
||||||
|
|
||||||
-- TODO: Add a Node Metadata tool
|
|
||||||
|
|
||||||
minetest.register_tool("testtools:param2tool", {
|
minetest.register_tool("testtools:param2tool", {
|
||||||
description = S("Param2 Tool") .."\n"..
|
description = S("Param2 Tool") .."\n"..
|
||||||
S("Modify param2 value of nodes") .."\n"..
|
S("Modify param2 value of nodes") .."\n"..
|
||||||
@ -111,25 +109,6 @@ minetest.register_tool("testtools:node_setter", {
|
|||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
|
||||||
if formname == "testtools:node_setter" then
|
|
||||||
local playername = player:get_player_name()
|
|
||||||
local witem = player:get_wielded_item()
|
|
||||||
if witem:get_name() == "testtools:node_setter" then
|
|
||||||
if fields.nodename and fields.param2 then
|
|
||||||
local param2 = tonumber(fields.param2)
|
|
||||||
if not param2 then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
local meta = witem:get_meta()
|
|
||||||
meta:set_string("node", fields.nodename)
|
|
||||||
meta:set_int("node_param2", param2)
|
|
||||||
player:set_wielded_item(witem)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
minetest.register_tool("testtools:remover", {
|
minetest.register_tool("testtools:remover", {
|
||||||
description = S("Remover") .."\n"..
|
description = S("Remover") .."\n"..
|
||||||
S("Punch: Remove pointed node or object"),
|
S("Punch: Remove pointed node or object"),
|
||||||
@ -634,6 +613,54 @@ minetest.register_tool("testtools:object_attacher", {
|
|||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
local function print_object(obj)
|
||||||
|
if obj:is_player() then
|
||||||
|
return "player '"..obj:get_player_name().."'"
|
||||||
|
elseif obj:get_luaentity() then
|
||||||
|
return "LuaEntity '"..obj:get_luaentity().name.."'"
|
||||||
|
else
|
||||||
|
return "object"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
minetest.register_tool("testtools:children_getter", {
|
||||||
|
description = S("Children Getter") .."\n"..
|
||||||
|
S("Shows list of objects attached to object") .."\n"..
|
||||||
|
S("Punch object to show its 'children'") .."\n"..
|
||||||
|
S("Punch air to show your own 'children'"),
|
||||||
|
inventory_image = "testtools_children_getter.png",
|
||||||
|
groups = { testtool = 1, disable_repair = 1 },
|
||||||
|
on_use = function(itemstack, user, pointed_thing)
|
||||||
|
if user and user:is_player() then
|
||||||
|
local name = user:get_player_name()
|
||||||
|
local selected_object
|
||||||
|
local self_name
|
||||||
|
if pointed_thing.type == "object" then
|
||||||
|
selected_object = pointed_thing.ref
|
||||||
|
elseif pointed_thing.type == "nothing" then
|
||||||
|
selected_object = user
|
||||||
|
else
|
||||||
|
return
|
||||||
|
end
|
||||||
|
self_name = print_object(selected_object)
|
||||||
|
local children = selected_object:get_children()
|
||||||
|
local ret = ""
|
||||||
|
for c=1, #children do
|
||||||
|
ret = ret .. "* " .. print_object(children[c])
|
||||||
|
if c < #children then
|
||||||
|
ret = ret .. "\n"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if ret == "" then
|
||||||
|
ret = S("No children attached to @1.", self_name)
|
||||||
|
else
|
||||||
|
ret = S("Children of @1:", self_name) .. "\n" .. ret
|
||||||
|
end
|
||||||
|
minetest.chat_send_player(user:get_player_name(), ret)
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
-- Use loadstring to parse param as a Lua value
|
-- Use loadstring to parse param as a Lua value
|
||||||
local function use_loadstring(param, player)
|
local function use_loadstring(param, player)
|
||||||
-- For security reasons, require 'server' priv, just in case
|
-- For security reasons, require 'server' priv, just in case
|
||||||
@ -666,6 +693,68 @@ local function use_loadstring(param, player)
|
|||||||
return true, errOrResult
|
return true, errOrResult
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Node Meta Editor
|
||||||
|
local node_meta_posses = {}
|
||||||
|
local node_meta_latest_keylist = {}
|
||||||
|
|
||||||
|
local function show_node_meta_formspec(user, pos, key, value, keylist)
|
||||||
|
local textlist
|
||||||
|
if keylist then
|
||||||
|
textlist = "textlist[0,0.5;2.5,6.5;keylist;"..keylist.."]"
|
||||||
|
else
|
||||||
|
textlist = ""
|
||||||
|
end
|
||||||
|
minetest.show_formspec(user:get_player_name(),
|
||||||
|
"testtools:node_meta_editor",
|
||||||
|
"size[15,9]"..
|
||||||
|
"label[0,0;"..F(S("Current keys:")).."]"..
|
||||||
|
textlist..
|
||||||
|
"field[3,0.5;12,1;key;"..F(S("Key"))..";"..F(key).."]"..
|
||||||
|
"textarea[3,1.5;12,6;value;"..F(S("Value (use empty value to delete key)"))..";"..F(value).."]"..
|
||||||
|
"button[0,8;3,1;get;"..F(S("Get value")).."]"..
|
||||||
|
"button[4,8;3,1;set;"..F(S("Set value")).."]"..
|
||||||
|
"label[0,7.2;"..F(S("pos = @1", minetest.pos_to_string(pos))).."]")
|
||||||
|
end
|
||||||
|
|
||||||
|
local function get_node_meta_keylist(meta, playername, escaped)
|
||||||
|
local keys = {}
|
||||||
|
local ekeys = {}
|
||||||
|
local mtable = meta:to_table()
|
||||||
|
for k,_ in pairs(mtable.fields) do
|
||||||
|
table.insert(keys, k)
|
||||||
|
if escaped then
|
||||||
|
table.insert(ekeys, F(k))
|
||||||
|
else
|
||||||
|
table.insert(ekeys, k)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if playername then
|
||||||
|
node_meta_latest_keylist[playername] = keys
|
||||||
|
end
|
||||||
|
return table.concat(ekeys, ",")
|
||||||
|
end
|
||||||
|
|
||||||
|
minetest.register_tool("testtools:node_meta_editor", {
|
||||||
|
description = S("Node Meta Editor") .. "\n" ..
|
||||||
|
S("Place: Edit node metadata"),
|
||||||
|
inventory_image = "testtools_node_meta_editor.png",
|
||||||
|
groups = { testtool = 1, disable_repair = 1 },
|
||||||
|
on_place = function(itemstack, user, pointed_thing)
|
||||||
|
if pointed_thing.type ~= "node" then
|
||||||
|
return itemstack
|
||||||
|
end
|
||||||
|
if not user:is_player() then
|
||||||
|
return itemstack
|
||||||
|
end
|
||||||
|
local pos = pointed_thing.under
|
||||||
|
node_meta_posses[user:get_player_name()] = pos
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
local inv = meta:get_inventory()
|
||||||
|
show_node_meta_formspec(user, pos, "", "", get_node_meta_keylist(meta, user:get_player_name(), true))
|
||||||
|
return itemstack
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||||
if not (player and player:is_player()) then
|
if not (player and player:is_player()) then
|
||||||
return
|
return
|
||||||
@ -728,5 +817,70 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
|
|||||||
editor_formspec(name, selected_objects[name], prop_to_string(props[key]), sel)
|
editor_formspec(name, selected_objects[name], prop_to_string(props[key]), sel)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
elseif formname == "testtools:node_setter" then
|
||||||
|
local playername = player:get_player_name()
|
||||||
|
local witem = player:get_wielded_item()
|
||||||
|
if witem:get_name() == "testtools:node_setter" then
|
||||||
|
if fields.nodename and fields.param2 then
|
||||||
|
local param2 = tonumber(fields.param2)
|
||||||
|
if not param2 then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local meta = witem:get_meta()
|
||||||
|
meta:set_string("node", fields.nodename)
|
||||||
|
meta:set_int("node_param2", param2)
|
||||||
|
player:set_wielded_item(witem)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
elseif formname == "testtools:node_meta_editor" then
|
||||||
|
local name = player:get_player_name()
|
||||||
|
local pos = node_meta_posses[name]
|
||||||
|
if fields.keylist then
|
||||||
|
local evnt = minetest.explode_textlist_event(fields.keylist)
|
||||||
|
if evnt.type == "DCL" or evnt.type == "CHG" then
|
||||||
|
local keylist_table = node_meta_latest_keylist[name]
|
||||||
|
if not pos then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
if not keylist_table then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
if #keylist_table == 0 then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local key = keylist_table[evnt.index]
|
||||||
|
local value = meta:get_string(key)
|
||||||
|
local keylist_escaped = {}
|
||||||
|
for k,v in pairs(keylist_table) do
|
||||||
|
keylist_escaped[k] = F(v)
|
||||||
|
end
|
||||||
|
local keylist = table.concat(keylist_escaped, ",")
|
||||||
|
show_node_meta_formspec(player, pos, key, value, keylist)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
elseif fields.key and fields.key ~= "" and fields.value then
|
||||||
|
if not pos then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
if fields.get then
|
||||||
|
local value = meta:get_string(fields.key)
|
||||||
|
show_node_meta_formspec(player, pos, fields.key, value,
|
||||||
|
get_node_meta_keylist(meta, name, true))
|
||||||
|
return
|
||||||
|
elseif fields.set then
|
||||||
|
meta:set_string(fields.key, fields.value)
|
||||||
|
show_node_meta_formspec(player, pos, fields.key, fields.value,
|
||||||
|
get_node_meta_keylist(meta, name, true))
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
minetest.register_on_leaveplayer(function(player)
|
||||||
|
local name = player:get_player_name()
|
||||||
|
node_meta_latest_keylist[name] = nil
|
||||||
|
node_meta_posses[name] = nil
|
||||||
|
end)
|
||||||
|
@ -1,22 +1,37 @@
|
|||||||
|
|
||||||
local S = minetest.get_translator("testtools")
|
local S = minetest.get_translator("testtools")
|
||||||
|
|
||||||
minetest.register_tool("testtools:lighttool", {
|
local function get_func(is_place)
|
||||||
description = S("Light tool"),
|
return function(itemstack, user, pointed_thing)
|
||||||
inventory_image = "testtools_lighttool.png",
|
local pos
|
||||||
groups = { testtool = 1, disable_repair = 1 },
|
if is_place then
|
||||||
on_use = function(itemstack, user, pointed_thing)
|
pos = pointed_thing.under
|
||||||
local pos = pointed_thing.above
|
else
|
||||||
|
pos = pointed_thing.above
|
||||||
|
end
|
||||||
if pointed_thing.type ~= "node" or not pos then
|
if pointed_thing.type ~= "node" or not pos then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local node = minetest.get_node(pos)
|
local node = minetest.get_node(pos)
|
||||||
|
local pstr = minetest.pos_to_string(pos)
|
||||||
local time = minetest.get_timeofday()
|
local time = minetest.get_timeofday()
|
||||||
local sunlight = minetest.get_natural_light(pos)
|
local sunlight = minetest.get_natural_light(pos)
|
||||||
local artificial = minetest.get_artificial_light(node.param1)
|
local artificial = minetest.get_artificial_light(node.param1)
|
||||||
local message = ("param1 0x%02x | time %.5f | sunlight %d | artificial %d")
|
local message = ("pos=%s | param1=0x%02x | " ..
|
||||||
:format(node.param1, time, sunlight, artificial)
|
"sunlight=%d | artificial=%d | timeofday=%.5f" )
|
||||||
|
:format(pstr, node.param1, sunlight, artificial, time)
|
||||||
minetest.chat_send_player(user:get_player_name(), message)
|
minetest.chat_send_player(user:get_player_name(), message)
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
minetest.register_tool("testtools:lighttool", {
|
||||||
|
description = S("Light Tool") .. "\n" ..
|
||||||
|
S("Show light values of node") .. "\n" ..
|
||||||
|
S("Punch: Light of node above touched node") .. "\n" ..
|
||||||
|
S("Place: Light of touched node itself"),
|
||||||
|
inventory_image = "testtools_lighttool.png",
|
||||||
|
groups = { testtool = 1, disable_repair = 1 },
|
||||||
|
on_use = get_func(false),
|
||||||
|
on_place = get_func(true),
|
||||||
})
|
})
|
||||||
|
Binary file not shown.
After Width: | Height: | Size: 281 B |
Binary file not shown.
After Width: | Height: | Size: 135 B |
Loading…
Reference in New Issue
Block a user