Automatically display node meta when use probtool

This commit is contained in:
Wuzzy 2017-09-02 22:33:17 +02:00
parent f8e529bc27
commit 2ef8b69ea1
1 changed files with 74 additions and 15 deletions

View File

@ -30,6 +30,7 @@ local contexts = {}
local form_data = {} local form_data = {}
local tabs = {} local tabs = {}
local forms = {} local forms = {}
local displayed_waypoints = {}
-- [function] Add form -- [function] Add form
function advschem.add_form(name, def) function advschem.add_form(name, def)
@ -672,29 +673,80 @@ function advschem.unmark(pos)
end end
end end
---
--- Mark node probability values near player
---
-- Show node probability for player in HUD -- Show probability and force_place status of a particular position for player in HUD.
function advschem.mark_node_prob(player, pos, prob, force_place) -- Probability is shown as a number followed by “[F]” if the node is force-placed.
local wpstring = "" -- The distance to the node is also displayed below that. This can't be avoided and is
if prob then -- and artifact of the waypoint HUD element. TODO: Hide displayed distance.
wpstring = wpstring .. prob function advschem.display_node_prob(player, pos, prob, force_place)
local wpstring
if prob and force_place == true then
wpstring = string.format("%d [F]", prob)
elseif prob then
wpstring = prob
elseif force_place == true then
wpstring = "[F]"
end end
if wpstring == "" then if wpstring then
wpstring = wpstring .. " "
end
if force_place == true then
wpstring = wpstring .. "[F]"
end
if wpstring ~= "" then
return player:hud_add({ return player:hud_add({
hud_elem_type = "waypoint", hud_elem_type = "waypoint",
name = wpstring, name = wpstring,
text = "m", -- For the distance artifact
number = text_color_number, number = text_color_number,
world_pos = pointed_thing.under, world_pos = pos,
}) })
end end
end end
-- Display the node probabilities and force_place status of the nodes near the player.
function advschem.display_node_probs_around_player(player)
local playername = player:get_player_name()
local pos = vector.round(player:getpos())
local dist = 5
for x=pos.x-dist, pos.x+dist do
for y=pos.y-dist, pos.y+dist do
for z=pos.z-dist, pos.z+dist do
local checkpos = {x=x, y=y, z=z}
local nodehash = minetest.hash_node_position(checkpos)
-- If node is already displayed, remove it so it can re replaced later
if displayed_waypoints[playername][nodehash] then
player:hud_remove(displayed_waypoints[playername][nodehash])
displayed_waypoints[playername][nodehash] = nil
end
local prob, force_place
local meta = minetest.get_meta(checkpos)
prob = tonumber(meta:get_string("advschem_prob"))
force_place = meta:get_string("advschem_force_place") == "true"
local hud_id = advschem.display_node_prob(player, checkpos, prob, force_place)
if hud_id then
displayed_waypoints[playername][nodehash] = hud_id
end
end
end
end
end
-- Remove all active displayed node statuses.
function advschem.clear_displayed_node_probs(player)
for nodehash, hud_id in pairs(displayed_waypoints[player:get_player_name()]) do
player:hud_remove(hud_id)
displayed_waypoints[player:get_player_name()][nodehash] = nil
end
end
minetest.register_on_joinplayer(function(player)
displayed_waypoints[player:get_player_name()] = {}
end)
minetest.register_on_leaveplayer(function(player)
displayed_waypoints[player:get_player_name()] = nil
end)
--- ---
--- Registrations --- Registrations
--- ---
@ -784,11 +836,15 @@ minetest.register_tool("advschem:probtool", {
"Note that this tool only has an effect on the nodes with regards to schematics. The node behaviour itself is not changed at all.", "Note that this tool only has an effect on the nodes with regards to schematics. The node behaviour itself is not changed at all.",
wield_image = "advschem_probtool.png", wield_image = "advschem_probtool.png",
inventory_image = "advschem_probtool.png", inventory_image = "advschem_probtool.png",
on_use = function(itemstack, placer, pointed_thing) on_use = function(itemstack, user, pointed_thing)
-- Open dialog to change the probability to apply to nodes. -- Open dialog to change the probability to apply to nodes.
advschem.show_formspec(placer:getpos(), placer, "probtool", true) advschem.show_formspec(user:getpos(), user, "probtool", true)
end,
on_secondary_use = function(itemstack, user, pointed_thing)
advschem.clear_displayed_node_probs(user)
end, end,
on_place = function(itemstack, placer, pointed_thing) on_place = function(itemstack, placer, pointed_thing)
-- This sets the node probability of pointed node to the -- This sets the node probability of pointed node to the
-- currently used probability stored in the tool. -- currently used probability stored in the tool.
@ -814,6 +870,9 @@ minetest.register_tool("advschem:probtool", {
nmeta:set_string("advschem_force_place", nil) nmeta:set_string("advschem_force_place", nil)
end end
-- Enable node probablity display
advschem.display_node_probs_around_player(placer)
return itemstack return itemstack
end, end,
}) })