Sonic Screwdriver: Support every paramtype2 (#662)

This commit is contained in:
The4codeblocks 2025-05-14 12:52:22 -05:00 committed by GitHub
parent 0ff7cb769b
commit 85e342c08c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -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