X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=mods%2Fplayer%2Fplayer_mechanics.lua;h=62b8f9df4ac9b393c43984b61a183c1e50e7321a;hb=f05d44e3f65ef86f9d123cbbbeade2f440f71f81;hp=3b6dc0c73363bbdfb46b09686f4b90e9ad28a07a;hpb=cd7b2409ff37df5c3d14ef1119c30d67b1e61dbd;p=Crafter.git diff --git a/mods/player/player_mechanics.lua b/mods/player/player_mechanics.lua index 3b6dc0c..62b8f9d 100644 --- a/mods/player/player_mechanics.lua +++ b/mods/player/player_mechanics.lua @@ -1,102 +1,128 @@ -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(),