You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
3.7 KiB
Lua
135 lines
3.7 KiB
Lua
local positions = {}
|
|
|
|
local function barrier_can_dig(pos,player)
|
|
if player then
|
|
local allowed, missing = minetest.check_player_privs(player, "barrier")
|
|
return allowed
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
|
|
local function barrier_on_place(itemstack, placer, pointed_thing)
|
|
if not barrier_can_dig(nil,placer) then
|
|
minetest.chat_send_player(placer:get_player_name(),
|
|
"You do not have permission to place barriers.")
|
|
return
|
|
else
|
|
return minetest.item_place(itemstack, placer, pointed_thing)
|
|
end
|
|
end
|
|
|
|
minetest.register_privilege("barrier", {
|
|
give_to_admin = false,
|
|
give_to_singleplayer = false,
|
|
description = "Allowed to place and break barriers.",
|
|
})
|
|
|
|
minetest.register_privilege("barrier_see", {
|
|
give_to_admin = false,
|
|
give_to_singleplayer = false,
|
|
description = "Allowed to see nearby invisible barriers.",
|
|
})
|
|
|
|
minetest.register_node("barrier:barrier", {
|
|
description = "Barrier",
|
|
node_dig_prediction = "",
|
|
tiles = {"barrier_barrier.png"},
|
|
groups = {cracky = 1},
|
|
can_dig = barrier_can_dig,
|
|
on_place = barrier_on_place,
|
|
})
|
|
minetest.register_node("barrier:barrier_transparent", {
|
|
description = "Transparent Barrier",
|
|
node_dig_prediction = "",
|
|
tiles = {"barrier_barrier_transparent.png"},
|
|
use_texture_alpha = "clip",
|
|
groups = {cracky = 1},
|
|
drawtype = "glasslike",
|
|
sunlight_propagates = true,
|
|
paramtype = "light",
|
|
can_dig = barrier_can_dig,
|
|
on_place = barrier_on_place,
|
|
})
|
|
minetest.register_node("barrier:barrier_invisible", {
|
|
description = "Invisible Barrier",
|
|
node_dig_prediction = "",
|
|
tiles = {"barrier_barrier_transparent.png"},
|
|
groups = {cracky = 1},
|
|
drawtype = "airlike",
|
|
sunlight_propagates = true,
|
|
paramtype = "light",
|
|
can_dig = barrier_can_dig,
|
|
on_place = barrier_on_place,
|
|
})
|
|
minetest.register_node("barrier:barrier_liquid", {
|
|
description = "Liquid Barrier",
|
|
node_dig_prediction = "",
|
|
tiles = {"barrier_barrier_transparent.png"},
|
|
groups = {cracky = 1},
|
|
drawtype = "airlike",
|
|
sunlight_propagates = true,
|
|
paramtype = "light",
|
|
can_dig = barrier_can_dig,
|
|
on_place = barrier_on_place,
|
|
walkable = false,
|
|
pointable=false,
|
|
buildable_to = true,
|
|
})
|
|
minetest.register_node("barrier:barrier_sky", {
|
|
description = "Sky Barrier",
|
|
node_dig_prediction = "",
|
|
tiles = {{name="barrier_barrier_sky.png",scale=1,align_style="world"}},
|
|
--tiles = {"barrier_barrier_sky.png"},
|
|
use_texture_alpha = "clip",
|
|
groups = {cracky = 1},
|
|
--drawtype = "glasslike",
|
|
sunlight_propagates = true,
|
|
light_source = minetest.LIGHT_MAX,
|
|
paramtype = "light",
|
|
can_dig = barrier_can_dig,
|
|
on_place = barrier_on_place,
|
|
})
|
|
|
|
|
|
|
|
local timer = 0
|
|
local radius = 8 -- Node search radius around player
|
|
local cycle = 2 -- Cycle time for updates
|
|
|
|
local function barrier_particle(player)
|
|
local ppos = player:get_pos()
|
|
local areamin = vector.subtract(ppos, radius)
|
|
local areamax = vector.add(ppos, radius)
|
|
local fpos, num = minetest.find_nodes_in_area(
|
|
areamin,
|
|
areamax,
|
|
{"barrier:barrier_invisible"}
|
|
)
|
|
for index, value in ipairs(fpos) do
|
|
minetest.add_particle({
|
|
pos = value,
|
|
expirationtime = 2.1,
|
|
texture = "barrier_particle.png",
|
|
playername = player:get_player_name(),
|
|
size = 6,
|
|
})
|
|
end
|
|
end
|
|
|
|
minetest.register_globalstep(function(dtime)
|
|
timer = timer + dtime
|
|
if timer < cycle then
|
|
return
|
|
end
|
|
|
|
timer = 0
|
|
local players = minetest.get_connected_players()
|
|
for n = 1, #players do
|
|
local allowed, missing = minetest.check_player_privs(players[n],"barrier_see")
|
|
if allowed then
|
|
barrier_particle(players[n])
|
|
end
|
|
end
|
|
end)
|