-
Notifications
You must be signed in to change notification settings - Fork 0
/
chisel.lua
235 lines (204 loc) · 6.32 KB
/
chisel.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
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
local S = ...
jonez.chisel = {
chiselable = {},
group_style_index = {},
group_style_nodes = {},
player_copied_style = {},
}
jonez.chisel.register_chiselable = function(node_name, group_name, style)
jonez.chisel.chiselable[node_name] = {}
jonez.chisel.chiselable[node_name].group_name = group_name
jonez.chisel.chiselable[node_name].style = style
if not jonez.chisel.group_style_nodes[group_name] then
jonez.chisel.group_style_nodes[group_name] = {}
end
jonez.chisel.group_style_nodes[group_name][style] = node_name
end
jonez.chisel.register_chiselable_stair_and_slab = function(node_subname, group_subname, style)
jonez.chisel.register_chiselable("stairs:stair_" .. node_subname, "stairs:stair_" .. group_subname, style)
jonez.chisel.register_chiselable("stairs:stair_inner_" .. node_subname, "stairs:stair_inner_" .. group_subname, style)
jonez.chisel.register_chiselable("stairs:stair_outer_" .. node_subname, "stairs:stair_outer_" .. group_subname, style)
jonez.chisel.register_chiselable("stairs:slab_" .. node_subname, "stairs:slab_" .. group_subname, style)
end
local function chisel_interact(player, pointed_thing, is_right_click)
if not player then return end
if pointed_thing.type ~= "node" then
return
end
local pos = pointed_thing.under
local is_sneak = player:get_player_control().sneak
local player_name = player:get_player_name()
-- Check for node protection
if minetest.is_protected(pos, player_name) then
minetest.chat_send_player(player_name, "You're not authorized to alter nodes in this area")
minetest.record_protection_violation(pos, player_name)
return
end
-- Retrieve group info and styles
local node = minetest.get_node(pos)
local node_name = node.name
if not jonez.chisel.chiselable[node_name] then
minetest.chat_send_player(player_name, "Not chiselable")
return
end
local group_name = jonez.chisel.chiselable[node_name].group_name
local style = jonez.chisel.chiselable[node_name].style
local group = jonez.chisel.group_style_nodes[group_name]
local new_style, new_node_name
-- Now branch on the four user-input cases
if is_right_click then
if is_sneak then
-- Copy style
jonez.chisel.player_copied_style[player_name] = style
minetest.chat_send_player(player_name, "Chisel style " .. style .. " copied")
return
else
-- Paste style
new_style = jonez.chisel.player_copied_style[player_name]
if not new_style then
minetest.chat_send_player(player_name, "No chisel style copied yet, use sneak + right-click to copy a style")
return
end
-- Already the correct style, exit now!
if new_style == style then
return
end
new_node_name = group[new_style]
if not new_node_name then
minetest.chat_send_player(player_name, "Chisel style " .. new_style ..
" is not supported by this chisel group " .. group_name)
return
end
end
else
if is_sneak then
-- Backward cycle mode
for _,v in pairs(group) do
if v == node_name then break end
new_node_name = v
end
if new_node_name == nil then
-- Not found? Go for the last element
for _,v in pairs(group) do
new_node_name = v
end
end
else
-- Forward cycle mode
new_node_name = select(2, next(group, style))
if new_node_name == nil then
new_node_name = select(2, next(group))
end
end
end
-- Check if rotation could be preserved
local nodedef = minetest.registered_nodes[node_name]
local new_nodedef = minetest.registered_nodes[new_node_name]
local rotation , new_rotation
if nodedef and new_nodedef then
if ( nodedef.paramtype2 == "facedir" or nodedef.paramtype2 == "colorfacedir" )
and( new_nodedef.paramtype2 == "facedir" or new_nodedef.paramtype2 == "colorfacedir" ) then
rotation = node.param2 % 32 --rotation are on the last 5 digits
end
end
-- Set the new node
minetest.set_node(pos, {name= new_node_name})
local new_node = minetest.get_node(pos)
-- Copy rotation if needed!
if rotation ~= nil then
new_rotation = new_node.param2 % 32
if new_rotation ~= rotation then
new_node.param2 = new_node.param2 - new_rotation + rotation
minetest.swap_node(pos, new_node)
end
end
minetest.sound_play("jonez_carve", {pos = pos, gain = 0.7, max_hear_distance = 5})
end
--The chisel to carve the marble
minetest.register_craftitem("jonez:chisel", {
description = S("Chisel for Marble"),
inventory_image = "jonez_chisel.png",
wield_image = "jonez_chisel.png^[transformR180",
on_use = function(itemstack, player, pointed_thing)
chisel_interact(player, pointed_thing, false)
return itemstack
end,
on_place = function(itemstack, player, pointed_thing)
chisel_interact(player, pointed_thing, true)
return itemstack
end,
})
minetest.register_craft({
type = "shaped",
output = "jonez:chisel",
recipe = {
{"", "", "default:diamond"},
{"", "default:steel_ingot", ""},
{"default:stick", "", ""},
}
})
if minetest.get_modpath("unified_inventory") then
unified_inventory.register_craft_type("jonez:chisel", {
description = S("Chisel for Marble"),
icon = "jonez_chisel.png",
width = 1,
height = 1,
})
minetest.register_on_mods_loaded(function()
for _, group in pairs(jonez.chisel.group_style_nodes) do
local prev_node
local first_node
for _, node in pairs(group) do
if not first_node then
first_node = node
end
if prev_node then
minetest.log("verbose", ("[jonez] chisel recipe %s -> %s"):format(node, prev_node))
unified_inventory.register_craft({
type = "jonez:chisel",
output = node,
items = {prev_node},
width = 1,
})
end
prev_node = node
end
unified_inventory.register_craft({
type = "jonez:chisel",
output = first_node,
items = {prev_node},
width = 1,
})
end
end)
end
if minetest.get_modpath("i3") then
i3.register_craft_type("jonez:chisel", {
description = S("Chisel for Marble"),
icon = "jonez_chisel.png",
})
minetest.register_on_mods_loaded(function()
for _, group in pairs(jonez.chisel.group_style_nodes) do
local prev_node
local first_node
for _, node in pairs(group) do
if not first_node then
first_node = node
end
if prev_node then
i3.register_craft({
type = "jonez:chisel",
result = node,
items = {prev_node},
})
end
prev_node = node
end
i3.register_craft({
type = "jonez:chisel",
result = first_node,
items = {prev_node},
})
end
end)
end