139 lines
3.8 KiB
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
|