Aaron Suen ac77b41af5 Revert "Scaling overhaul."
While this makes scaling a little easier to do, it still doesn't
fix the fundamental problem of scaling being distracting and too
easy to trigger accidentally.

The "pummel" version of scaling caused some confusion when one
player accidentally triggered it trying to figure out how to get
lode out of lode ore.  The current one triggers accidentally all
the time just from tabbing out of a game with it running (e.g. it
isn't paused in multiplayer) leaving the character staring at a
wall.  While such a player WOULD have opportunity to find
handholds in the wall, we aren't differentiating between a player
who's scrutinizing a surface from one staring off into space.

The scaling needs to be made harder to trigger accidentally, like
reinstating the need for an empty hand.  Using a right-click
action may also help distinguish it from pummelng recipes.

Removing this from the alpha branch so players don't get too
accustomed to this functionality and then have it change AGAIN.

This reverts commit 943604cf9588a316dce19e0a60a4219b52c4d905.
2019-10-24 20:16:37 -04:00

227 lines
5.1 KiB
Lua

-- LUALOCALS < ---------------------------------------------------------
local minetest, nodecore, pairs, vector
= minetest, nodecore, pairs, vector
-- LUALOCALS > ---------------------------------------------------------
nodecore.amcoremod()
local modname = minetest.get_current_modname()
minetest.register_node(modname .. ":steps", {
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
tiles = {
"nc_scaling_blank.png",
"nc_scaling_blank.png",
"nc_scaling_blank.png",
"nc_scaling_blank.png",
"nc_scaling_blank.png",
"nc_scaling_steps.png"
},
use_texture_alpha = true,
drawtype = "nodebox",
node_box = nodecore.fixedbox(-0.5, -0.5, 31/64, 0.5, 0.5, 0.5),
walkable = false,
climbable = true,
pointable = false,
buildable_to = true,
air_equivalent = true,
light_source = 1,
groups = {[modname] = 1}
})
minetest.register_node(modname .. ":hang", {
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
drawtype = "airlike",
walkable = false,
climbable = true,
pointable = false,
buildable_to = true,
air_equivalent = true,
groups = {[modname] = 1}
})
minetest.register_node(modname .. ":see", {
paramtype = "light",
sunlight_propagates = true,
tiles = {
"nc_scaling_steps.png",
"nc_scaling_blank.png"
},
use_texture_alpha = true,
drawtype = "nodebox",
node_box = nodecore.fixedbox(-0.5, -0.5, -0.5, 0.5, -31/64, 0.5),
walkable = false,
pointable = false,
buildable_to = true,
air_equivalent = true,
light_source = 1,
groups = {[modname] = 1}
})
local function closenough(pos, player)
local pp = player:get_pos()
pp.y = pp.y + 1
return vector.distance(pos, pp) <= 5
end
nodecore.register_limited_abm({
label = "Scaling Decay",
interval = 1,
chance = 1,
limited_max = 100,
nodenames = {"group:" .. modname},
action = function(pos)
local data = minetest.get_meta(pos):get_string("data")
if (not data) or (data == "") then
return minetest.remove_node(pos)
end
data = minetest.deserialize(data)
if minetest.get_node(data.pos).name ~= data.node then
return minetest.remove_node(pos)
end
for _, p in pairs(minetest.get_connected_players()) do
if closenough(pos, p) then return end
end
return minetest.remove_node(pos)
end
})
local function stepcheck(pos, data)
if not closenough(pos, data.crafter) then return end
if not data.wield:is_empty() then return end
local node = minetest.get_node(pos)
local def = minetest.registered_nodes[node.name]
return not nodecore.toolspeed(data.wield, def.groups)
end
local function setstep(pos, node, mdata, param2)
node = {name = modname .. ":" .. node}
if param2 then node.param2 = param2 end
minetest.set_node(pos, node)
minetest.get_meta(pos):set_string("data",
minetest.serialize(mdata))
end
local function hangcheck(pos, dx, dy, dz, mdata)
pos = {
x = pos.x + dx,
y = pos.y + dy,
z = pos.z + dz
}
if minetest.get_node(pos).name ~= "air" then return end
setstep(pos, "hang", mdata)
end
local function stepafter(dx, dy, dz)
return function(pos, data)
local p = data.rel(dx, dy, dz)
local d = vector.subtract(p, pos)
local fd = 0
for i = 0, #nodecore.facedirs do
if vector.equals(nodecore.facedirs[i].f, d) then
fd = i
break
end
end
nodecore.node_sound(pos, "place")
local mdata = {
pos = pos,
node = data.node.name
}
setstep(p, "steps", mdata, fd)
-- invisible support below to simulate hanging by fingertips
hangcheck(p, 0, -1, 0, mdata)
if dy ~= 0 then
-- invisible support to the sides to simulate swinging
-- outward to grab onto the side of an overhang when
-- hanging below it
hangcheck(p, 1, -1, 0, mdata)
hangcheck(p, -1, -1, 0, mdata)
hangcheck(p, 0, -1, 1, mdata)
hangcheck(p, 0, -1, -1, mdata)
end
end
end
local pumparticles = {
minsize = 1,
maxsize = 5,
forcetexture = "nc_scaling_particle.png",
glow = 1
}
nodecore.register_craft({
label = "scale sheer walls",
action = "pummel",
priority = -100,
pumparticles = pumparticles,
duration = 5,
normal = {x = 1},
check = stepcheck,
nodes = {
{
match = {walkable = true}
},
{
x = 1,
match = {any = {"air", modname .. ":hang"}}
}
},
after = stepafter(1, 0, 0)
})
nodecore.register_craft({
label = "scale sheer ceilings",
action = "pummel",
priority = -100,
pumparticles = pumparticles,
duration = 10,
normal = {y = -1},
check = stepcheck,
nodes = {
{
match = {walkable = true}
},
{
y = -1,
match = "air"
}
},
after = stepafter(0, -1, 0)
})
nodecore.register_craft({
label = "scale sheer floors",
action = "pummel",
priority = -100,
pumparticles = pumparticles,
duration = 5,
normal = {y = 1},
check = stepcheck,
nodes = {
{
match = {walkable = true}
},
{
y = 1,
match = {any = {"air", modname .. ":hang"}},
replace = modname .. ":see"
}
},
after = function(pos)
minetest.get_meta({x = pos.x, y = pos.y + 1, z = pos.z})
:set_string("data", minetest.serialize({
pos = pos,
node = minetest.get_node(pos).name
}))
end
})