-- Properties for NPC -- -- This is used when an NPC doesn't have a specific dialog but still wants to -- make use of a (or some) generic dialog(es) -- helper function yl_speak_up.get_npc_properties = function(pname) if(not(pname) or not(yl_speak_up.speak_to[pname])) then return end local obj = yl_speak_up.speak_to[pname].obj if(not(obj)) then return end local entity = obj:get_luaentity() if(not(entity)) then return end if(not(entity.yl_speak_up)) then return end local properties = entity.yl_speak_up.properties if(not(properties)) then properties = {} entity.yl_speak_up.properties = properties end local prop_names = {} for k, v in pairs(properties) do table.insert(prop_names, k) end table.sort(prop_names) return {entity = entity, properties = properties, prop_names = prop_names} end yl_speak_up.input_properties = function(player, formname, fields) local pname = player:get_player_name() if(not(pname) or not(yl_speak_up.speak_to[pname])) then return end local n_id = yl_speak_up.speak_to[pname].n_id if(fields and fields.back and fields.back ~= "") then yl_speak_up.show_fs(player, "initial_config", {n_id = n_id, d_id = yl_speak_up.speak_to[pname].d_id, false}) return end local selected_row = nil if(fields and fields.store_new_val and fields.store_new_val ~= "") then local property_data = yl_speak_up.get_npc_properties(pname) if(property_data and fields.prop_name and fields.prop_name ~= "" and fields.prop_val and fields.prop_val ~= "") then local name = fields.prop_name local val = fields.prop_val -- add the new property or change an existing one property_data.properties[name] = val -- store it property_data.entity.yl_speak_up.properties = property_data.properties end elseif(fields and fields.delete_prop and fields.delete_prop ~= "") then local property_data = yl_speak_up.get_npc_properties(pname) if(property_data and fields.prop_name and fields.prop_name ~= "") then local name = fields.prop_name -- delete the old property property_data.properties[name] = nil -- store it property_data.entity.yl_speak_up.properties = property_data.properties end elseif(fields and fields.table_of_properties) then local selected = minetest.explode_table_event(fields.table_of_properties) if(selected.type == "CHG" or selected.type == "DLC") then selected_row = selected.row end end yl_speak_up.show_fs(player, "properties", {selected = selected_row}) end yl_speak_up.get_fs_properties = function(pname, selected) if(not(pname)) then return "" end local n_id = yl_speak_up.speak_to[pname].n_id -- is the player editing this npc? if not: abort if(not(yl_speak_up.edit_mode[pname]) or (yl_speak_up.edit_mode[pname] ~= n_id)) then return "" end local property_data = yl_speak_up.get_npc_properties(pname) if(not(property_data)) then -- something went wrong - there really is nothing useful we can do -- if the NPC we want to interact with doesn't exist or is broken return end local s = "" local anz_prop = #property_data.prop_names for i, k in ipairs(property_data.prop_names) do local v = property_data.properties[k] s = s.."#BBBBFF,"..minetest.formspec_escape(k)..","..minetest.formspec_escape(v).."," end s = s.."#00FF00,add,Add a new property" if(not(selected) or selected == "") then selected = -1 end local add_selected = "label[3.5,6.5;No property selected.]" selected = tonumber(selected) if(selected > anz_prop + 1 or selected < 1) then selected = -1 elseif(selected > anz_prop) then add_selected = "label[0.2,6.5;Add new property:]".. "field[3.0,6.5;3.5,1.0;prop_name;;]".. "label[6.5,6.5;with value:]".. "field[8.2,6.5;4.5,1.0;prop_val;;]".. "button[8.2,7.8;2.0,1.0;store_new_val;Store]" else local name = property_data.prop_names[selected] local val = minetest.formspec_escape(property_data.properties[name]) name = minetest.formspec_escape(name) add_selected = "label[0.2,6.5;Change property:]".. "field[3.0,6.5;3.5,1.0;prop_name;;"..name.."]".. "label[6.5,6.5;to value:]".. "field[8.2,6.5;4.5,1.0;prop_val;;"..val.."]".. "button[8.2,7.8;2.0,1.0;store_new_val;Store]".. "button[10.4,7.8;2.0,1.0;delete_prop;Delete]" end if(selected < 1) then selected = "" end local dialog = yl_speak_up.speak_to[pname].dialog local npc_name = minetest.formspec_escape(dialog.n_npc or "- nameless -") return "size[12.5,8.5]" .. "label[2,0;Properties of "..npc_name.." (ID: "..tostring(n_id).."):]".. "tablecolumns[color,span=1;text;text]".. "table[0.2,0.5;12,4.0;table_of_properties;"..s..";"..tostring(selected).."]".. "tooltip[0.2,0.5;12,4.0;".. "Click on \"add\" to add a new property.\n".. "Click on the name of a property to change or delete it.]".. "label[2.0,4.5;".. "Properties are important for NPC that want to make use of generic dialogs.\n".. "Properties can be used to determine which generic dialog(s) shall apply to\n".. "this particular NPC and how they shall be configured.]".. "button[5.0,7.8;2.0,0.9;back;Back]".. add_selected end