minetest-mod-itemedit/init.lua

64 lines
2.8 KiB
Lua

local function FE(text)
return core.formspec_escape(text)
end
local function get_fs(name, witem,index)
local start = index - 1 or 0
local meta = witem:get_meta()
if not meta then return end
local toolcaps = witem:get_tool_capabilities()
if not toolcaps then return end
local descr = meta:get("description") or witem:get_description()
local color = meta:get_string("color",'')
local count_meta = meta:get_string("count_meta")
local full_punch_interval = dump(toolcaps.full_punch_interval,'')
local max_drop_level = dump(toolcaps.max_drop_level,'')
local groupcaps = FE(core.serialize(toolcaps.groupcaps))
local damage_groups = FE(core.serialize(toolcaps.damage_groups))
local fs = "size[10.2,12]" ..
"list[current_player;main;9,0.1;1,1;"..start.."]" ..
"field[0.4,0.6;3,1;description;Description;"..descr.."]" ..
"field_close_on_enter[description;false]" ..
"field[0.4,1.6;3,1;color;Color;"..color.."]" ..
"field_close_on_enter[color;false]" ..
"field[0.4,2.6;3,1;count_meta;Count_meta;"..count_meta.."]" ..
"field_close_on_enter[count_meta;false]" ..
"field[3.4,0.6;2.5,1;full_punch_interval;Full punch interval;"..full_punch_interval.."]" ..
"field_close_on_enter[full_punch_interval;false]" ..
"field[3.4,1.6;2.5,1;max_drop_level;Max drop level;"..max_drop_level.."]" ..
"field_close_on_enter[max_drop_level;false]" ..
"textarea[0.4,3.5;10,4.8;groupcaps;Groupcaps;"..groupcaps.."]" ..
"textarea[0.4,7.9;10,4.8;damage_groups;Damage groups;"..damage_groups.."]" ..
"button[3.1,2.3;2.2,1;apply;Apply]"
core.show_formspec(name,"itemeditor",fs)
end
core.register_privilege("itemedit","Allows to use item editor")
core.register_chatcommand("itemedit",{
description = "Modify a wielded item",
privs = {itemedit=true},
func = function(name,param)
local player = core.get_player_by_name(name)
if not player then return false, "No Player" end
local witem = player:get_wielded_item()
local index = player:get_wield_index()
if not witem then return false, "Error getting wielded item" end
if witem:get_name() == "" then return false, "Please take item in hand" end
get_fs(name,witem,index)
end})
core.register_on_player_receive_fields(function(player, formname, fields)
if formname ~= "itemeditor" then return end
local name = player:get_player_name()
if not name then return end
local witem = player:get_wielded_item()
local meta = witem:get_meta()
if fields.apply then
meta:set_string("description",fields.description)
meta:set_string("color",fields.color)
meta:set_string("count_meta",fields.count_meta)
meta:set_tool_capabilities({full_punch_interval=fields.full_punch_interval,max_drop_level=fields.max_drop_level,groupcaps=core.deserialize(fields.groupcaps),damage_groups=core.deserialize(fields.damage_groups)})
player:set_wielded_item(witem)
end
end)