393210db69
Make sure that non-built-in content respects the interact priv and prevents spectator players from doing nasty stuff.
89 lines
2.4 KiB
Lua
89 lines
2.4 KiB
Lua
-- LUALOCALS < ---------------------------------------------------------
|
|
local minetest, nodecore, vector
|
|
= minetest, nodecore, vector
|
|
-- LUALOCALS > ---------------------------------------------------------
|
|
|
|
local function pummelparticles(data)
|
|
local pointed = data.pointed
|
|
local nodedef = data.nodedef
|
|
local pname = data.pname
|
|
|
|
local stack = nodecore.stack_get(data.node)
|
|
if stack and not stack:is_empty() then
|
|
nodedef = minetest.registered_items[stack:get_name()] or nodedef
|
|
end
|
|
|
|
local a = pointed.above
|
|
local b = pointed.under
|
|
local vel = vector.subtract(a, b)
|
|
local mid = vector.multiply(vector.add(a, b), 0.5)
|
|
local p1 = {x = vel.y, y = vel.z, z = vel.x}
|
|
local p2 = {x = vel.z, y = vel.x, z = vel.y}
|
|
local s1 = vector.add(vector.add(mid, vector.multiply(p1, 0.5)), vector.multiply(p2, 0.5))
|
|
local s2 = vector.add(vector.add(mid, vector.multiply(p1, -0.5)), vector.multiply(p2, -0.5))
|
|
vel = vector.multiply(vel, 0.5)
|
|
|
|
data.clearfx = nodecore.digparticles(nodedef, {
|
|
amount = 8,
|
|
time = 1.5,
|
|
minpos = s1,
|
|
maxpos = s2,
|
|
minvel = vel,
|
|
maxvel = vel,
|
|
minexptime = 0.4,
|
|
maxexptime = 0.9,
|
|
minsize = 1,
|
|
maxsize = 5,
|
|
playername = pname
|
|
})
|
|
end
|
|
|
|
local pummeling = {}
|
|
|
|
minetest.register_on_punchnode(function(pos, node, puncher, pointed)
|
|
if not puncher:is_player() then return end
|
|
local pname = puncher:get_player_name()
|
|
if not nodecore.interact(pname) then return end
|
|
|
|
node = node or minetest.get_node(pos)
|
|
local def = minetest.registered_items[node.name] or {}
|
|
|
|
local now = minetest.get_us_time() / 1000000
|
|
local pum = {
|
|
action = "pummel",
|
|
crafter = puncher,
|
|
pname = pname,
|
|
pos = pos,
|
|
pointed = pointed,
|
|
node = node,
|
|
nodedef = def,
|
|
start = now,
|
|
wield = puncher:get_wielded_item():to_string(),
|
|
count = 0,
|
|
inprogress = pummelparticles
|
|
}
|
|
|
|
local old = pummeling[pname]
|
|
if old and old.clearfx then old.clearfx() end
|
|
|
|
local hash = minetest.hash_node_position
|
|
if old and hash(old.pos) == hash(pum.pos)
|
|
and hash(old.pointed.above) == hash(pum.pointed.above)
|
|
and hash(old.pointed.under) == hash(pum.pointed.under)
|
|
and pum.wield == old.wield
|
|
and old.last >= (now - 2)
|
|
then pum = old end
|
|
|
|
pum.count = pum.count + 1
|
|
pum.last = now
|
|
pum.duration = now - pum.start - 1
|
|
pummeling[pname] = pum
|
|
|
|
if pum.count < 2 then return end
|
|
|
|
if nodecore.craft_check(pos, node, nodecore.underride({}, pum)) then
|
|
pummeling[pname] = nil
|
|
return
|
|
end
|
|
end)
|