liquid_restriction/init.lua

95 lines
3.5 KiB
Lua

--settings
local lr_height = tonumber(minetest.settings:get("lr_height")) or 30
local lr_renew = minetest.settings:get_bool("lr_renew", false)
--registering priv
minetest.register_privilege("spill", {description = "Able to use all liquids.", give_to_singleplayer=false})
--this list only contains items not autmotically filled in.
--this should be replaced with a more agnostic solution at a later date
local liquid_list = {
--technic cans
"technic:lava_can",
"technic:water_can",
--buckets
"bucket:bucket_lava",
"bucket:bucket_water",
"bucket:bucket_river_water",
"fl_bucket:bucket_water",
"fl_bucket:bucket_river_water",
"fl_bucket:bucket_lava",
--bucket_wooden
"bucket_wooden:bucket_water",
"bucket_wooden:bucket_river_water",
}
--function for handling priv settings
local function priv_selection(default_priv, setting)
local priv = minetest.settings:get(setting)
if not minetest.registered_privileges[priv] then
return default_priv
else
return priv
end
end
--reads list, overrides nodes, adding priv check
local function override()
for liquidcount = 1, #liquid_list do
--checks if its a valid node/item
if minetest.registered_items[liquid_list[liquidcount]] then
--get old on_place behavior
local old_place = minetest.registered_items[liquid_list[liquidcount]].on_place or function() end
--override
minetest.override_item(liquid_list[liquidcount], {
on_place = function(itemstack, placer, pointed_thing)
local pname = placer:get_player_name()
local default_priv = priv_selection("spill", "lr_default")
local advanced_priv = priv_selection("server", "lr_advanced")
if not minetest.check_player_privs(pname, priv_selection(default_priv, "lr_default")) then
minetest.chat_send_player(
pname,
"[Liquid Restriction]: " .. default_priv .. " priv required to use this node"
)
return
else
if (minetest.get_pointed_thing_position(pointed_thing).y > lr_height) then
if not (minetest.check_player_privs(pname, priv_selection("server", "lr_advanced"))) then
minetest.chat_send_player(
pname,
"[Liquid Restriction]: " .. advanced_priv .. " priv requid at this height"
)
return
end
end
return old_place(itemstack, placer, pointed_thing)
end
end,
--prevents liquids from spreading
liquid_renewable = lr_renew,
})
end
end
--disables water from being used with the replacer tool, as that bypasses the spill priv
if minetest.get_modpath("replacer") then
for _, name in pairs(liquid_list) do
replacer.blacklist[name] = true;
end
end
end
minetest.register_on_mods_loaded(function()
for name, def in pairs(minetest.registered_nodes) do
if def.drawtype and (def.drawtype == "liquid" or def.drawtype == "flowingliquid")
and minetest.get_item_group(name, "liquid_blacklist") == 0 then
table.insert(liquid_list, name)
end
end
override()
end)