-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 running or bunny_hopping then
- local fov = player:get_fov()
- if fov == 0 then
- fov = 1
- end
+ 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")
- if fov+dtime < 1.2 then
- player:set_fov(fov + dtime, true)
- elseif fov-dtime > 1.2 then
- player:set_fov(fov - dtime, true)
- elseif fov+dtime > 1.2 then
- player:set_fov(1.2, true)
+ --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
- if bunny_hopping == true then
- player:set_physics_override({speed=1.75})
+
+ --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_physics_override({speed=1.5})
+ player:set_eye_offset({x=0,y=0,z=0},{x=0,y=0,z=0})
end
- else
- local meta = player:get_meta()
- local fov = player:get_fov()
- if fov-dtime > 1 then
- player:set_fov(fov - dtime, true)
- elseif fov-dtime < 1 then
- player:set_fov(1, true)
- end
-
- player:set_physics_override({speed=1})
- --meta:set_float("running_timer", 0)
end
-
- --sneaking
- if sneaking then
- 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
- local health = player:get_wielded_item():get_definition().health
- if health then
- local meta = player:get_meta()
+
+ local item = player:get_wielded_item():get_name()
+ local satiation = minetest.get_item_group(item, "satiation")
+ local hunger = minetest.get_item_group(item, "hunger")
+
+ local meta = player:get_meta()
+ if meta:get_int("hunger") == 20 then
+ return
+ end
+
+ if hunger > 0 and satiation > 0 then
local eating = meta:get_float("eating")
local eating_timer = meta:get_float("eating_timer")
eating = eating + dtime
eating_timer = eating_timer + dtime
+ local pos = player:get_pos()
+
+ if sneaking then
+ pos.y = pos.y + 1.425
+ else
+ pos.y = pos.y + 1.625
+ end
+
+ 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=-0.2, y=-1.5, z=0.5},
- maxpos = {x=0.2, y=1.7, z=0.5},
- 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,
maxexptime = 1.5,
- minsize = 0.5,
- maxsize = 1,
- attached = player,
+ minsize = 0,
+ maxsize = 0,
+ --attached = player,
collisiondetection = true,
collision_removal = true,
vertical = false,
- texture = "eat_particles_1.png"
+ node = {name= item.."node"},
+ --texture = "eat_particles_1.png"
})
-
+
+
if eating_timer + dtime > 0.25 then
minetest.sound_play("eat", {
to_player = player:get_player_name(),
if eating + dtime >= 1 then
local stack = player:get_wielded_item()
stack:take_item(1)
- player:set_wielded_item(stack)
- player:set_hp(player:get_hp() + health)
+ minetest.eat_food(player,item)
eating = 0
minetest.sound_play("eat_finish", {
to_player = player:get_player_name(),