]> git.lizzy.rs Git - xdecor.git/blob - handlers/animations.lua
fix physics overrides
[xdecor.git] / handlers / animations.lua
1 local function top_face(pointed_thing)
2         if not pointed_thing then return end
3         return pointed_thing.above.y > pointed_thing.under.y
4 end
5
6 function xdecor.sit(pos, node, clicker, pointed_thing)
7         if not top_face(pointed_thing) then return end
8         local player_name = clicker:get_player_name()
9         local objs = minetest.get_objects_inside_radius(pos, 0.1)
10         local vel = clicker:get_player_velocity()
11         local ctrl = clicker:get_player_control()
12
13         for _, obj in pairs(objs) do
14                 if obj:is_player() and obj:get_player_name() ~= player_name then
15                         return
16                 end
17         end
18
19         if default.player_attached[player_name] then
20                 pos.y = pos.y - 0.5
21                 clicker:setpos(pos)
22                 clicker:set_eye_offset({x=0, y=0, z=0}, {x=0, y=0, z=0})
23                 clicker:set_physics_override({speed = 1, jump = 1, gravity = 1})
24                 default.player_attached[player_name] = false
25                 default.player_set_animation(clicker, "stand", 30)
26
27         elseif not default.player_attached[player_name] and node.param2 <= 3 and
28                         not ctrl.sneak and vector.equals(vel, {x=0,y=0,z=0}) then
29
30                 clicker:set_eye_offset({x=0, y=-7, z=2}, {x=0, y=0, z=0})
31                 clicker:set_physics_override({speed = 0, jump = 0, gravity = 1})
32                 clicker:setpos(pos)
33                 default.player_attached[player_name] = true
34                 default.player_set_animation(clicker, "sit", 30)
35
36                 if     node.param2 == 0 then clicker:set_look_yaw(3.15)
37                 elseif node.param2 == 1 then clicker:set_look_yaw(7.9)
38                 elseif node.param2 == 2 then clicker:set_look_yaw(6.28)
39                 elseif node.param2 == 3 then clicker:set_look_yaw(4.75) end
40         end
41 end
42
43 function xdecor.sit_dig(pos, digger)
44         for _, player in pairs(minetest.get_objects_inside_radius(pos, 0.1)) do
45                 if player:is_player() and
46                             default.player_attached[player:get_player_name()] then
47                         return false
48                 end
49         end
50         return true
51 end
52