-local player_state_channel = minetest.mod_channel_join("player.player_movement_state")
+local player_state_channels = {}
minetest.register_on_modchannel_message(function(channel_name, sender, message)
- if channel_name == "player.player_movement_state" then
+ local channel_decyphered = channel_name:gsub(sender,"")
+ if sender ~= "" and channel_decyphered == ":player_movement_state" then
local player = minetest.get_player_by_name(sender)
local meta = player:get_meta()
meta:set_string("player.player_movement_state", message)
end
end)
+local send_running_cancellation = function(player,sneaking)
+ local name = player:get_player_name()
+ player_state_channels[name]:send_all(minetest.serialize({stop_running=true,state=sneaking}))
+end
+
minetest.register_on_joinplayer(function(player)
+ local name = player:get_player_name()
+ player_state_channels[name] = minetest.mod_channel_join(name..":player_movement_state")
player:set_physics_override({jump=1.25,gravity=1.25})
local meta = player:get_meta()
meta:set_string("player.player_movement_state", "0")
+ meta:set_string("player.old_player_movement_state", "0")
+end)
+
+minetest.register_on_dieplayer(function(player)
+ local meta = player:get_meta()
+ meta:set_string("player.player_movement_state", "0")
+ send_running_cancellation(player,sneaking)
end)
minetest.register_globalstep(function(dtime)
for _,player in ipairs(minetest.get_connected_players()) do
local meta = player:get_meta()
-
local hunger = meta:get_int("hunger")
+ local state = meta:get_string("player.player_movement_state")
+ local old_state = meta:get_string("player.old_player_movement_state")
- local running = (meta:get_string("player.player_movement_state") == "1")
- local bunny_hopping = (meta:get_string("player.player_movement_state") == "2")
- local sneaking = (meta:get_string("player.player_movement_state") == "3")
-
- --print(running, bunny_hopping)
-
-
- --running FOV modifier
- if hunger > 6 and (running or bunny_hopping) then
- player:set_fov(1.25, true,0.15)
-
- if bunny_hopping == true then
- --player:set_fov(1.45, true,0.15)
- player:set_physics_override({speed=1.75})
+ if state ~= old_state or ((state == "1" or state == "2") and hunger <= 6) then
+ local running = (state == "1")
+ local bunny_hopping = (state == "2")
+ local sneaking = (state == "3")
+
+ --running FOV modifier
+ if hunger > 6 and (running or bunny_hopping) then
+ player:set_fov(1.25, true,0.15)
+
+ if bunny_hopping == true then
+ --player:set_fov(1.45, true,0.15)
+ player:set_physics_override({speed=1.75})
+ else
+ --player:set_fov(1.25, true,0.15)
+ player:set_physics_override({speed=1.5})
+ end
+ elseif not (running or bunny_hopping) and (old_state == "1" or old_state == "2") then
+ player:set_fov(1, true,0.15)
+ player:set_physics_override({speed=1})
+ send_running_cancellation(player,sneaking) --preserve network data
+ end
+
+ --sneaking
+ if sneaking then
+ --player:set_fov(0.8, true,0.1)
+ player:set_eye_offset({x=0,y=-1,z=0},{x=0,y=-1,z=0})
else
- --player:set_fov(1.25, true,0.15)
- player:set_physics_override({speed=1.5})
+ player:set_eye_offset({x=0,y=0,z=0},{x=0,y=0,z=0})
end
- else
- player:set_fov(1, true,0.15)
- player:set_physics_override({speed=1})
- --meta:set_float("running_timer", 0)
- end
-
- --sneaking
- if sneaking then
- --player:set_fov(0.8, true,0.1)
- player:set_eye_offset({x=0,y=-1,z=0},{x=0,y=-1,z=0})
- else
- player:set_eye_offset({x=0,y=0,z=0},{x=0,y=0,z=0})
end
-
- --remember to implement hunger
+
+ meta:set_string("player.old_player_movement_state", state)
--eating
if player:get_player_control().RMB then
pos.y = pos.y + 1.625
end
- local dir = vector.multiply(player:get_look_dir(),0.5)
-
+ local dir = vector.multiply(player:get_look_dir(),0.3)
local newpos = vector.add(pos,dir)
+ local vel = player:get_player_velocity()
+
local ps = minetest.add_particlespawner({
- amount = 30,
+ amount = 6,
time = 0.00001,
- minpos = {x=newpos.x-0.2, y=newpos.y+0.2, z=newpos.z-0.2},
- maxpos = {x=newpos.x+0.2, y=newpos.y-0.2, z=newpos.z+0.2},
- minvel = vector.new(-0.5,0,-0.5),
- maxvel = vector.new(0.5,0,0.5),
+ minpos = {x=newpos.x-0.1, y=newpos.y-0.1, z=newpos.z-0.1},
+ maxpos = {x=newpos.x+0.1, y=newpos.y-0.3, z=newpos.z+0.1},
+ minvel = vector.new(vel.x-0.5,0.2,vel.z-0.5),
+ maxvel = vector.new(vel.x+0.5,0.6,vel.z+0.5),
minacc = {x=0, y=-9.81, z=1},
maxacc = {x=0, y=-9.81, z=1},
minexptime = 0.5,