1
-
2
- local mode_text = {
3
- {" Change rotation, Don't change axisdir." },
4
- {" Keep choosen face in front then rotate it." },
5
- {" Change axis dir, Reset rotation." },
6
- {" Bring top in front then rotate it." },
7
- }
8
-
9
- local opposite_faces = {
10
- [0 ] = 5 ,
11
- [1 ] = 2 ,
12
- [2 ] = 1 ,
13
- [3 ] = 4 ,
14
- [4 ] = 3 ,
15
- [5 ] = 0 ,
16
- }
17
-
18
- local function screwdriver_setmode (user ,itemstack )
19
- local player_name = user :get_player_name ()
20
- local item = itemstack :to_table ()
21
- local mode = tonumber (itemstack :get_metadata ())
22
- if not mode then
23
- minetest .chat_send_player (player_name , " Use while sneaking to change screwdriwer modes." )
24
- mode = 0
25
- end
26
- mode = mode + 1
27
- if mode == 5 then
28
- mode = 1
29
- end
30
- minetest .chat_send_player (player_name , " Screwdriver mode : " .. mode .. " - " .. mode_text [mode ][1 ] )
31
- itemstack :set_name (" screwdriver:screwdriver" .. mode )
32
- itemstack :set_metadata (mode )
33
- return itemstack
34
- end
35
-
36
- local function get_node_face (pointed_thing )
37
- local ax , ay , az = pointed_thing .above .x , pointed_thing .above .y , pointed_thing .above .z
38
- local ux , uy , uz = pointed_thing .under .x , pointed_thing .under .y , pointed_thing .under .z
39
- if ay > uy then return 0 -- Top
40
- elseif az > uz then return 1 -- Z+ side
41
- elseif az < uz then return 2 -- Z- side
42
- elseif ax > ux then return 3 -- X+ side
43
- elseif ax < ux then return 4 -- X- side
44
- elseif ay < uy then return 5 -- Bottom
45
- else
46
- error (" pointed_thing.above and under are the same!" )
47
- end
48
- end
49
-
50
1
local function nextrange (x , max )
51
2
x = x + 1
52
3
if x > max then
@@ -55,21 +6,21 @@ local function nextrange(x, max)
55
6
return x
56
7
end
57
8
58
- local function screwdriver_handler (itemstack , user , pointed_thing )
9
+ -- Handles rotation
10
+ local function screwdriver_handler (itemstack , user , pointed_thing , mode )
59
11
if pointed_thing .type ~= " node" then
60
12
return
61
13
end
14
+
62
15
local pos = pointed_thing .under
63
16
local keys = user :get_player_control ()
64
17
local player_name = user :get_player_name ()
65
- local mode = tonumber (itemstack :get_metadata ())
66
- if not mode or keys [" sneak" ] == true then
67
- return screwdriver_setmode (user , itemstack )
68
- end
18
+
69
19
if minetest .is_protected (pos , user :get_player_name ()) then
70
20
minetest .record_protection_violation (pos , user :get_player_name ())
71
21
return
72
22
end
23
+
73
24
local node = minetest .get_node (pos )
74
25
local ndef = minetest .registered_nodes [node .name ]
75
26
if not ndef or not ndef .paramtype2 == " facedir" or
@@ -78,47 +29,22 @@ local function screwdriver_handler(itemstack, user, pointed_thing)
78
29
node .param2 == nil then
79
30
return
80
31
end
81
- -- Get ready to set the param2
32
+
33
+ -- Set param2
82
34
local n = node .param2
83
35
local axisdir = math.floor (n / 4 )
84
36
local rotation = n - axisdir * 4
85
37
if mode == 1 then
86
38
n = axisdir * 4 + nextrange (rotation , 3 )
87
- elseif mode == 2 then
88
- -- If you are pointing at the axisdir face or the
89
- -- opposite one then you can just rotate the node.
90
- -- Otherwise change the axisdir, avoiding the facing
91
- -- and opposite axes.
92
- local face = get_node_face (pointed_thing )
93
- if axisdir == face or axisdir == opposite_faces [face ] then
94
- n = axisdir * 4 + nextrange (rotation , 3 )
95
- else
96
- axisdir = nextrange (axisdir , 5 )
97
- -- This is repeated because switching from the face
98
- -- can move to to the opposite and vice-versa
99
- if axisdir == face or axisdir == opposite_faces [face ] then
100
- axisdir = nextrange (axisdir , 5 )
101
- end
102
- if axisdir == face or axisdir == opposite_faces [face ] then
103
- axisdir = nextrange (axisdir , 5 )
104
- end
105
- n = axisdir * 4
106
- end
107
39
elseif mode == 3 then
108
40
n = nextrange (axisdir , 5 ) * 4
109
- elseif mode == 4 then
110
- local face = get_node_face (pointed_thing )
111
- if axisdir == face then
112
- n = axisdir * 4 + nextrange (rotation , 3 )
113
- else
114
- n = face * 4
115
- end
116
41
end
117
- -- print (dump(axisdir..", "..rotation))
42
+
118
43
node .param2 = n
119
44
minetest .swap_node (pos , node )
45
+
120
46
local item_wear = tonumber (itemstack :get_wear ())
121
- item_wear = item_wear + 327
47
+ item_wear = item_wear + 300 -- was 327
122
48
if item_wear > 65535 then
123
49
itemstack :clear ()
124
50
return itemstack
@@ -127,33 +53,30 @@ local function screwdriver_handler(itemstack, user, pointed_thing)
127
53
return itemstack
128
54
end
129
55
130
- minetest .register_craft ({
131
- output = " screwdriver:screwdriver" ,
132
- recipe = {
133
- {" default:steel_ingot" },
134
- {" group:stick" }
135
- }
136
- })
137
-
56
+ -- Screwdriver
138
57
minetest .register_tool (" screwdriver:screwdriver" , {
139
- description = " Screwdriver" ,
58
+ description = " Screwdriver (left-click rotates face, right-click rotates axis) " ,
140
59
inventory_image = " screwdriver.png" ,
141
60
on_use = function (itemstack , user , pointed_thing )
142
- screwdriver_handler (itemstack , user , pointed_thing )
61
+ screwdriver_handler (itemstack , user , pointed_thing , 1 )
62
+ return itemstack
63
+ end ,
64
+ on_place = function (itemstack , user , pointed_thing )
65
+ screwdriver_handler (itemstack , user , pointed_thing , 3 )
143
66
return itemstack
144
67
end ,
145
68
})
146
69
147
- for i = 1 , 4 do
148
- minetest .register_tool (" screwdriver:screwdriver" .. i , {
149
- description = " Screwdriver in Mode " .. i ,
150
- inventory_image = " screwdriver.png^tool_mode" .. i .. " .png" ,
151
- wield_image = " screwdriver.png" ,
152
- groups = {not_in_creative_inventory = 1 },
153
- on_use = function (itemstack , user , pointed_thing )
154
- screwdriver_handler (itemstack , user , pointed_thing )
155
- return itemstack
156
- end ,
157
- })
158
- end
159
70
71
+ minetest .register_craft ({
72
+ output = " screwdriver:screwdriver" ,
73
+ recipe = {
74
+ {" default:steel_ingot" },
75
+ {" group:stick" }
76
+ }
77
+ })
78
+
79
+ minetest .register_alias (" screwdriver:screwdriver1" , " screwdriver:screwdriver" )
80
+ minetest .register_alias (" screwdriver:screwdriver2" , " screwdriver:screwdriver" )
81
+ minetest .register_alias (" screwdriver:screwdriver3" , " screwdriver:screwdriver" )
82
+ minetest .register_alias (" screwdriver:screwdriver4" , " screwdriver:screwdriver" )
0 commit comments