1 local player_state_channels = {}
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)
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}))
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")
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)
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")
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")
44 --running FOV modifier
45 if hunger > 6 and (running or bunny_hopping) then
46 player:set_fov(1.25, true,0.15)
48 if bunny_hopping == true then
49 --player:set_fov(1.45, true,0.15)
50 player:set_physics_override({speed=1.75})
52 --player:set_fov(1.25, true,0.15)
53 player:set_physics_override({speed=1.5})
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
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})
66 player:set_eye_offset({x=0,y=0,z=0},{x=0,y=0,z=0})
70 meta:set_string("player.old_player_movement_state", state)
73 if player:get_player_control().RMB then
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")
79 local meta = player:get_meta()
80 if meta:get_int("hunger") == 20 then
84 if hunger > 0 and satiation > 0 then
85 local eating = meta:get_float("eating")
86 local eating_timer = meta:get_float("eating_timer")
88 eating = eating + dtime
89 eating_timer = eating_timer + dtime
91 local pos = player:get_pos()
99 local dir = vector.multiply(player:get_look_dir(),0.3)
100 local newpos = vector.add(pos,dir)
102 local vel = player:get_player_velocity()
104 local ps = minetest.add_particlespawner({
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},
118 collisiondetection = true,
119 collision_removal = true,
121 node = {name= item.."node"},
122 --texture = "eat_particles_1.png"
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,
135 if eating + dtime >= 1 then
136 local stack = player:get_wielded_item()
138 minetest.eat_food(player,item)
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,
147 meta:set_float("eating_timer", eating_timer)
148 meta:set_float("eating", eating)
150 local meta = player:get_meta()
151 meta:set_float("eating", 0)
152 meta:set_float("eating_timer", 0)
156 local meta = player:get_meta()
157 meta:set_float("eating", 0)
158 meta:set_float("eating_timer", 0)