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
# 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?
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)
# 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
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 = {}
local mod_path = minetest.get_modpath(minetest.get_current_modname())
local storage = minetest.get_mod_storage()
-- constants
@ -28,6 +29,8 @@ local dir_matrices = {}
local huds = {}
local hud_timeout_seconds = 3
local facedir_memory = {}
-- ============================================================
-- init
@ -277,6 +280,12 @@ function handlers.facedir(node, player, pointed_thing, click)
local remaining = node.param2 - rotation
local rotate_90deg_clockwise = 1
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
end
@ -323,9 +332,72 @@ end
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
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)
if pointed_thing.type ~= "node" then
return
@ -422,3 +494,7 @@ minetest.register_craft({
{"rhotator:screwdriver"},
}
})
minetest.register_on_placenode(rhotator_on_placenode)
minetest.register_chatcommand("rhotator", {func = rhotator.command})