]> git.lizzy.rs Git - Crafter.git/blob - mods/player/player_mechanics.lua
Adjust player physics for better movement feel
[Crafter.git] / mods / player / player_mechanics.lua
1 local player_state_channel = minetest.mod_channel_join("player.player_movement_state")
2
3 minetest.register_on_modchannel_message(function(channel_name, sender, message)
4         if channel_name == "player.player_movement_state" then
5                 local player = minetest.get_player_by_name(sender)
6                 local meta = player:get_meta()
7                 meta:set_string("player.player_movement_state", message)
8         end
9 end)
10
11 minetest.register_on_joinplayer(function(player)
12         player:set_physics_override({jump=1.25,gravity=1.25})
13 end)
14
15 minetest.register_globalstep(function(dtime)
16         for _,player in ipairs(minetest.get_connected_players()) do
17                 local meta = player:get_meta()
18                 
19                 local running = (meta:get_string("player.player_movement_state") == "1")
20                 local bunny_hopping = (meta:get_string("player.player_movement_state") == "2")
21                 local sneaking = (meta:get_string("player.player_movement_state") == "3")
22                 
23                 --print(running, bunny_hopping)
24                 
25                 
26                 --running FOV modifier
27                 if running or bunny_hopping then
28                         local fov = player:get_fov()
29                         if fov == 0 then
30                                 fov = 1
31                         end
32
33                         if fov+dtime < 1.2 then
34                                 player:set_fov(fov + dtime, true)
35                         elseif fov-dtime > 1.2 then
36                                 player:set_fov(fov - dtime, true)
37                         elseif fov+dtime > 1.2 then
38                                 player:set_fov(1.2, true)
39                         end
40                         if bunny_hopping == true then
41                                 player:set_physics_override({speed=1.75})
42                         else
43                                 player:set_physics_override({speed=1.5})
44                         end
45                 else
46                         local meta = player:get_meta()
47                         local fov = player:get_fov()
48                         if fov-dtime > 1 then
49                                 player:set_fov(fov - dtime, true)
50                         elseif fov-dtime < 1 then
51                                 player:set_fov(1, true)
52                         end
53                         
54                         player:set_physics_override({speed=1})
55                         --meta:set_float("running_timer", 0)
56                 end
57                 
58                 --sneaking
59                 if sneaking then
60                         player:set_eye_offset({x=0,y=-1,z=0},{x=0,y=-1,z=0})
61                 else
62                         player:set_eye_offset({x=0,y=0,z=0},{x=0,y=0,z=0})
63                 end
64                 
65                 --remember to implement hunger
66                 
67                 --eating
68                 if player:get_player_control().RMB then
69                         local health = player:get_wielded_item():get_definition().health
70                         if health then
71                                 local meta = player:get_meta()
72                                 local eating = meta:get_float("eating")
73                                 local eating_timer = meta:get_float("eating_timer")
74                                 
75                                 eating = eating + dtime
76                                 eating_timer = eating_timer + dtime
77                                 
78                                 local ps = minetest.add_particlespawner({
79                                         amount = 30,
80                                         time = 0.00001,
81                                         minpos = {x=-0.2, y=-1.5, z=0.5},
82                                         maxpos = {x=0.2, y=1.7, z=0.5},
83                                         minvel = vector.new(-0.5,0,-0.5),
84                                         maxvel = vector.new(0.5,0,0.5),
85                                         minacc = {x=0, y=-9.81, z=1},
86                                         maxacc = {x=0, y=-9.81, z=1},
87                                         minexptime = 0.5,
88                                         maxexptime = 1.5,
89                                         minsize = 0.5,
90                                         maxsize = 1,
91                                         attached = player,
92                                         collisiondetection = true,
93                                         collision_removal = true,
94                                         vertical = false,
95                                         texture = "eat_particles_1.png"
96                                 })
97                                 
98                                 if eating_timer + dtime > 0.25 then
99                                         minetest.sound_play("eat", {
100                                                 to_player = player:get_player_name(),
101                                                 gain = 1.0,  -- default
102                                                 pitch = math.random(60,100)/100,
103                                         })
104                                         eating_timer = 0
105                                 end
106                                 
107                                 if eating + dtime >= 1 then
108                                         local stack = player:get_wielded_item()
109                                         stack:take_item(1)
110                                         player:set_wielded_item(stack)
111                                         player:set_hp(player:get_hp() + health)
112                                         eating = 0
113                                         minetest.sound_play("eat_finish", {
114                                                 to_player = player:get_player_name(),
115                                                 gain = 0.2,  -- default
116                                                 pitch = math.random(60,85)/100,
117                                         })
118                                 end
119                                 
120                                 meta:set_float("eating_timer", eating_timer)
121                                 meta:set_float("eating", eating)
122                         else
123                                 local meta = player:get_meta()
124                                 meta:set_float("eating", 0)
125                                 meta:set_float("eating_timer", 0)
126                                 
127                         end
128                 else
129                         local meta = player:get_meta()
130                         meta:set_float("eating", 0)
131                         meta:set_float("eating_timer", 0)
132                 end
133                 
134         end
135 end)