Compare commits

...

2 Commits

  1. 2
      README.md
  2. 16
      init.lua

@ -11,7 +11,7 @@ Rotating a node can be done in three ways:
- Click near an edge, and the node will be rotated 90° away from you.
- Click near a corner, and the node will rotate 120° around it.
Sneaking inverts the direction of the rotation.
Sneaking while empty-handed inverts the direction of the rotation.
At this time, nodes that can be rotated are hardcoded into the mod, since
their valid orientations can't be determined just by their node definition.

@ -12,7 +12,7 @@ local registry = include("registry")
-- TODO: Add particles to preview rotation?
-- Distance at which we want to rotate by "pushing" on an edge.
local EDGE_DISTANCE = 1.5 / 16 -- texels (at 16² texture resolution)
local EDGE_DISTANCE = 2.5 / 16 -- texels (at 16² texture resolution)
-- Contains a per-player state that holds information, created by a raycast
-- done in `playerstep`, about the node this player might rotate. This is used
@ -55,15 +55,19 @@ local function calculate_rotating_state(player, data)
local state = {}
local pointed_thing = data.raycast()
if (not pointed_thing) or pointed_thing.type ~= "node" then return end
if (not pointed_thing) or pointed_thing.type ~= "node" then return nil end
state.pos = pointed_thing.under
state.node = minetest.get_node(state.pos)
if not registry.is_rotatable(state.node) then return end
if not registry.is_rotatable(state.node) then return nil end
if vector.equals(pointed_thing.above, pointed_thing.under) then return end
if vector.equals(pointed_thing.above, pointed_thing.under) then return nil end
state.face = pointed_thing.above - pointed_thing.under
-- When player is sneaking, must be empty-handed for rotating to work.
local is_sneaking = player:get_player_control().sneak
if is_sneaking and (not player:get_wielded_item():is_empty()) then return nil end
local degrees = 90
local r = utility.rotation_vector_from_lookat(state.node, pointed_thing, EDGE_DISTANCE)
state.axis = r
@ -75,8 +79,8 @@ local function calculate_rotating_state(player, data)
end
-- Sneaking causes the direction of the rotation to be inverted.
state.invert = player:get_player_control().sneak
if state.invert then degrees = -degrees end
if is_sneaking then degrees = -degrees end
state.invert = is_sneaking
state.facedir = rotate.rotate_facedir(state.node.param2, state.axis, -degrees)
state.facedir = registry.fix_rotatable_facedir(state.node, state.facedir)

Loading…
Cancel
Save