Clean up mod code
[MineClone.git] / mods / wallet / init.lua
blobf86f82c6a64edc2514f9893b15f36a9b4a9f5220
1 local function rshift(x, by)
2 return math.floor(x / 2 ^ by)
3 end
5 local directions = {
6 {x = 1, y = 0, z = 0},
7 {x = 0, y = 0, z = 1},
8 {x = -1, y = 0, z = 0},
9 {x = 0, y = 0, z = -1},
10 {x = 0, y = -1, z = 0},
13 local function update_wall(pos)
14 local thisnode = minetest.env:get_node(pos)
16 if thisnode.name:find("wallet:wall") ~= 1 and
17 thisnode.name:find("wallet:wallmossy") ~= 1 then
18 -- Not a wall
19 return
20 end
22 -- Get the node's base name, including the underscore since we will need it
23 local basename = thisnode.name:find("_")
24 if basename == nil then -- New wall
25 basename = thisnode.name .. "_"
26 else -- Already placed wall
27 basename = thisnode.name:sub(1, basename)
28 end
30 local sum = 0
32 -- Neighbouring walkable nodes
33 for i = 1, 4 do
34 local dir = directions[i]
35 local node = minetest.env:get_node({x = pos.x + dir.x, y = pos.y + dir.y, z = pos.z + dir.z})
36 if minetest.registered_nodes[node.name].walkable then
37 sum = sum + 2 ^ (i - 1)
38 end
39 end
41 -- Torches or walkable nodes above the wall
42 local upnode = minetest.env:get_node({x = pos.x, y = pos.y+1, z = pos.z})
43 if sum == 5 or sum == 10 then
44 if minetest.registered_nodes[upnode.name].walkable or upnode.name == "torches:floor" then
45 sum = sum + 11
46 end
47 end
49 --[[if sum == 0 then
50 sum = 15
51 end]]
53 minetest.env:add_node(pos, {name = basename..sum})
54 end
56 function update_wall_global(pos)
57 for i = 1,5 do
58 local dir = directions[i]
59 update_wall({x = pos.x + dir.x, y = pos.y + dir.y, z = pos.z + dir.z})
60 end
61 end
63 local half_blocks = {
64 {4/16, -0.5, -3/16, 0.5, 5/16, 3/16},
65 {-3/16, -0.5, 4/16, 3/16, 5/16, 0.5},
66 {-0.5, -0.5, -3/16, -4/16, 5/16, 3/16},
67 {-3/16, -0.5, -0.5, 3/16, 5/16, -4/16}
70 local pillar = {-4/16, -0.5, -4/16, 4/16, 0.5, 4/16}
72 local full_blocks = {
73 {-0.5, -0.5, -3/16, 0.5, 5/16, 3/16},
74 {-3/16, -0.5, -0.5, 3/16, 5/16, 0.5}
77 local function register_wall(nodename, name, texture, invtex)
78 for i = 0, 15 do
79 local need = {}
80 local need_pillar = false
81 for j = 1, 4 do
82 if rshift(i, j - 1) % 2 == 1 then
83 need[j] = true
84 end
85 end
87 local take = {}
88 if need[1] == true and need[3] == true then
89 need[1] = nil
90 need[3] = nil
91 table.insert(take, full_blocks[1])
92 end
93 if need[2] == true and need[4] == true then
94 need[2] = nil
95 need[4] = nil
96 table.insert(take, full_blocks[2])
97 end
98 for k in pairs(need) do
99 table.insert(take, half_blocks[k])
100 need_pillar = true
102 if i == 15 or i == 0 then need_pillar = true end
103 if need_pillar then table.insert(take, pillar) end
105 minetest.register_node(nodename.."_"..i, {
106 collision_box = {
107 type = 'fixed',
108 fixed = {-4/16, -1, -4/16, 4/16, 1, 4/16}
110 drawtype = "nodebox",
111 tile_images = {texture},
112 paramtype = "light",
113 groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3,fences=1},
114 drop = nodename,
115 node_box = {
116 type = "fixed",
117 fixed = take
122 minetest.register_node(nodename.."_16", {
123 drawtype = "nodebox",
124 collision_box = {
125 type = 'fixed',
126 fixed = {-4/16, -1, -4/16, 4/16, 1, 4/16}
128 tile_images = {texture},
129 paramtype = "light",
130 groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3,fences=1},
131 drop = nodename,
132 node_box = {
133 type = "fixed",
134 fixed = {pillar, full_blocks[1]}
138 minetest.register_node(nodename.."_21", {
139 drawtype = "nodebox",
140 collision_box = {
141 type = 'fixed',
142 fixed = {-4/16, -1, -4/16, 4/16, 1, 4/16}
144 tile_images = {texture},
145 paramtype = "light",
146 groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3,fences=1},
147 drop = nodename,
148 node_box = {
149 type = "fixed",
150 fixed = {pillar, full_blocks[2]}
154 -- Inventory item
155 minetest.register_node(nodename, {
156 description = name,
157 paramtype = "light",
158 tile_images = {texture},
159 inventory_image = invtex,
160 stack_max = 64,
161 drawtype = "nodebox",
162 node_box = {
163 type = "fixed",
164 fixed = pillar
166 collision_box = {
167 type = 'fixed',
168 fixed = {-4/16, -1, -4/16, 4/16, 1, 4/16}
170 collisionbox = {-0.2, 0, -0.2, 0.2, 1.4, 0.2},
171 on_construct = update_wall
175 -- Cobblestone wall
177 register_wall("wallet:wall", "Cobblestone Wall", "default_cobble.png", "cobblestone_wallet.png")
178 minetest.register_craft({
179 output = 'wallet:wall 6',
180 recipe = {
181 {'default:cobble', 'default:cobble', 'default:cobble'},
182 {'default:cobble', 'default:cobble', 'default:cobble'}
186 -- Mossy wall
188 register_wall("wallet:wallmossy", "Mossy Cobblestone Wall", "default_mossycobble.png", "cobblestonemossy_wallet.png")
189 minetest.register_craft({
190 output = 'wallet:wallmossy 6',
191 recipe = {
192 {'default:mossycobble', 'default:mossycobble', 'default:mossycobble'},
193 {'default:mossycobble', 'default:mossycobble', 'default:mossycobble'}
197 minetest.register_on_placenode(update_wall_global)
198 minetest.register_on_dignode(update_wall_global)