mods that hopefully work for a TechAge-based pack
This commit is contained in:
@@ -0,0 +1,176 @@
|
||||
--[[
|
||||
|
||||
Networks
|
||||
========
|
||||
|
||||
Copyright (C) 2021 Joachim Stolberg
|
||||
|
||||
AGPL v3
|
||||
See LICENSE.txt for more information
|
||||
|
||||
]]--
|
||||
|
||||
-- for lazy programmers
|
||||
local S2P = minetest.string_to_pos
|
||||
local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end
|
||||
local M = minetest.get_meta
|
||||
local N = tubelib2.get_node_lvm
|
||||
|
||||
local hidden_message = ""
|
||||
local tFillingMaterial = {}
|
||||
|
||||
-- handle old techage names
|
||||
local function legacy_names(meta)
|
||||
if meta:contains("techage_hidden_nodename") then
|
||||
meta:set_string("netw_name", meta:get_string("techage_hidden_nodename"))
|
||||
meta:set_string("techage_hidden_nodename", "")
|
||||
end
|
||||
if meta:contains("tl2_param2") then
|
||||
meta:set_int("netw_param2", meta:get_int("tl2_param2"))
|
||||
meta:set_string("tl2_param2", "")
|
||||
end
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
-- API
|
||||
-------------------------------------------------------------------------------
|
||||
function networks.hidden_name(pos)
|
||||
local meta = M(pos)
|
||||
legacy_names(meta)
|
||||
if meta:contains("netw_name") then
|
||||
return meta:get_string("netw_name")
|
||||
end
|
||||
end
|
||||
|
||||
function networks.get_nodename(pos)
|
||||
local meta = M(pos)
|
||||
legacy_names(meta)
|
||||
if meta:contains("netw_name") then
|
||||
return meta:get_string("netw_name")
|
||||
end
|
||||
return tubelib2.get_node_lvm(pos).name
|
||||
end
|
||||
|
||||
function networks.get_node(pos)
|
||||
local meta = M(pos)
|
||||
legacy_names(meta)
|
||||
if meta:contains("netw_name") then
|
||||
return {name = meta:get_string("netw_name"), param2 = meta:get_int("netw_param2")}
|
||||
end
|
||||
return tubelib2.get_node_lvm(pos)
|
||||
end
|
||||
|
||||
local get_node = networks.get_node
|
||||
local get_nodename = networks.get_nodename
|
||||
|
||||
-- Override methods of tubelib2 to store tube/cable info as metadata,
|
||||
-- used for hidden cables/tubes/junctions/switches.
|
||||
function networks.use_metadata(tlib2)
|
||||
tlib2.get_primary_node_param2 = function(self, pos, dir)
|
||||
local npos = vector.add(pos, tubelib2.Dir6dToVector[dir or 0])
|
||||
if self.primary_node_names[get_nodename(npos)] then
|
||||
local meta = M(npos)
|
||||
return meta:get_int("netw_param2"), npos
|
||||
end
|
||||
end
|
||||
tlib2.is_primary_node = function(self, pos, dir)
|
||||
local npos = vector.add(pos, tubelib2.Dir6dToVector[dir or 0])
|
||||
return self.primary_node_names[get_nodename(npos)] ~= nil
|
||||
end
|
||||
tlib2.get_secondary_node = function(self, pos, dir)
|
||||
local npos = vector.add(pos, tubelib2.Dir6dToVector[dir or 0])
|
||||
local node = get_node(npos)
|
||||
if self.secondary_node_names[node.name] then
|
||||
return node, npos, true
|
||||
end
|
||||
end
|
||||
tlib2.is_secondary_node = function(self, pos, dir)
|
||||
local npos = vector.add(pos, tubelib2.Dir6dToVector[dir or 0])
|
||||
local name = get_nodename(npos)
|
||||
return self.secondary_node_names[name] ~= nil
|
||||
end
|
||||
end
|
||||
|
||||
function networks.hide_node(pos, node, placer)
|
||||
local inv = placer:get_inventory()
|
||||
local stack = inv:get_stack("main", 1)
|
||||
local taken = stack:take_item(1)
|
||||
|
||||
if taken:get_count() == 1 and tFillingMaterial[taken:get_name()] then
|
||||
local meta = M(pos)
|
||||
meta:set_string("netw_name", node.name)
|
||||
local param2 = 0
|
||||
local ndef = minetest.registered_nodes[taken:get_name()]
|
||||
if ndef.paramtype2 and ndef.paramtype2 == "facedir" then
|
||||
param2 = minetest.dir_to_facedir(placer:get_look_dir(), true)
|
||||
elseif ndef.paramtype2 and ndef.paramtype2 == "color" then
|
||||
param2 = taken:get_meta():get_int("palette_index")
|
||||
end
|
||||
minetest.swap_node(pos, {name = taken:get_name(), param2 = param2})
|
||||
inv:set_stack("main", 1, stack)
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
function networks.open_node(pos, node, placer)
|
||||
local name = networks.hidden_name(pos)
|
||||
local param2
|
||||
if M(pos):get_int("netw_param2") ~= 0 then
|
||||
param2 = M(pos):get_int("netw_param2")
|
||||
else
|
||||
param2 = M(pos):get_int("netw_param2_copy")
|
||||
end
|
||||
minetest.swap_node(pos, {name = name, param2 = param2 % 32 + M(pos):get_int("netw_color_param2")})
|
||||
local meta = M(pos)
|
||||
meta:set_string("netw_name", "")
|
||||
local stack = ItemStack(node.name)
|
||||
local inv = placer:get_inventory()
|
||||
local ndef = minetest.registered_nodes[node.name]
|
||||
if ndef and ndef.paramtype2 == "color" then
|
||||
stack:get_meta():set_int("palette_index", node.param2)
|
||||
end
|
||||
local leftover = inv:add_item("main", stack)
|
||||
if leftover:get_count() > 0 then
|
||||
minetest.add_item(pos, leftover)
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
-- Patch registered nodes
|
||||
-------------------------------------------------------------------------------
|
||||
function networks.register_hidden_message(msg)
|
||||
hidden_message = msg
|
||||
end
|
||||
|
||||
local function get_new_can_dig(old_can_dig)
|
||||
return function(pos, player, ...)
|
||||
if networks.hidden_name(pos) then
|
||||
if player and player.get_player_name then
|
||||
minetest.chat_send_player(player:get_player_name(), hidden_message)
|
||||
end
|
||||
return false
|
||||
end
|
||||
if old_can_dig then
|
||||
return old_can_dig(pos, player, ...)
|
||||
else
|
||||
return true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Register item names to be used as filling material to hide tubes/cables
|
||||
function networks.register_filling_items(names)
|
||||
for _, name in ipairs(names) do
|
||||
tFillingMaterial[name] = true
|
||||
-- Change can_dig for registered filling materials.
|
||||
local ndef = minetest.registered_nodes[name]
|
||||
if ndef then
|
||||
local old_can_dig = ndef.can_dig
|
||||
minetest.override_item(ndef.name, {
|
||||
can_dig = get_new_can_dig(old_can_dig)
|
||||
})
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user