/
hidden.lua
176 lines (157 loc) · 5.09 KB
/
hidden.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
--[[
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