]> git.lizzy.rs Git - Crafter.git/blobdiff - mods/player/player_mechanics.lua
Optimize some locals
[Crafter.git] / mods / player / player_mechanics.lua
index 7781a133e8be6a4005aeec3a57710896c5320b61..62b8f9df4ac9b393c43984b61a183c1e50e7321a 100644 (file)
@@ -1,58 +1,73 @@
-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
@@ -81,17 +96,18 @@ minetest.register_globalstep(function(dtime)
                                        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,