furniture/functions.lua

111 lines
3.6 KiB
Lua

--Mostly stolen code from Xdecor.
local function top_face(pointed_thing)
if not pointed_thing then return end
return pointed_thing.above.y > pointed_thing.under.y
end
function furniture.sit(pos, node, clicker, pointed_thing, rotate)
if not top_face(pointed_thing) then return end
local player_name = clicker:get_player_name()
local objs = minetest.get_objects_inside_radius(pos, 0.1)
local vel = clicker:get_player_velocity()
local ctrl = clicker:get_player_control()
local fdir = node.param2 % 32
for _, obj in pairs(objs) do
if obj:is_player() and obj:get_player_name() ~= player_name then
return
end
end
if default.player_attached[player_name] then
pos.y = pos.y - 0.5
clicker:set_pos(pos)
clicker:set_eye_offset(vector.new(), vector.new())
clicker:set_physics_override(furniture.players[player_name])
default.player_attached[player_name] = false
default.player_set_animation(clicker, "stand", 30)
elseif not default.player_attached[player_name] and fdir <= 3 and
not ctrl.sneak and vector.equals(vel, vector.new()) then
furniture.players[player_name] = clicker:get_physics_override()
clicker:set_eye_offset({x = 0, y = -7, z = 2}, vector.new())
clicker:set_physics_override({speed = 0, jump = 0, gravity = 1})
clicker:set_pos(pos)
default.player_attached[player_name] = true
default.player_set_animation(clicker, "sit", 30)
if rotate then
if fdir == 0 then
clicker:set_look_yaw(3.15)
elseif fdir == 1 then
clicker:set_look_yaw(7.9)
elseif fdir == 2 then
clicker:set_look_yaw(6.28)
elseif fdir == 3 then
clicker:set_look_yaw(4.75)
end
end
end
end
function furniture.sort_inventory(inv) -- Copied from the Technic_chests mod.
local inlist = inv:get_list("main")
local typecnt = {}
local typekeys = {}
for _, st in ipairs(inlist) do
if not st:is_empty() then
local n = st:get_name()
local w = st:get_wear()
local m = st:get_metadata()
local k = string.format("%s %05d %s", n, w, m)
if not typecnt[k] then
typecnt[k] = {
name = n,
wear = w,
metadata = m,
stack_max = st:get_stack_max(),
count = 0,
}
table.insert(typekeys, k)
end
typecnt[k].count = typecnt[k].count + st:get_count()
end
end
table.sort(typekeys)
local outlist = {}
for _, k in ipairs(typekeys) do
local tc = typecnt[k]
while tc.count > 0 do
local c = math.min(tc.count, tc.stack_max)
table.insert(outlist, ItemStack({
name = tc.name,
wear = tc.wear,
metadata = tc.metadata,
count = c,
}))
tc.count = tc.count - c
end
end
if #outlist > #inlist then return end
while #outlist < #inlist do
table.insert(outlist, ItemStack(nil))
end
inv:set_list("main", outlist)
end
function furniture.inv_take_put(pos, listname, index, stack, player)
local player_name = player:get_player_name()
if minetest.is_protected(pos, player_name) and not minetest.check_player_privs(player, 'protection_bypass') then
return 0
else
return 99
end
end
function furniture.inv_manipulate(pos, from_list, from_index, to_list, to_index, count, player)
local player_name = player:get_player_name()
if minetest.is_protected(pos, player_name) and not minetest.check_player_privs(player, 'protection_bypass') then
return 0
else
return 99
end
end