]> git.lizzy.rs Git - Crafter.git/blob - mods/player/player_mechanics.lua
62b8f9df4ac9b393c43984b61a183c1e50e7321a
[Crafter.git] / mods / player / player_mechanics.lua
1 local player_state_channels = {}
2
3 minetest.register_on_modchannel_message(function(channel_name, sender, message)
4         local channel_decyphered = channel_name:gsub(sender,"")
5         if sender ~= "" and channel_decyphered == ":player_movement_state" then
6                 local player = minetest.get_player_by_name(sender)
7                 local meta = player:get_meta()
8                 meta:set_string("player.player_movement_state", message)
9         end
10 end)
11
12 local send_running_cancellation = function(player,sneaking)
13         local name = player:get_player_name()
14         player_state_channels[name]:send_all(minetest.serialize({stop_running=true,state=sneaking}))
15 end
16
17 minetest.register_on_joinplayer(function(player)
18         local name = player:get_player_name()
19         player_state_channels[name] = minetest.mod_channel_join(name..":player_movement_state")
20         player:set_physics_override({jump=1.25,gravity=1.25})
21         local meta = player:get_meta()
22         meta:set_string("player.player_movement_state", "0")
23         meta:set_string("player.old_player_movement_state", "0")
24 end)
25
26 minetest.register_on_dieplayer(function(player)
27         local meta = player:get_meta()
28         meta:set_string("player.player_movement_state", "0")
29         send_running_cancellation(player,sneaking)
30 end)
31
32 minetest.register_globalstep(function(dtime)
33         for _,player in ipairs(minetest.get_connected_players()) do
34                 local meta = player:get_meta()
35                 local hunger = meta:get_int("hunger")
36                 local state = meta:get_string("player.player_movement_state")
37                 local old_state = meta:get_string("player.old_player_movement_state")
38                 
39                 if state ~= old_state or ((state == "1" or state == "2") and hunger <= 6) then
40                         local running = (state == "1")
41                         local bunny_hopping = (state == "2")
42                         local sneaking = (state == "3")
43
44                         --running FOV modifier
45                         if hunger > 6 and (running or bunny_hopping) then
46                                 player:set_fov(1.25, true,0.15)
47                                 
48                                 if bunny_hopping == true then
49                                         --player:set_fov(1.45, true,0.15)
50                                         player:set_physics_override({speed=1.75})
51                                 else
52                                         --player:set_fov(1.25, true,0.15)
53                                         player:set_physics_override({speed=1.5})
54                                 end
55                         elseif not (running or bunny_hopping) and (old_state == "1" or old_state == "2")  then
56                                 player:set_fov(1, true,0.15)
57                                 player:set_physics_override({speed=1})
58                                 send_running_cancellation(player,sneaking) --preserve network data
59                         end
60
61                         --sneaking
62                         if sneaking then
63                                 --player:set_fov(0.8, true,0.1)
64                                 player:set_eye_offset({x=0,y=-1,z=0},{x=0,y=-1,z=0})
65                         else
66                                 player:set_eye_offset({x=0,y=0,z=0},{x=0,y=0,z=0})
67                         end
68                 end
69
70                 meta:set_string("player.old_player_movement_state", state)
71                 
72                 --eating
73                 if player:get_player_control().RMB then
74                 
75                         local item = player:get_wielded_item():get_name()
76                         local satiation = minetest.get_item_group(item, "satiation")
77                         local hunger = minetest.get_item_group(item, "hunger")
78                         
79                         local meta = player:get_meta()
80                         if meta:get_int("hunger") == 20 then
81                                 return 
82                         end
83                         
84                         if hunger > 0 and satiation > 0  then                           
85                                 local eating = meta:get_float("eating")
86                                 local eating_timer = meta:get_float("eating_timer")
87                                 
88                                 eating = eating + dtime
89                                 eating_timer = eating_timer + dtime
90                                 
91                                 local pos = player:get_pos()
92
93                                 if sneaking then
94                                         pos.y = pos.y + 1.425
95                                 else
96                                         pos.y = pos.y + 1.625
97                                 end
98
99                                 local dir = vector.multiply(player:get_look_dir(),0.3)
100                                 local newpos = vector.add(pos,dir)
101
102                                 local vel = player:get_player_velocity()
103
104                                 local ps = minetest.add_particlespawner({
105                                         amount = 6,
106                                         time = 0.00001,
107                                         minpos = {x=newpos.x-0.1, y=newpos.y-0.1, z=newpos.z-0.1},
108                                         maxpos = {x=newpos.x+0.1, y=newpos.y-0.3, z=newpos.z+0.1},
109                                         minvel = vector.new(vel.x-0.5,0.2,vel.z-0.5),
110                                         maxvel = vector.new(vel.x+0.5,0.6,vel.z+0.5),
111                                         minacc = {x=0, y=-9.81, z=1},
112                                         maxacc = {x=0, y=-9.81, z=1},
113                                         minexptime = 0.5,
114                                         maxexptime = 1.5,
115                                         minsize = 0,
116                                         maxsize = 0,
117                                         --attached = player,
118                                         collisiondetection = true,
119                                         collision_removal = true,
120                                         vertical = false,
121                                         node = {name= item.."node"},
122                                         --texture = "eat_particles_1.png"
123                                 })
124
125
126                                 if eating_timer + dtime > 0.25 then
127                                         minetest.sound_play("eat", {
128                                                 to_player = player:get_player_name(),
129                                                 gain = 1.0,  -- default
130                                                 pitch = math.random(60,100)/100,
131                                         })
132                                         eating_timer = 0
133                                 end
134                                 
135                                 if eating + dtime >= 1 then
136                                         local stack = player:get_wielded_item()
137                                         stack:take_item(1)
138                                         minetest.eat_food(player,item)
139                                         eating = 0
140                                         minetest.sound_play("eat_finish", {
141                                                 to_player = player:get_player_name(),
142                                                 gain = 0.2,  -- default
143                                                 pitch = math.random(60,85)/100,
144                                         })
145                                 end
146                                 
147                                 meta:set_float("eating_timer", eating_timer)
148                                 meta:set_float("eating", eating)
149                         else
150                                 local meta = player:get_meta()
151                                 meta:set_float("eating", 0)
152                                 meta:set_float("eating_timer", 0)
153                                 
154                         end
155                 else
156                         local meta = player:get_meta()
157                         meta:set_float("eating", 0)
158                         meta:set_float("eating_timer", 0)
159                 end
160                 
161         end
162 end)