forked from your-land-mirror/yl_speak_up
151 lines
5.0 KiB
Lua
151 lines
5.0 KiB
Lua
-- 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
|