added rotation memory for facedir and colorfacedir nodes

master
entuland 2018-06-22 17:55:43 +02:00
parent 2458aa3c68
commit 27e73f0bba
2 changed files with 92 additions and 0 deletions

View File

@ -14,6 +14,15 @@ A thin wrapper around a very useful library to deal with Matrices:
[matrix] https://github.com/entuland/lua-matrix [matrix] https://github.com/entuland/lua-matrix
# Main features
- for `facedir` and `colorfacedir` nodes:
- rotate any node in a predictable manner regardless its current rotation
- **rotation memory**: optionally, place any new node with the same rotation as the last rotated node (see [Chat commands](#chat-commands) section)
- for `wallmounted` and `colorwallmounted` nodes:
- cycle through valid rotations in the same way as the built-in screwdriver would
# Why yet another screwdriver? # Why yet another screwdriver?
The default screwdriver included in minetest_game, as well as any other screwdriver mod I have found, operate differently depending on the node's direction and rotation. This means that any given click on a node may produce different results which you cannot predict at a glance. The default screwdriver included in minetest_game, as well as any other screwdriver mod I have found, operate differently depending on the node's direction and rotation. This means that any given click on a node may produce different results which you cannot predict at a glance.
@ -79,6 +88,13 @@ Rhotator Testing Cube: a Rhotator Screwdriver and any wool block
![Testing cube crafting](/screenshots/testcube-crafting.png) ![Testing cube crafting](/screenshots/testcube-crafting.png)
# Chat commands
- `rhotator` shows available commands
- `rhotator memory` shows current placement memory flag (on or off)
- `rhotator memory on` enable placement memory
- `rhotator memory off` disable placement memory
# Usage feedback # Usage feedback
An HUD message will show usage feedback, in particular it will inform you about nodes that aren't currently supported. An HUD message will show usage feedback, in particular it will inform you about nodes that aren't currently supported.

View File

@ -1,6 +1,7 @@
rhotator = {} rhotator = {}
local mod_path = minetest.get_modpath(minetest.get_current_modname()) local mod_path = minetest.get_modpath(minetest.get_current_modname())
local storage = minetest.get_mod_storage()
-- constants -- constants
@ -28,6 +29,8 @@ local dir_matrices = {}
local huds = {} local huds = {}
local hud_timeout_seconds = 3 local hud_timeout_seconds = 3
local facedir_memory = {}
-- ============================================================ -- ============================================================
-- init -- init
@ -277,6 +280,12 @@ function handlers.facedir(node, player, pointed_thing, click)
local remaining = node.param2 - rotation local remaining = node.param2 - rotation
local rotate_90deg_clockwise = 1 local rotate_90deg_clockwise = 1
local rotation_result, message = rotate_main(rotation, player, pointed_thing, click, rotate_90deg_clockwise) local rotation_result, message = rotate_main(rotation, player, pointed_thing, click, rotate_90deg_clockwise)
local playername = player:get_player_name()
if storage:get_int("memory_" .. playername) == 1 then
facedir_memory[playername] = rotation_result
end
return rotation_result + remaining, message return rotation_result + remaining, message
end end
@ -323,9 +332,72 @@ end
handlers.colorwallmounted = handlers.wallmounted handlers.colorwallmounted = handlers.wallmounted
-- ============================================================
-- rotation memory
local function command_memory(playername, params)
local player = minetest.get_player_by_name(playername)
local key = "memory_" .. playername
local memory = storage:get_int(key) == 1
if params[2] == "on" then
storage:set_int(key, 1)
memory = true
elseif params[2] == "off" then
storage:set_int(key, 0)
memory = false
elseif params[2] then
rhotator.command(playername, "")
return
end
minetest.chat_send_player(playername, "[rhotator] Memory is " .. (memory and "on" or "off"))
end
local function rhotator_on_placenode(pos, newnode, placer, oldnode, itemstack, pointed_thing)
if not placer or not placer.get_player_name then return end
local playername = placer:get_player_name()
local key = "memory_" .. playername
local memory = storage:get_int(key) == 1
if not memory then return end
local new_rotation = facedir_memory[playername]
if not new_rotation then return end
local nodedef = minetest.registered_nodes[newnode.name]
if not nodedef then return end
local paramtype2 = nodedef.paramtype2
if paramtype2 ~= "facedir" and paramtype2 ~= "colorfacedir" then return end
local old_rotation = newnode.param2 % 32 -- get first 5 bits
local remaining = newnode.param2 - old_rotation
newnode.param2 = new_rotation + remaining
minetest.swap_node(pos, newnode)
minetest.check_for_falling(pos)
notify(placer, "Placed node according to previous rotation")
end
-- ============================================================ -- ============================================================
-- interaction -- interaction
function rhotator.command(playername, param)
if param == "" then
minetest.chat_send_player(playername, "[rhotator] Usage: rhotator memory [on|off]")
return
end
local params = param:split(" ")
if params[1] == "memory" then
command_memory(playername, params)
return
end
minetest.chat_send_player(playername, "[rhotator] unsupported param: " .. param)
end
local function interact(player, pointed_thing, click) local function interact(player, pointed_thing, click)
if pointed_thing.type ~= "node" then if pointed_thing.type ~= "node" then
return return
@ -422,3 +494,7 @@ minetest.register_craft({
{"rhotator:screwdriver"}, {"rhotator:screwdriver"},
} }
}) })
minetest.register_on_placenode(rhotator_on_placenode)
minetest.register_chatcommand("rhotator", {func = rhotator.command})