Skip to content

Commit bd24c15

Browse files
tenplus1PilzAdam
authored andcommittedDec 12, 2014
Screwdriver rewrite
1 parent 69614dc commit bd24c15

File tree

6 files changed

+29
-106
lines changed

6 files changed

+29
-106
lines changed
 

Diff for: ‎mods/screwdriver/init.lua

+29-106
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,3 @@
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-
501
local function nextrange(x, max)
512
x = x + 1
523
if x > max then
@@ -55,21 +6,21 @@ local function nextrange(x, max)
556
return x
567
end
578

58-
local function screwdriver_handler(itemstack, user, pointed_thing)
9+
-- Handles rotation
10+
local function screwdriver_handler(itemstack, user, pointed_thing, mode)
5911
if pointed_thing.type ~= "node" then
6012
return
6113
end
14+
6215
local pos = pointed_thing.under
6316
local keys = user:get_player_control()
6417
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+
6919
if minetest.is_protected(pos, user:get_player_name()) then
7020
minetest.record_protection_violation(pos, user:get_player_name())
7121
return
7222
end
23+
7324
local node = minetest.get_node(pos)
7425
local ndef = minetest.registered_nodes[node.name]
7526
if not ndef or not ndef.paramtype2 == "facedir" or
@@ -78,47 +29,22 @@ local function screwdriver_handler(itemstack, user, pointed_thing)
7829
node.param2 == nil then
7930
return
8031
end
81-
-- Get ready to set the param2
32+
33+
-- Set param2
8234
local n = node.param2
8335
local axisdir = math.floor(n / 4)
8436
local rotation = n - axisdir * 4
8537
if mode == 1 then
8638
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
10739
elseif mode == 3 then
10840
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
11641
end
117-
--print (dump(axisdir..", "..rotation))
42+
11843
node.param2 = n
11944
minetest.swap_node(pos, node)
45+
12046
local item_wear = tonumber(itemstack:get_wear())
121-
item_wear = item_wear + 327
47+
item_wear = item_wear + 300 -- was 327
12248
if item_wear > 65535 then
12349
itemstack:clear()
12450
return itemstack
@@ -127,33 +53,30 @@ local function screwdriver_handler(itemstack, user, pointed_thing)
12753
return itemstack
12854
end
12955

130-
minetest.register_craft({
131-
output = "screwdriver:screwdriver",
132-
recipe = {
133-
{"default:steel_ingot"},
134-
{"group:stick"}
135-
}
136-
})
137-
56+
-- Screwdriver
13857
minetest.register_tool("screwdriver:screwdriver", {
139-
description = "Screwdriver",
58+
description = "Screwdriver (left-click rotates face, right-click rotates axis)",
14059
inventory_image = "screwdriver.png",
14160
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)
14366
return itemstack
14467
end,
14568
})
14669

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
15970

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")

Diff for: ‎mods/screwdriver/textures/screwdriver.png

-483 Bytes
Loading

Diff for: ‎mods/screwdriver/textures/tool_mode1.png

-211 Bytes
Binary file not shown.

Diff for: ‎mods/screwdriver/textures/tool_mode2.png

-360 Bytes
Binary file not shown.

Diff for: ‎mods/screwdriver/textures/tool_mode3.png

-367 Bytes
Binary file not shown.

Diff for: ‎mods/screwdriver/textures/tool_mode4.png

-268 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)
Please sign in to comment.