]> git.lizzy.rs Git - Crafter.git/blob - mods/player_mechanics/eating_mechanics.lua
Fix typo
[Crafter.git] / mods / player_mechanics / eating_mechanics.lua
1 local minetest,math,vector,ipairs,pairs,table = 
2       minetest,math,vector,ipairs,pairs,table
3
4 local food_control_pool  = {}
5
6 local particle_constant = {
7     amount = 12,
8     time = 0.01,
9     minpos = {x=-0.1,y=-0.1,z=-0.1},
10     maxpos = {x=0.1, y=0.3, z=0.1},
11     minvel = {x=-0.5,y=0.2, z=-0.5},
12     maxvel = {x=0.5,y=0.6,z=0.5},
13     minacc = {x=0, y=-9.81, z=1},
14     maxacc = {x=0, y=-9.81, z=1},
15     minexptime = 0.5,
16     maxexptime = 1.5,
17     object_collision = false,
18     collisiondetection = true,
19     collision_removal = true,
20     vertical = false,
21 }
22
23 -- creates volitile data for the game to use
24 local name
25 local create_data = function(player)
26     name = player:get_player_name()
27     if not food_control_pool[name] then
28                 food_control_pool[name] = {
29                         eating_step  = 0,
30                         eating_timer = 0,
31         }
32     end
33 end
34
35
36 -- removes movement data
37 local name
38 local terminate = function(player)
39         name = player:get_player_name()
40         if food_control_pool[name] then
41                 food_control_pool[name] = nil
42         end
43 end
44
45 minetest.register_on_joinplayer(function(player)
46         create_data(player)
47 end)
48 minetest.register_on_leaveplayer(function(player)
49         terminate(player)
50 end)
51
52 -- manages player eating effects
53 local position
54 local velocity
55 local offset
56 local temp_particle
57 local manage_eating_effects = function(player,timer,sneaking,item)
58     position    = player:get_pos()
59     velocity    = player:get_player_velocity()
60
61     if sneaking then
62         position.y  = position.y + 1.2
63         offset = 0.6
64     else
65         position.y = position.y + 1.3
66         offset = 0.3
67     end
68
69     position = vector.add(position, vector.multiply(player:get_look_dir(),offset))
70
71     temp_particle = table.copy(particle_constant)
72     temp_particle.minpos = vector.add(position,temp_particle.minpos)
73     temp_particle.maxpos = vector.add(position,temp_particle.maxpos)
74     temp_particle.minvel = vector.add(velocity,temp_particle.minvel)
75     temp_particle.maxvel = vector.add(velocity,temp_particle.maxvel)
76     temp_particle.node   = {name=item.."node"}
77
78     minetest.add_particlespawner(temp_particle)
79
80     if timer >= 0.2 then
81         minetest.sound_play("eat", {
82             object = player,
83             gain = 0.2                      ,
84             pitch = math.random(60,85)/100}
85         )
86         return(0)
87     end
88     return(timer)
89 end
90
91
92 local item
93 local finish_eating = function(player,timer)
94     if timer >= 1 then
95         item = player:get_wielded_item()
96
97         player_eat_food(player,item)
98
99         minetest.sound_play("eat_finish", {
100             object = player,
101             gain = 0.025                      ,
102             pitch = math.random(60,85)/100}
103         )
104         return(0)
105     end
106     return(timer)
107 end
108
109
110 local name
111 local control
112 local item
113 local satiation
114 local hunger
115 local eating_step
116 local eating_timer
117 local pool
118 local manage_eating = function(player,dtime)
119     control = player:get_player_control()
120     name    = player:get_player_name()
121     pool    = food_control_pool[name]
122     --eating
123     if control.RMB then
124         item      = player:get_wielded_item():get_name()
125
126         satiation = minetest.get_item_group( item, "satiation")
127         hunger    = minetest.get_item_group( item, "hunger"   )
128
129         if hunger > 0 or satiation > 0  then
130
131             pool.eating_step  = pool.eating_step  + dtime
132             pool.eating_timer = pool.eating_timer + dtime
133
134             pool.eating_timer = manage_eating_effects(
135                 player,
136                 pool.eating_timer,
137                 control.sneak,
138                 item
139             )
140
141             pool.eating_step = finish_eating(
142                 player,
143                 pool.eating_step
144             )
145
146         else
147             pool.eating_step  = 0
148             pool.eating_timer = 0
149         end
150     else
151         pool.eating_step  = 0
152         pool.eating_timer = 0
153     end
154 end
155
156 local player
157 minetest.register_globalstep(function(dtime)
158         for _,player in ipairs(minetest.get_connected_players()) do
159                 manage_eating(player,dtime)
160         end
161 end)