From 54c85a8ee01456188ef3b639dae5859694cc8184 Mon Sep 17 00:00:00 2001 From: Jack Manning Date: Wed, 25 Nov 2020 21:57:51 -0500 Subject: [PATCH] Add hud support for replacer and inspector instead of spamming chat and switch replace to shift+RMB to allow repeated replacement by holding keys --- hud.lua | 37 +++++++++++++++++++++++++++++++++ init.lua | 59 ++++++++++++++++++++++++++++------------------------- inspect.lua | 6 +++--- 3 files changed, 71 insertions(+), 31 deletions(-) create mode 100644 hud.lua diff --git a/hud.lua b/hud.lua new file mode 100644 index 0000000..378dd9b --- /dev/null +++ b/hud.lua @@ -0,0 +1,37 @@ +-- HUD support added by lumberJack + +-- store Hud ids by playername +replacer.hud_ids = {}; + +function replacer.set_hud(playername, message) + local player = minetest.get_player_by_name(playername) + if replacer.hud_ids[playername] ~= nil then + local id = replacer.hud_ids[playername] + player:hud_remove(id) + end + + local id = player:hud_add({ + hud_elem_type = "text", + name = "Replacer", + number = 0xFFFFFF, + position = {x=0.7, y=1}, + offset = {x=0, y=-8}, + text = message, + scale = {x=200, y=60}, + alignment = {x=1, y=-1}, + + }); + + replacer.hud_ids[playername] = id; + + minetest.after(12, function() + if replacer.hud_ids[playername] == id then + player:hud_remove(id) + end + end); +end + +minetest.register_on_leaveplayer(function(player, timed_out) + local name = player:get_player_name() + replacer.hud_ids[name] = nil +end) \ No newline at end of file diff --git a/init.lua b/init.lua index e1f41b9..b92ce37 100644 --- a/init.lua +++ b/init.lua @@ -57,8 +57,11 @@ replacer.blacklist[ "protector:protect2"] = true; -- adds a tool for inspecting nodes and entities dofile(minetest.get_modpath("replacer").."/inspect.lua"); +-- add support for HUD messenges +dofile(minetest.get_modpath("replacer").."/hud.lua"); -minetest.register_tool( "replacer:replacer", + +minetest.register_tool( "replacer:replacer", { description = "Node replacement tool", groups = {}, @@ -96,35 +99,35 @@ minetest.register_tool( "replacer:replacer", -- just place the stored node if now new one is to be selected if( not( keys["sneak"] )) then - return replacer.replace( itemstack, placer, pointed_thing, 0 ); end - - - if( pointed_thing.type ~= "node" ) then - minetest.chat_send_player( name, " Error: No node selected."); - return nil; + return replacer.replace( itemstack, placer, pointed_thing, 0 ); + else + return replacer.replace( itemstack, placer, pointed_thing, above ); end - - local pos = minetest.get_pointed_thing_position( pointed_thing, under ); - local node = minetest.get_node_or_nil( pos ); - - --minetest.chat_send_player( name, " Target node: "..minetest.serialize( node ).." at pos "..minetest.serialize( pos ).."."); - local metadata = "default:dirt 0 0"; - if( node ~= nil and node.name ) then - metadata = node.name..' '..node.param1..' '..node.param2; - end - itemstack:set_metadata( metadata ); - - minetest.chat_send_player( name, "Node replacement tool set to: '"..metadata.."'."); - - return itemstack; -- nothing consumed but data changed end, -- on_drop = func(itemstack, dropper, pos), on_use = function(itemstack, user, pointed_thing) + name = user:get_player_name(); + if( pointed_thing.type ~= "node" ) then + replacer.set_hud( name, " Error: No node selected."); + return nil; + end - return replacer.replace( itemstack, user, pointed_thing, above ); + local pos = minetest.get_pointed_thing_position( pointed_thing, under ); + local node = minetest.get_node_or_nil( pos ); + + --minetest.chat_send_player( name, " Target node: "..minetest.serialize( node ).." at pos "..minetest.serialize( pos ).."."); + local metadata = "default:dirt 0 0"; + if( node ~= nil and node.name ) then + metadata = node.name..' '..node.param1..' '..node.param2; + end + itemstack:set_metadata( metadata ); + + replacer.set_hud( name, "Node replacement tool set to: '"..metadata.."'."); + + return itemstack; -- nothing consumed but data changed end, }) @@ -138,7 +141,7 @@ replacer.replace = function( itemstack, user, pointed_thing, mode ) --minetest.chat_send_player( name, "You USED this on "..minetest.serialize( pointed_thing ).."."); if( pointed_thing.type ~= "node" ) then - minetest.chat_send_player( name, " Error: No node."); + replacer.set_hud( name, " Error: No node."); return nil; end @@ -149,7 +152,7 @@ replacer.replace = function( itemstack, user, pointed_thing, mode ) if( node == nil ) then - minetest.chat_send_player( name, "Error: Target node not yet loaded. Please wait a moment for the server to catch up."); + replacer.set_hud( name, "Error: Target node not yet loaded. Please wait a moment for the server to catch up."); return nil; end @@ -176,13 +179,13 @@ replacer.replace = function( itemstack, user, pointed_thing, mode ) end if( node.name and node.name ~= "" and replacer.blacklist[ node.name ]) then - minetest.chat_send_player( name, "Replacing blocks of the type '"..( node.name or "?" ).. + replacer.set_hud( name, "Replacing blocks of the type '"..( node.name or "?" ).. "' is not allowed on this server. Replacement failed."); return nil; end if( replacer.blacklist[ daten[1] ]) then - minetest.chat_send_player( name, "Placing blocks of the type '"..( daten[1] or "?" ).. + replacer.set_hud( name, "Placing blocks of the type '"..( daten[1] or "?" ).. "' with the replacer is not allowed on this server. Replacement failed."); return nil; end @@ -214,7 +217,7 @@ replacer.replace = function( itemstack, user, pointed_thing, mode ) if( not( user:get_inventory():contains_item("main", daten[1]))) then - minetest.chat_send_player( name, "You have no further '"..( daten[1] or "?" ).."'. Replacement failed."); + replacer.set_hud( name, "You have no further '"..( daten[1] or "?" ).."'. Replacement failed."); return nil; end @@ -236,7 +239,7 @@ replacer.replace = function( itemstack, user, pointed_thing, mode ) if( not( digged_node ) or digged_node.name == node.name ) then - minetest.chat_send_player( name, "Replacing '"..( node.name or "air" ).."' with '"..( item[ "metadata"] or "?" ).."' failed. Unable to remove old node."); + replacer.set_hud( name, "Replacing '"..( node.name or "air" ).."' with '"..( item[ "metadata"] or "?" ).."' failed. Unable to remove old node."); return nil; end diff --git a/inspect.lua b/inspect.lua index 6c038a3..893fc99 100644 --- a/inspect.lua +++ b/inspect.lua @@ -93,10 +93,10 @@ replacer.inspect = function( itemstack, user, pointed_thing, mode, show_receipe end text = text..' at '..minetest.pos_to_string( ref:get_pos() ); - minetest.chat_send_player( name, text ); + replacer.set_hud( name, text ); return nil; elseif( pointed_thing.type ~= 'node' ) then - minetest.chat_send_player( name, 'Sorry. This is an unkown something of type \"'..tostring( pointed_thing.type )..'\". No information available.'); + replacer.set_hud( name, 'Sorry. This is an unkown something of type \"'..tostring( pointed_thing.type )..'\". No information available.'); return nil; end @@ -104,7 +104,7 @@ replacer.inspect = function( itemstack, user, pointed_thing, mode, show_receipe local node = minetest.get_node_or_nil( pos ); if( node == nil ) then - minetest.chat_send_player( name, "Error: Target node not yet loaded. Please wait a moment for the server to catch up."); + replacer.set_hud( name, "Error: Target node not yet loaded. Please wait a moment for the server to catch up."); return nil; end