missions/steps/waypoint.lua
SwissalpS 5e58743369 add support for shift-clicking items
From one inventory to the next.
It works with the first field if there are multiple.

Also some other formspec adjustments made.
2020-10-19 07:44:47 +02:00

166 lines
3.4 KiB
Lua

local hud = {} -- playername -> id
missions.register_step({
type = "waypoint",
name = "Waypoint",
create = function()
return {pos=nil, name="", radius=3, visible=1, description=""}
end,
get_status = function(ctx)
return ctx.step.data.description
end,
validate = function(ctx)
local stepdata = ctx.step.data
if stepdata.pos == nil then
return {
success=false,
failed=true,
msg="No position defined"
}
else
return {success=true}
end
end,
allow_inv_stack_put = function(listname, index, stack)
-- allow position wand on pos 1 of main inv
if listname == "main" and index == 1 and stack:get_name() == "missions:wand_position" then
return true
end
return false
end,
edit_formspec = function(ctx)
local stepdata = ctx.step.data
local pos = ctx.pos
local name = ""
if stepdata.pos then
local distance = vector.distance(pos, stepdata.pos)
name = name .. "Position(" .. stepdata.pos.x .. "/" ..
stepdata.pos.y .. "/" .. stepdata.pos.z ..") " ..
"Distance: " .. math.floor(distance) .. " m"
end
if stepdata.name then
name = name .. " with name '" .. stepdata.name .. "'"
end
local visibleText
if stepdata.visible == 1 then
visibleText = "Waypoint: Visible"
else
visibleText = "Waypoint: Hidden"
end
local formspec = "size[8,10;]" ..
"label[0,0;Walk to (Step #" .. ctx.stepnumber .. ")]" ..
"list[nodemeta:" .. pos.x .. "," .. pos.y .. "," .. pos.z .. ";main;0,1;1,1;0]" ..
"label[0,2;" .. name .. "]" ..
"field[0.2,3;8,1;description;Description;" .. stepdata.description .. "]" ..
"field[0.2,4;4,1;radius;Radius;" .. stepdata.radius .. "]" ..
"button[4,5;4,1;togglevisible;" .. visibleText .. "]" ..
"list[current_player;main;0,6;8,4;]listring[]" ..
"button[0,5;4,1;save;Save]"
return formspec;
end,
update = function(ctx)
local fields = ctx.fields
local inv = ctx.inv
local stepdata = ctx.step.data
if fields.radius then
local radius = tonumber(fields.radius)
if radius and radius > 0 then
stepdata.radius = radius
end
end
if fields.togglevisible then
if stepdata.visible == 1 then
stepdata.visible = 0
else
stepdata.visible = 1
end
ctx.show_editor()
end
if fields.description then
stepdata.description = fields.description
end
if fields.save then
local stack = inv:get_stack("main", 1)
if not stack:is_empty() then
local meta = stack:get_meta()
local pos = minetest.string_to_pos(meta:get_string("pos"))
local name = meta:get_string("name")
stepdata.pos = pos
stepdata.name = name
end
ctx.show_mission()
end
end,
on_step_enter = function(ctx)
local player = ctx.player
local stepdata = ctx.step.data
if stepdata.visible == 1 then
hud[player:get_player_name()] = player:hud_add({
hud_elem_type = "waypoint",
name = "Mission-waypoint: " .. stepdata.name,
text = "m",
number = 0xFF0000,
world_pos = stepdata.pos
})
end
end,
on_step_interval = function(ctx)
local player = ctx.player
local stepdata = ctx.step.data
local pos = player:get_pos()
local distance = vector.distance(pos, stepdata.pos)
if distance < stepdata.radius then
ctx.on_success()
end
end,
on_step_exit = function(ctx)
local player = ctx.player
local idx = hud[player:get_player_name()]
if idx then
player:hud_remove(idx)
hud[player:get_player_name()] = nil
end
end
})