]> git.lizzy.rs Git - Crafter.git/blobdiff - mods/player/player_mechanics.lua
Optimize some locals
[Crafter.git] / mods / player / player_mechanics.lua
index 3b6dc0c73363bbdfb46b09686f4b90e9ad28a07a..62b8f9df4ac9b393c43984b61a183c1e50e7321a 100644 (file)
-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(),
@@ -109,8 +135,7 @@ minetest.register_globalstep(function(dtime)
                                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(),