-
Notifications
You must be signed in to change notification settings - Fork 155
support every paramtype2 #662
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
fae5db9
328a5f3
56d818a
790ccf6
2268437
5f8bb19
150e738
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -8,14 +8,6 @@ technic.register_power_tool("technic:sonic_screwdriver", sonic_screwdriver_max_c | |
local ROTATE_FACE = 1 | ||
local ROTATE_AXIS = 2 | ||
|
||
local function nextrange(x, max) | ||
x = x + 1 | ||
if x > max then | ||
x = 0 | ||
end | ||
return x | ||
end | ||
|
||
-- Handles rotation | ||
local function screwdriver_handler(itemstack, user, pointed_thing, mode) | ||
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 ndef = minetest.registered_nodes[node.name] | ||
if not ndef or not ndef.paramtype2 == "facedir" or | ||
(ndef.drawtype == "nodebox" and | ||
not ndef.node_box.type == "fixed") or | ||
node.param2 == nil then | ||
return | ||
end | ||
|
||
if not ndef then return end | ||
|
||
local paramtype2 = ndef.paramtype2 | ||
|
||
-- 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 | ||
|
||
-- 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 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Idea: You could move this code up such that a final Admittedly this code does not look great (magic numbers and many different cases) but I don't see much that could be done to improve it. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. should be done |
||
|
||
local meta = technic.get_stack_meta(itemstack) | ||
local charge = meta:get_int("technic:charge") | ||
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}) | ||
|
||
-- Set 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) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. luacheck is yet unhappy -- luacheck: push ignore 211
local function foobar()
end
-- luacheck: pop There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
done: 150e738 |
||
elseif mode == ROTATE_AXIS then | ||
rotationPart = nextrange(axisdir, 5) * 4 | ||
end | ||
|
||
node.param2 = preservePart + rotationPart | ||
node.param2 = new_param2 | ||
minetest.swap_node(pos, node) | ||
|
||
if not technic.creative_mode then | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
When I use
paramtype2 = "degrotate",
in the nodedef of"default:aspen_sapling"
(nodes.lua), the rotation oddly jumps in this case. There is no such anomaly withparamtype2 = "degrotate",
.Is it because you're using modulo 32 in L94, but modulo 24 in L101?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
describe the jump
(%32 is bitwise extraction, %24 is rotation modulo)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sorry. I meant that
colordegorate
jumps oddly whereasdegrotate
works well.It turns out this code is not flawed but my perception. It simply turned too far to notice at a stationary viewing position. When following the node around in its rotation, there is no such "glitch" or "jump".
Resolved.