123 lines
2.6 KiB
Lua
123 lines
2.6 KiB
Lua
--[[
|
|
|
|
TechAge
|
|
=======
|
|
|
|
Copyright (C) 2020-2021 Joachim Stolberg
|
|
|
|
AGPL v3
|
|
See LICENSE.txt for more information
|
|
|
|
Block marker lib for door/move/fly controller
|
|
|
|
]]--
|
|
|
|
local MAX_NUM = 128
|
|
local marker = {}
|
|
|
|
local MarkedNodes = {} -- t[player] = {{entity, pos},...}
|
|
local MaxNumber = {}
|
|
local CurrentPos -- to mark punched entities
|
|
|
|
local function unmark_position(name, pos)
|
|
pos = vector.round(pos)
|
|
for idx,item in ipairs(MarkedNodes[name] or {}) do
|
|
if vector.equals(pos, item.pos) then
|
|
item.entity:remove()
|
|
table.remove(MarkedNodes[name], idx)
|
|
CurrentPos = pos
|
|
return
|
|
end
|
|
end
|
|
end
|
|
|
|
function marker.unmark_all(name)
|
|
for _,item in ipairs(MarkedNodes[name] or {}) do
|
|
item.entity:remove()
|
|
end
|
|
MarkedNodes[name] = nil
|
|
end
|
|
|
|
local function mark_position(name, pos)
|
|
pos = vector.round(pos)
|
|
if not CurrentPos or not vector.equals(pos, CurrentPos) then -- entity not punched?
|
|
if #MarkedNodes[name] < MaxNumber[name] then
|
|
local entity = minetest.add_entity(pos, "techage:block_marker")
|
|
if entity ~= nil then
|
|
entity:get_luaentity().player_name = name
|
|
table.insert(MarkedNodes[name], {pos = pos, entity = entity})
|
|
end
|
|
CurrentPos = nil
|
|
return true
|
|
end
|
|
end
|
|
CurrentPos = nil
|
|
end
|
|
|
|
function marker.get_poslist(name)
|
|
local idx = 0
|
|
local lst = {}
|
|
for _,item in ipairs(MarkedNodes[name] or {}) do
|
|
table.insert(lst, item.pos)
|
|
idx = idx + 1
|
|
if idx >= MAX_NUM then break end
|
|
end
|
|
return lst
|
|
end
|
|
|
|
minetest.register_on_punchnode(function(pos, node, puncher, pointed_thing)
|
|
if puncher and puncher:is_player() then
|
|
local name = puncher:get_player_name()
|
|
|
|
if not MarkedNodes[name] then
|
|
return
|
|
end
|
|
|
|
mark_position(name, pointed_thing.under)
|
|
end
|
|
end)
|
|
|
|
function marker.start(name, max_num)
|
|
MaxNumber[name] = max_num or 99
|
|
MarkedNodes[name] = {}
|
|
end
|
|
|
|
function marker.stop(name)
|
|
MarkedNodes[name] = nil
|
|
MaxNumber[name] = nil
|
|
end
|
|
|
|
minetest.register_entity(":techage:block_marker", {
|
|
initial_properties = {
|
|
visual = "cube",
|
|
textures = {
|
|
"techage_cube_mark.png",
|
|
"techage_cube_mark.png",
|
|
"techage_cube_mark.png",
|
|
"techage_cube_mark.png",
|
|
"techage_cube_mark.png",
|
|
"techage_cube_mark.png",
|
|
},
|
|
physical = false,
|
|
visual_size = {x=1.1, y=1.1},
|
|
collisionbox = {-0.55,-0.55,-0.55, 0.55,0.55,0.55},
|
|
glow = 8,
|
|
},
|
|
on_step = function(self, dtime)
|
|
self.ttl = (self.ttl or 2400) - 1
|
|
if self.ttl <= 0 then
|
|
local pos = self.object:get_pos()
|
|
unmark_position(self.player_name, pos)
|
|
end
|
|
end,
|
|
on_punch = function(self, hitter)
|
|
local pos = self.object:get_pos()
|
|
local name = hitter:get_player_name()
|
|
if name == self.player_name then
|
|
unmark_position(name, pos)
|
|
end
|
|
end,
|
|
})
|
|
|
|
return marker
|