2022-01-05 14:48:36 +03:00
|
|
|
--[[
|
|
|
|
|
|
|
|
TechAge
|
|
|
|
=======
|
|
|
|
|
|
|
|
Copyright (C) 2020-2022 Joachim Stolberg
|
|
|
|
|
|
|
|
AGPL v3
|
|
|
|
See LICENSE.txt for more information
|
|
|
|
|
|
|
|
Screwdriver
|
|
|
|
|
|
|
|
]]--
|
|
|
|
if minetest.global_exists("screwdriver") then
|
|
|
|
|
|
|
|
local S = techage.S
|
|
|
|
local M = minetest.get_meta
|
|
|
|
|
|
|
|
local USES = 2000
|
|
|
|
|
|
|
|
local function base_checks(user, pointed_thing)
|
|
|
|
if pointed_thing.type ~= "node" then
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
|
|
|
|
if not user then
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
|
|
|
|
local pos = pointed_thing.under
|
|
|
|
local player_name = user:get_player_name()
|
|
|
|
|
|
|
|
if minetest.is_protected(pos, player_name) then
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
|
|
|
|
local node = minetest.get_node(pos)
|
|
|
|
local ndef = minetest.registered_nodes[node.name]
|
|
|
|
|
|
|
|
if not ndef then
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
|
2022-01-05 23:41:30 +03:00
|
|
|
if ndef.on_rotate == screwdriver.disallow and not ndef.ta_rotate_node then
|
2022-01-05 14:48:36 +03:00
|
|
|
return false
|
|
|
|
end
|
|
|
|
|
|
|
|
local yaw = user:get_look_horizontal()
|
|
|
|
local dir = minetest.yaw_to_dir(yaw)
|
|
|
|
local facedir = minetest.dir_to_facedir(dir)
|
|
|
|
|
|
|
|
return true, pos, player_name, facedir, node, ndef
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
local function store_node_param2(user, node)
|
2022-01-06 12:13:18 +03:00
|
|
|
user:get_meta():set_int("techage_screwdriver_param2", node.param2)
|
2022-01-05 14:48:36 +03:00
|
|
|
minetest.chat_send_player(user:get_player_name(), S("Block alignment stored!"))
|
|
|
|
end
|
|
|
|
|
2022-01-05 23:41:30 +03:00
|
|
|
local function turn_node_param2(pos, node, ndef, user)
|
2022-01-06 12:13:18 +03:00
|
|
|
local param2 = user:get_meta():get_int("techage_screwdriver_param2") or 0
|
2022-01-05 23:41:30 +03:00
|
|
|
if ndef.ta_rotate_node then
|
|
|
|
ndef.ta_rotate_node(pos, node, param2)
|
|
|
|
else
|
|
|
|
minetest.swap_node(pos, {name = node.name, param2 = param2})
|
|
|
|
minetest.check_for_falling(pos)
|
|
|
|
end
|
2022-01-05 14:48:36 +03:00
|
|
|
end
|
|
|
|
|
2022-01-05 23:41:30 +03:00
|
|
|
local function turn_left(pos, node, ndef)
|
2022-01-05 14:48:36 +03:00
|
|
|
local param2 = techage.param2_turn_left(node.param2)
|
2022-01-05 23:41:30 +03:00
|
|
|
if ndef.ta_rotate_node then
|
|
|
|
ndef.ta_rotate_node(pos, node, param2)
|
|
|
|
else
|
|
|
|
minetest.swap_node(pos, {name = node.name, param2 = param2})
|
|
|
|
minetest.check_for_falling(pos)
|
|
|
|
end
|
2022-01-05 14:48:36 +03:00
|
|
|
end
|
|
|
|
|
2022-01-05 23:41:30 +03:00
|
|
|
local function turn_up(pos, node, ndef, facedir)
|
2022-01-05 14:48:36 +03:00
|
|
|
local param2 = techage.param2_turn_up(facedir, node.param2)
|
2022-01-05 23:41:30 +03:00
|
|
|
if ndef.ta_rotate_node then
|
|
|
|
ndef.ta_rotate_node(pos, node, param2)
|
|
|
|
else
|
|
|
|
minetest.swap_node(pos, {name = node.name, param2 = param2})
|
|
|
|
minetest.check_for_falling(pos)
|
|
|
|
end
|
2022-01-05 14:48:36 +03:00
|
|
|
end
|
|
|
|
|
|
|
|
-- on_use == on_left_click == turn left
|
|
|
|
local function on_use(itemstack, user, pointed_thing)
|
|
|
|
local res, pos, player_name, facedir, node, ndef = base_checks(user, pointed_thing)
|
|
|
|
if res then
|
|
|
|
if ndef.paramtype2 == "facedir" then
|
|
|
|
if user:get_player_control().sneak then
|
|
|
|
store_node_param2(user, node)
|
|
|
|
else
|
2022-01-05 23:41:30 +03:00
|
|
|
turn_left(pos, node, ndef)
|
2022-01-05 14:48:36 +03:00
|
|
|
end
|
|
|
|
else
|
|
|
|
return screwdriver.handler(itemstack, user, pointed_thing, screwdriver.ROTATE_FACE, USES)
|
|
|
|
end
|
|
|
|
|
|
|
|
if not minetest.is_creative_enabled(player_name) then
|
|
|
|
itemstack:add_wear(65535 / (USES - 1))
|
|
|
|
end
|
|
|
|
end
|
|
|
|
return itemstack
|
|
|
|
end
|
|
|
|
|
|
|
|
-- on_place == on_right_click == turn up
|
|
|
|
local function on_place(itemstack, user, pointed_thing)
|
|
|
|
local res, pos, player_name, facedir, node, ndef = base_checks(user, pointed_thing)
|
|
|
|
if res then
|
|
|
|
if ndef.paramtype2 == "facedir" then
|
|
|
|
if ndef.on_rotate ~= screwdriver.rotate_simple then
|
|
|
|
if user:get_player_control().sneak then
|
2022-01-05 23:41:30 +03:00
|
|
|
turn_node_param2(pos, node, ndef, user)
|
2022-01-05 14:48:36 +03:00
|
|
|
else
|
2022-01-05 23:41:30 +03:00
|
|
|
turn_up(pos, node, ndef, facedir)
|
2022-01-05 14:48:36 +03:00
|
|
|
end
|
|
|
|
else
|
|
|
|
return itemstack
|
|
|
|
end
|
|
|
|
else
|
|
|
|
return screwdriver.handler(itemstack, user, pointed_thing, screwdriver.ROTATE_AXIS, USES)
|
|
|
|
end
|
|
|
|
|
|
|
|
if not minetest.is_creative_enabled(player_name) then
|
|
|
|
itemstack:add_wear(65535 / (USES - 1))
|
|
|
|
end
|
|
|
|
end
|
|
|
|
return itemstack
|
|
|
|
end
|
|
|
|
|
|
|
|
minetest.register_tool("techage:screwdriver", {
|
|
|
|
description = S("Techage Screwdriver\n(See: TA3 > Tools)"),
|
|
|
|
inventory_image = "techage_screwdriver.png",
|
|
|
|
on_use = on_use,
|
|
|
|
on_place = on_place,
|
|
|
|
node_placement_prediction = "",
|
|
|
|
stack_max = 1,
|
|
|
|
})
|
|
|
|
|
|
|
|
minetest.register_craft({
|
|
|
|
output = "techage:screwdriver",
|
|
|
|
recipe = {
|
|
|
|
{"", "default:diamond", ""},
|
2022-01-05 15:43:22 +03:00
|
|
|
{"", "basic_materials:steel_bar", ""},
|
|
|
|
{"", "techage:baborium_ingot", ""},
|
2022-01-05 14:48:36 +03:00
|
|
|
},
|
|
|
|
})
|
|
|
|
|
|
|
|
end
|