]> git.lizzy.rs Git - xdecor.git/blob - sitting.lua
Craft guide : get rid of item_image_button label on output's stack
[xdecor.git] / sitting.lua
1 local function pointed_face(pointed_thing)
2         return pointed_thing.above.y > pointed_thing.under.y -- Top face pointed.
3 end
4
5 local function sit(pos, node, clicker, pointed_thing)
6         if not pointed_face(pointed_thing) then return end
7         local player = clicker:get_player_name()
8         local objs = minetest.get_objects_inside_radius(pos, 0.1)
9
10         for _, p in pairs(objs) do
11                 if p:get_player_name() ~= clicker:get_player_name() then
12                         return
13                 end
14         end
15
16         if default.player_attached[player] == true then
17                 pos.y = pos.y - 0.5
18                 clicker:setpos(pos)
19                 clicker:set_eye_offset({x=0, y=0, z=0}, {x=0, y=0, z=0})
20                 clicker:set_physics_override(1, 1, 1)
21                 default.player_attached[player] = false
22                 default.player_set_animation(clicker, "stand", 30)
23
24         elseif default.player_attached[player] ~= true and node.param2 <= 3 and
25                         clicker:get_player_control().sneak == false and
26                         clicker:get_player_velocity().x == 0 and
27                         clicker:get_player_velocity().y == 0 and
28                         clicker:get_player_velocity().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(0, 0, 0)
32                 clicker:setpos(pos)
33                 default.player_attached[player] = true
34                 default.player_set_animation(clicker, "sit", 30)
35
36                 if node.param2 == 0 then
37                         clicker:set_look_yaw(3.15)
38                 elseif node.param2 == 1 then
39                         clicker:set_look_yaw(7.9)
40                 elseif node.param2 == 2 then
41                         clicker:set_look_yaw(6.28)
42                 elseif node.param2 == 3 then
43                         clicker:set_look_yaw(4.75)
44                 end
45         end
46 end
47
48 local function dig(pos, player)
49         local pname = player:get_player_name()
50         local objs = minetest.get_objects_inside_radius(pos, 0.1)
51
52         for _, p in pairs(objs) do
53                 if not player or not player:is_player() or p:get_player_name() ~= nil or
54                                 default.player_attached[pname] == true then
55                         return false
56                 end
57         end
58         return true
59 end
60
61 xdecor.register("chair", {
62         description = "Chair",
63         tiles = {"xdecor_wood.png"},
64         sounds = default.node_sound_wood_defaults(),
65         groups = {choppy=3, oddly_breakable_by_hand=2, flammable=3},
66         on_rotate = screwdriver.rotate_simple,
67         node_box = xdecor.pixelbox(16, {
68                 {3,  0, 11,   2, 16, 2},
69                 {11, 0, 11,   2, 16, 2},
70                 {5,  9, 11.5, 6,  6, 1},
71                 {3,  0,  3,   2,  6, 2},
72                 {11, 0,  3,   2,  6, 2},
73                 {3,  6,  3,   10, 2, 8}
74         }),
75         can_dig = dig,
76         on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
77                 pos.y = pos.y + 0  -- Sitting position.
78                 sit(pos, node, clicker, pointed_thing)
79         end
80 })
81
82 xdecor.register("cushion", {
83         description = "Cushion",
84         tiles = {"xdecor_cushion.png"},
85         groups = {snappy=3, flammable=3, fall_damage_add_percent=-50},
86         on_place = minetest.rotate_node,
87         node_box = xdecor.nodebox.slab_y(0.5),
88         can_dig = dig,
89         on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
90                 pos.y = pos.y + 0
91                 sit(pos, node, clicker, pointed_thing)
92
93                 local wield_item = clicker:get_wielded_item():get_name()
94                 if wield_item == "xdecor:cushion" and clicker:get_player_control().sneak then
95                         local player_name = clicker:get_player_name()
96                         if minetest.is_protected(pos, player_name) then
97                                 minetest.record_protection_violation(pos, player_name)
98                                 return
99                         end
100
101                         if pointed_face(pointed_thing) then
102                                 minetest.set_node(pos, {name="xdecor:cushion_block", param2=node.param2})
103                         end
104
105                         if not minetest.setting_getbool("creative_mode") then
106                                 itemstack:take_item()
107                         end
108
109                         return itemstack
110                 end
111         end
112 })
113