mirror of
https://github.com/minetest-mods/technic.git
synced 2025-05-24 20:00:32 +02:00
Sonic Screwdriver: Support every paramtype2 (#662)
This commit is contained in:
parent
0ff7cb769b
commit
85e342c08c
@ -8,14 +8,6 @@ technic.register_power_tool("technic:sonic_screwdriver", sonic_screwdriver_max_c
|
|||||||
local ROTATE_FACE = 1
|
local ROTATE_FACE = 1
|
||||||
local ROTATE_AXIS = 2
|
local ROTATE_AXIS = 2
|
||||||
|
|
||||||
local function nextrange(x, max)
|
|
||||||
x = x + 1
|
|
||||||
if x > max then
|
|
||||||
x = 0
|
|
||||||
end
|
|
||||||
return x
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Handles rotation
|
-- Handles rotation
|
||||||
local function screwdriver_handler(itemstack, user, pointed_thing, mode)
|
local function screwdriver_handler(itemstack, user, pointed_thing, mode)
|
||||||
if pointed_thing.type ~= "node" then
|
if pointed_thing.type ~= "node" then
|
||||||
@ -31,16 +23,80 @@ local function screwdriver_handler(itemstack, user, pointed_thing, mode)
|
|||||||
|
|
||||||
local node = minetest.get_node(pos)
|
local node = minetest.get_node(pos)
|
||||||
local ndef = minetest.registered_nodes[node.name]
|
local ndef = minetest.registered_nodes[node.name]
|
||||||
if not ndef or not ndef.paramtype2 == "facedir" or
|
|
||||||
(ndef.drawtype == "nodebox" and
|
if not ndef then return end
|
||||||
not ndef.node_box.type == "fixed") or
|
|
||||||
node.param2 == nil then
|
local paramtype2 = ndef.paramtype2
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
-- contrary to the default screwdriver, do not check for can_dig, to allow rotating machines with CLU's in them
|
-- contrary to the default screwdriver, do not check for can_dig, to allow rotating machines with CLU's in them
|
||||||
-- this is consistent with the previous sonic screwdriver
|
-- this is consistent with the previous sonic screwdriver
|
||||||
|
|
||||||
|
-- Set param2
|
||||||
|
local new_param2
|
||||||
|
local param2 = node.param2
|
||||||
|
|
||||||
|
local dirs_per_axis = 4
|
||||||
|
|
||||||
|
local dir_components = {
|
||||||
|
-- 2^5, 5 bits
|
||||||
|
facedir = 32,
|
||||||
|
colorfacedir = 32,
|
||||||
|
colordegrotate = 32,
|
||||||
|
|
||||||
|
-- 2^2, 2 bits
|
||||||
|
["4dir"] = 4, -- lua doesn't like it when vars start with a digit
|
||||||
|
color4dir = 4,
|
||||||
|
}
|
||||||
|
|
||||||
|
local dir_component = dir_components[paramtype2]
|
||||||
|
|
||||||
|
local floor = math.floor
|
||||||
|
-- non-direction data is preserved whether it be color or otherwise
|
||||||
|
if (paramtype2 == "facedir") or (paramtype2 == "colorfacedir") then
|
||||||
|
local aux = floor(param2 / dir_component)
|
||||||
|
local dir = param2 % dir_component
|
||||||
|
|
||||||
|
if mode == ROTATE_FACE then
|
||||||
|
dir = (floor(param2 / dirs_per_axis)) * dirs_per_axis + ((dir + 1) % dirs_per_axis)
|
||||||
|
elseif mode == ROTATE_AXIS then
|
||||||
|
dir = ((floor(param2 / dirs_per_axis) + 1) * dirs_per_axis) % 24
|
||||||
|
end
|
||||||
|
|
||||||
|
new_param2 = aux * dir_component + dir
|
||||||
|
elseif (paramtype2 == "4dir") or (paramtype2 == "color4dir") then
|
||||||
|
local aux = floor(param2 / dir_component)
|
||||||
|
local dir = param2 % dir_component
|
||||||
|
|
||||||
|
if mode == ROTATE_FACE then
|
||||||
|
dir = (dir + 1) % dirs_per_axis
|
||||||
|
elseif mode == ROTATE_AXIS then
|
||||||
|
dir = 0
|
||||||
|
end
|
||||||
|
|
||||||
|
new_param2 = aux * dir_component + dir
|
||||||
|
elseif (paramtype2 == "degrotate") then
|
||||||
|
if mode == ROTATE_FACE then
|
||||||
|
new_param2 = param2 + 1
|
||||||
|
elseif mode == ROTATE_AXIS then
|
||||||
|
new_param2 = param2 + 20
|
||||||
|
end
|
||||||
|
new_param2 = new_param2 % 240
|
||||||
|
elseif (paramtype2 == "colordegrotate") then
|
||||||
|
local aux = floor(param2 / dir_component)
|
||||||
|
local rotation = param2 % dir_component
|
||||||
|
|
||||||
|
if mode == ROTATE_FACE then
|
||||||
|
rotation = rotation + 1
|
||||||
|
elseif mode == ROTATE_AXIS then
|
||||||
|
rotation = rotation + 4
|
||||||
|
end
|
||||||
|
rotation = rotation % 24
|
||||||
|
|
||||||
|
new_param2 = aux * dir_component + rotation
|
||||||
|
else
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
local meta = technic.get_stack_meta(itemstack)
|
local meta = technic.get_stack_meta(itemstack)
|
||||||
local charge = meta:get_int("technic:charge")
|
local charge = meta:get_int("technic:charge")
|
||||||
if charge < 100 then
|
if charge < 100 then
|
||||||
@ -49,19 +105,7 @@ local function screwdriver_handler(itemstack, user, pointed_thing, mode)
|
|||||||
|
|
||||||
minetest.sound_play("technic_sonic_screwdriver", {pos = pos, gain = 0.3, max_hear_distance = 10})
|
minetest.sound_play("technic_sonic_screwdriver", {pos = pos, gain = 0.3, max_hear_distance = 10})
|
||||||
|
|
||||||
-- Set param2
|
node.param2 = new_param2
|
||||||
local rotationPart = node.param2 % 32 -- get first 4 bits
|
|
||||||
local preservePart = node.param2 - rotationPart
|
|
||||||
|
|
||||||
local axisdir = math.floor(rotationPart / 4)
|
|
||||||
local rotation = rotationPart - axisdir * 4
|
|
||||||
if mode == ROTATE_FACE then
|
|
||||||
rotationPart = axisdir * 4 + nextrange(rotation, 3)
|
|
||||||
elseif mode == ROTATE_AXIS then
|
|
||||||
rotationPart = nextrange(axisdir, 5) * 4
|
|
||||||
end
|
|
||||||
|
|
||||||
node.param2 = preservePart + rotationPart
|
|
||||||
minetest.swap_node(pos, node)
|
minetest.swap_node(pos, node)
|
||||||
|
|
||||||
if not technic.creative_mode then
|
if not technic.creative_mode then
|
||||||
|
Loading…
x
Reference in New Issue
Block a user