333 lines
6.5 KiB
Lua
333 lines
6.5 KiB
Lua
local utils, mod_storage = ...
|
|
|
|
|
|
|
|
if minetest.get_translator and minetest.get_translator ("lwcomponents") then
|
|
utils.S = minetest.get_translator ("lwcomponents")
|
|
elseif minetest.global_exists ("intllib") then
|
|
if intllib.make_gettext_pair then
|
|
utils.S = intllib.make_gettext_pair ()
|
|
else
|
|
utils.S = intllib.Getter ()
|
|
end
|
|
else
|
|
utils.S = function (s) return s end
|
|
end
|
|
|
|
|
|
|
|
-- check for mesecon
|
|
if minetest.global_exists ("mesecon") then
|
|
utils.mesecon_supported = true
|
|
utils.mesecon_state_on = mesecon.state.on
|
|
utils.mesecon_state_off = mesecon.state.off
|
|
utils.mesecon_receptor_on = mesecon.receptor_on
|
|
utils.mesecon_receptor_off = mesecon.receptor_off
|
|
utils.mesecon_default_rules = mesecon.rules.default
|
|
utils.mesecon_flat_rules = mesecon.rules.flat
|
|
|
|
else
|
|
utils.mesecon_supported = false
|
|
utils.mesecon_state_on = "on"
|
|
utils.mesecon_state_off = "off"
|
|
utils.mesecon_default_rules = { }
|
|
utils.mesecon_flat_rules = { }
|
|
|
|
-- dummies
|
|
utils.mesecon_receptor_on = function (pos, rules)
|
|
end
|
|
|
|
utils.mesecon_receptor_off = function (pos, rules)
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
-- check for digilines
|
|
if minetest.global_exists ("digilines") then
|
|
utils.digilines_supported = true
|
|
utils.digilines_default_rules = digiline.rules.default
|
|
utils.digilines_flat_rules = {
|
|
{ x = 1, y = 0, z = 0 },
|
|
{ x = -1, y = 0, z = 0 },
|
|
{ x = 0, y = 0, z = 1 },
|
|
{ x = 0, y = 0, z = -1 },
|
|
}
|
|
utils.digilines_receptor_send = digilines.receptor_send
|
|
else
|
|
utils.digilines_supported = false
|
|
utils.digilines_default_rules = { }
|
|
utils.digilines_flat_rules = { }
|
|
|
|
-- dummy
|
|
utils.digilines_receptor_send = function (pos, rules, channel, msg)
|
|
end
|
|
end
|
|
|
|
|
|
|
|
-- check for lwdrops
|
|
if minetest.global_exists ("lwdrops") then
|
|
utils.lwdrops_supported = true
|
|
utils.on_destroy = lwdrops.on_destroy
|
|
utils.item_pickup = lwdrops.item_pickup
|
|
utils.item_drop = lwdrops.item_drop
|
|
else
|
|
utils.lwdrops_supported = false
|
|
|
|
-- dummy
|
|
utils.on_destroy = function (itemstack)
|
|
end
|
|
|
|
utils.item_pickup = function (entity, cleanup)
|
|
local stack = nil
|
|
|
|
if entity and entity.name and entity.name == "__builtin:item" and
|
|
entity.itemstring and entity.itemstring ~= "" then
|
|
|
|
stack = ItemStack (entity.itemstring)
|
|
|
|
if cleanup ~= false then
|
|
entity.itemstring = ""
|
|
entity.object:remove ()
|
|
end
|
|
end
|
|
|
|
return stack
|
|
end
|
|
|
|
utils.item_drop = function (itemstack, dropper, pos)
|
|
return minetest.item_drop (itemstack, dropper, pos)
|
|
end
|
|
end
|
|
|
|
|
|
|
|
-- check for unifieddyes
|
|
if minetest.global_exists ("unifieddyes") then
|
|
utils.unifieddyes_supported = true
|
|
else
|
|
utils.unifieddyes_supported = false
|
|
end
|
|
|
|
|
|
|
|
-- check for hopper
|
|
if minetest.global_exists ("hopper") then
|
|
utils.hopper_supported = true
|
|
|
|
utils.hopper_add_container = function (list)
|
|
hopper:add_container (list)
|
|
end
|
|
else
|
|
utils.hopper_supported = false
|
|
|
|
utils.hopper_add_container = function (list)
|
|
end
|
|
end
|
|
|
|
|
|
|
|
-- check for digistuff
|
|
if minetest.global_exists ("digistuff") then
|
|
utils.digistuff_supported = true
|
|
else
|
|
utils.digistuff_supported = false
|
|
end
|
|
|
|
|
|
|
|
function utils.can_interact_with_node (pos, player)
|
|
if not player or not player:is_player () then
|
|
return false
|
|
end
|
|
|
|
if minetest.check_player_privs (player, "protection_bypass") then
|
|
return true
|
|
end
|
|
|
|
local meta = minetest.get_meta (pos)
|
|
if meta then
|
|
local owner = meta:get_string ("owner")
|
|
local name = player:get_player_name ()
|
|
|
|
if not owner or owner == "" or owner == name then
|
|
return true
|
|
end
|
|
end
|
|
|
|
return false
|
|
end
|
|
|
|
|
|
|
|
function utils.get_far_node (pos)
|
|
local node = minetest.get_node (pos)
|
|
|
|
if node.name == "ignore" then
|
|
minetest.get_voxel_manip ():read_from_map (pos, pos)
|
|
|
|
node = minetest.get_node (pos)
|
|
|
|
if node.name == "ignore" then
|
|
return nil
|
|
end
|
|
end
|
|
|
|
return node
|
|
end
|
|
|
|
|
|
|
|
function utils.find_item_def (name)
|
|
local def = minetest.registered_items[name]
|
|
|
|
if not def then
|
|
def = minetest.registered_craftitems[name]
|
|
end
|
|
|
|
if not def then
|
|
def = minetest.registered_nodes[name]
|
|
end
|
|
|
|
if not def then
|
|
def = minetest.registered_tools[name]
|
|
end
|
|
|
|
return def
|
|
end
|
|
|
|
|
|
|
|
function utils.destroy_node (pos)
|
|
local node = utils.get_far_node (pos)
|
|
|
|
if node then
|
|
local items = minetest.get_node_drops (node, nil)
|
|
|
|
if items then
|
|
for i = 1, #items do
|
|
local stack = ItemStack (items[i])
|
|
|
|
if stack and not stack:is_empty () then
|
|
local name = stack:get_name ()
|
|
local def = utils.find_item_def (name)
|
|
|
|
if def then
|
|
if def.preserve_metadata then
|
|
def.preserve_metadata (pos, node, minetest.get_meta (pos), { stack })
|
|
end
|
|
|
|
utils.on_destroy (stack)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
minetest.remove_node (pos)
|
|
end
|
|
end
|
|
|
|
|
|
|
|
utils.registered_spawners = { }
|
|
-- each entry [spawner_itemname] = spawner_func
|
|
|
|
|
|
|
|
function utils.register_spawner (itemname, spawn_func)
|
|
if type (itemname) == "string" and type (spawn_func) == "function" then
|
|
if not utils.registered_spawners[itemname] then
|
|
utils.registered_spawners[itemname] = spawn_func
|
|
|
|
return true
|
|
end
|
|
end
|
|
|
|
return false
|
|
end
|
|
|
|
|
|
|
|
function utils.spawn_registered (itemname, spawn_pos, itemstack, owner, spawner_pos, spawner_dir, force)
|
|
local func = utils.registered_spawners[itemname]
|
|
|
|
if func then
|
|
local result, obj, cancel = pcall (func, spawn_pos, itemstack, owner, spawner_pos, spawner_dir, force)
|
|
|
|
if result and (obj == nil or type (obj) == "userdata" or type (obj) == "table") then
|
|
return obj, cancel
|
|
end
|
|
|
|
minetest.log ("error", "lwcomponents.register_spawner spawner function for "..itemname.." failed "..
|
|
((type (obj) == "string" and obj) or ""))
|
|
|
|
return nil, true
|
|
end
|
|
|
|
return nil, false
|
|
end
|
|
|
|
|
|
|
|
function utils.can_place (pos)
|
|
local node = minetest.get_node_or_nil (pos)
|
|
|
|
if node and node.name ~= "air" then
|
|
local def = minetest.registered_nodes[node.name]
|
|
|
|
if not def or not def.buildable_to then
|
|
return false
|
|
end
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
|
|
|
|
function utils.is_protected (pos, player)
|
|
local name = (player and player:get_player_name ()) or ""
|
|
|
|
return minetest.is_protected (pos, name)
|
|
end
|
|
|
|
|
|
|
|
function utils.get_on_rightclick (pos, player)
|
|
local node = minetest.get_node_or_nil (pos)
|
|
|
|
if node then
|
|
local def = minetest.registered_nodes[node.name]
|
|
|
|
if def and def.on_rightclick and
|
|
not (player and player:is_player () and
|
|
player:get_player_control ().sneak) then
|
|
|
|
return def.on_rightclick
|
|
end
|
|
end
|
|
|
|
return nil
|
|
end
|
|
|
|
|
|
|
|
function utils.is_creative (player)
|
|
if minetest.settings:get_bool ("creative_mode") then
|
|
return true
|
|
end
|
|
|
|
if player and player:is_player () then
|
|
return minetest.is_creative_enabled (player:get_player_name ()) or
|
|
minetest.check_player_privs (player, "creative")
|
|
end
|
|
|
|
return false
|
|
end
|
|
|
|
|
|
|
|
--
|