watchtower/02-internal.lua

139 lines
3.8 KiB
Lua

local logger = watchtower.logger
local HEIGHT = watchtower.config.tower_height
local p = watchtower.config.whitelistpriv
local cache = {}
local levels = {}
levels.NOPE = 0
levels.MAYBE = 0.33
levels.PERHAPS = 0.66
levels.DEFINITELY = 1.0
levels.DOUBLE = 2.0
local on_player_exit = function(ObjectRef, timed_out)
if not minetest.is_player(ObjectRef) then
return
end
cache[ObjectRef:get_player_name()] = nil
end
local insert_tower = function(player, pos)
cache[player] = {
["x"] = pos.x,
["y"] = pos.y, -- current tower height
["z"] = pos.z,
["height"] = 1,
["level"] = levels.NOPE,
}
end
local check_callbacks = function(placer, obj)
local player = placer:get_player_name()
local pos = { ["x"] = obj.x, ["y"] = obj.y, ["z"] = obj.z }
local strpos = minetest.pos_to_string(pos)
local height = cache[player]["height"]
if (height > levels.DOUBLE * HEIGHT) and (obj.level < levels.DOUBLE) then
logger:info("%s stacks tower at %s (height=200%%)", player, strpos)
watchtower.callbacks.on_double_tower(placer, pos, height)
obj.level = levels.DOUBLE
elseif (height > levels.DEFINITELY * HEIGHT) and (obj.level < levels.DEFINITELY) then
logger:info("%s stacks tower at %s (height=100%%)", player, strpos)
watchtower.callbacks.on_tower(placer, pos, height)
obj.level = levels.DEFINITELY
elseif (height > levels.PERHAPS * HEIGHT) and (obj.level < levels.PERHAPS) then
logger:info("%s perhaps stacks tower at %s (height=66%%)", player, strpos)
watchtower.callbacks.on_perhaps_tower(placer, pos, height)
obj.level = levels.PERHAPS
elseif (height > levels.MAYBE * HEIGHT) and (obj.level < levels.MAYBE) then
logger:info("%s maybe stacks tower at %s (height=33%%)", player, strpos)
watchtower.callbacks.on_maybe_tower(placer, pos, height)
obj.level = levels.MAYBE
end
return obj
end
local on_block_placed = function(pos, newnode, placer, oldnode, itemstack, pointed_thing)
if not minetest.is_player(placer) then
return
end
local player = placer:get_player_name()
if minetest.check_player_privs(player, p) then
return
end
local obj = cache[player]
local strpos = minetest.pos_to_string(pos)
local x, y, z = pos["x"], pos["y"], pos["z"]
if obj then
if obj.x == x and obj.z == z and obj.y + 1 == y then
-- we have a tower match
logger:trace("%s perhaps stacks tower at %s (height=%d)", player, strpos, obj.height + 1)
obj = check_callbacks(placer, obj)
cache[player] = {
["x"] = x,
["y"] = y,
["z"] = z,
["height"] = obj.height + 1,
["level"] = obj.level,
}
else
-- player not found in cache, start tracking new tower
insert_tower(player, pos)
end
else -- cache miss
insert_tower(player, pos)
end
end
watchtower.api = {}
watchtower.api._internal = {}
watchtower.api._internal.cache = cache
watchtower.api._internal.check_callbacks = check_callbacks
watchtower.api._internal.insert_tower = insert_tower
watchtower.api.on_block_places = on_block_placed
watchtower.api.on_player_exit = on_player_exit
watchtower.callbacks = {}
watchtower.callbacks.on_maybe_tower = function(player, pos, height)
logger:print(
logger.WARNING,
"MAYBE | %s builds tower of height %d at %s",
player:get_player_name(),
height,
minetest.pos_to_string(pos)
)
end
watchtower.callbacks.on_perhaps_tower = function(player, pos, height)
logger:print(
logger.WARNING,
"PERHAPS | %s builds tower of height %d at %s",
player:get_player_name(),
height,
minetest.pos_to_string(pos)
)
end
watchtower.callbacks.on_tower = function(player, pos, height)
logger:print(
logger.WARNING,
"DEF | %s builds tower of height %d at %s",
player:get_player_name(),
height,
minetest.pos_to_string(pos)
)
end
watchtower.callbacks.on_double_tower = function(player, pos, height)
logger:print(
logger.WARNING,
"DOUBLE | %s builds tower of height %d at %s",
player:get_player_name(),
height,
minetest.pos_to_string(pos)
)
end