capturetheflag/mods/pvp/place_limit/init.lua
Lars Müller 7382db367b
Limit node placement to 5 NPS (#803)
* Limit placement to 5 nodes per second

* Add Readme, check pointed thing, inform player

* Include team door fix

* Add license
2021-03-27 07:27:22 -07:00

54 lines
1.8 KiB
Lua

-- Licensed under the MIT license, written by appgurueu.
local players = {}
local blocks_per_second = 5
local resend_chat_message_seconds = 10
minetest.register_on_joinplayer(function(player)
-- player has to wait after join before they can place a node
players[player:get_player_name()] = {
last_placement = minetest.get_us_time(),
last_chat_message_sent = -math.huge
}
end)
local chat_send_player = minetest.chat_send_player
function minetest.chat_send_player(name, message)
if players[name] then
players[name].last_chat_message_sent = -math.huge
end
return chat_send_player(name, message)
end
local chat_send_all = minetest.chat_send_all
function minetest.chat_send_all(message)
for _, playerdata in pairs(players) do
playerdata.last_chat_message_sent = -math.huge
end
return chat_send_all(message)
end
minetest.register_on_leaveplayer(function(player)
players[player:get_player_name()] = nil
end)
minetest.register_on_placenode(function(pos, _newnode, placer, oldnode, _itemstack, pointed_thing)
if not ItemStack(minetest.get_node(pointed_thing.under).name):get_definition().pointable then
-- this should happen rarely
minetest.chat_send_player(placer:get_player_name(), "The block you have been building to has been dug/replaced!")
minetest.set_node(pos, oldnode)
return true
end
local name = placer:get_player_name()
local playerdata = players[name]
local time = minetest.get_us_time()
if (time - playerdata.last_placement) / 1e6 < 1 / blocks_per_second then
if (time - playerdata.last_chat_message_sent) / 1e6 >= resend_chat_message_seconds then
chat_send_player(placer:get_player_name(), "You are placing blocks too fast (more than " .. blocks_per_second .. " blocks per second) !")
playerdata.last_chat_message_sent = time
end
minetest.set_node(pos, oldnode)
return true
end
playerdata.last_placement = time
end)