]> git.lizzy.rs Git - Crafter.git/commitdiff
Add in better sleeping
authoroilboi <47129783+oilboi@users.noreply.github.com>
Thu, 25 Jun 2020 08:50:07 +0000 (04:50 -0400)
committeroilboi <47129783+oilboi@users.noreply.github.com>
Thu, 25 Jun 2020 08:50:07 +0000 (04:50 -0400)
mods/bed/init.lua
mods/bed/textures/sleep.png [new file with mode: 0644]
mods/client_version_checker/init.lua
mods/player_api/init.lua
mods/player_api/models/player.b3d
mods/player_api/models/player.blend
mods/player_mechanics/player_interaction.lua

index 94c97629526f5f1ecc1c5d7753a772928e0e5601..db2348c5df401ab988bc40e7e14ab42a0630c587 100644 (file)
---remember to delete spawnpoint when bed removed
-
 local mod_storage = minetest.get_mod_storage()
 local time_night = {begin = 19000, ending = 5500}
+local sleep_channel = {}
+local time_since_last_check = (minetest.get_us_time()/1000000)-0.5 --minus half a second
+local pool = {}
 
---node boxes are from mineclone2
-local function create_spawnpoint(pos,clicker)
-       local time = minetest.get_timeofday() * 24000
-       
-       if time > time_night.begin or time < time_night.ending then
-               local name = clicker:get_player_name()
-               local string_pos = minetest.pos_to_string(pos)
-               mod_storage:set_string(name, string_pos)
-               minetest.chat_send_player(name, "Your respawn point has been set!")
-               minetest.set_timeofday(time_night.ending/24000)
-       else
-               minetest.chat_send_player(clicker:get_player_name(), "You can only sleep at night!")
+
+minetest.register_on_joinplayer(function(player)
+       name = player:get_player_name()
+       sleep_channel[name] = minetest.mod_channel_join(name..":sleep_channel")
+end)
+
+local name
+local function csm_send_player_to_sleep(player)
+       name = player:get_player_name()
+       sleep_channel[name]:send_all("1")
+end
+
+local name
+local function csm_wake_player_up(player)
+       name = player:get_player_name()
+       sleep_channel[name]:send_all("0")
+end
+
+minetest.register_on_modchannel_message(function(channel_name, sender, message)
+       local channel_decyphered = channel_name:gsub(sender,"")
+       if channel_decyphered == ":sleep_channel" then
+               if pool[sender] then
+                       pool[sender].sleeping = true
+               end
        end
+end)
+
+local name
+local wake_up = function(player)
+       name = player:get_player_name()
+       player_is_sleeping(player,false)
+       player:set_eye_offset({x=0,y=0,z=0},{x=0,y=0,z=0})
+       pool[name] = nil
+       minetest.close_formspec(name, "bed")
+       csm_wake_player_up(player)
 end
 
---delete player spawnpoint if remove bed
-local function remove_spawnpoint(pos,clicker)
-       local name = clicker:get_player_name()
-       local string_pos = mod_storage:get_string(name)
-       if string_pos ~= "" then
-               local pos2 = minetest.string_to_pos(string_pos)
-               if vector.equals(pos,pos2) then
-                       mod_storage:set_string(name, "")
-                       minetest.chat_send_player(name, "Your respawn point has been removed!")
+local function global_sleep_check()
+       --cancel the extra loops
+       if minetest.get_us_time()/1000000 - time_since_last_check < 0.5 then
+               return
+       end
+       time_since_last_check = minetest.get_us_time()/1000000
+
+       local sleep_table = {}
+       for _,player in ipairs(minetest.get_connected_players()) do
+               local name = player:get_player_name()
+               sleep_table[name] = true
+       end
+
+       local bed_count = 0
+
+       for name,data in pairs(pool) do
+               local player = minetest.get_player_by_name(name)
+               if player then
+                       bed_count = bed_count + 1
+                       if data.sleeping then
+                               sleep_table[name] = nil
+                       end
+                       if data.pos then
+                               player:move_to(data.pos)
+                       end
+               else
+                       pool[name] = nil
+               end
+       end
+
+       local count = 0
+       for name,val in pairs(sleep_table) do
+               count = count + 1
+       end
+       
+       if count == 0 then
+               minetest.set_timeofday(time_night.ending/24000)
+               for _,player in ipairs(minetest.get_connected_players()) do
+                       wake_up(player)
                end
+               return
+       end
+
+       if bed_count > 0 then
+               minetest.after(0.5,function()
+                       global_sleep_check()
+               end)
        end
 end
 
---try to send the player to their bed
-minetest.register_on_respawnplayer(function(player)
-       local name = player:get_player_name()
-       local string_pos = mod_storage:get_string(name)
-       if string_pos ~= "" then
-               local pos = minetest.string_to_pos(string_pos)
-               player:set_pos(pos)
-               return(true)
+
+
+local bed_gui = "size[16,12]"..
+"position[0.5,0.5]"..
+"bgcolor[#00000000]"..
+"button[5.5,8.5;5,2;button;leave bed]"
+
+local yaw_translation = {
+       [0] = math.pi,
+       [1] = math.pi/2,
+       [2] = 0,
+       [3] = math.pi*1.5,
+}
+
+local name
+local do_sleep = function(player,pos,dir)
+
+       local time = minetest.get_timeofday() * 24000
+       name = player:get_player_name()
+       --if time < time_night.begin and time > time_night.ending then
+       --      minetest.chat_send_player(name, "You can only sleep at night")
+       --      return
+       --end
+       local real_dir = minetest.facedir_to_dir(dir)
+       player:add_player_velocity(vector.multiply(player:get_player_velocity(),-1))
+       local new_pos = vector.subtract(pos,vector.divide(real_dir,2))
+       player:move_to(new_pos)
+       player:set_look_vertical(0)
+       player:set_look_horizontal(yaw_translation[dir])
+       
+       minetest.show_formspec(name, "bed", bed_gui)
+
+       player_is_sleeping(player,true)
+       set_player_animation(player,"lay",0,false)
+       player:set_eye_offset({x=0,y=-12,z=-10},{x=0,y=0,z=0})
+
+       pool[name] = {pos=new_pos,sleeping=false}
+
+       csm_send_player_to_sleep(player)
+
+       global_sleep_check()
+end
+
+minetest.register_on_player_receive_fields(function(player, formname, fields)
+       if formname and formname == "bed" then
+               wake_up(player)
        end
 end)
+
+
+minetest.register_on_respawnplayer(function(player)
+       wake_up(player)
+end)
+
 --these are beds
 minetest.register_node("bed:bed", {
     description = "Bed",
@@ -53,23 +157,16 @@ minetest.register_node("bed:bed", {
     drawtype = "nodebox",
        node_placement_prediction = "",
        on_place = function(itemstack, placer, pointed_thing)
-               
                if not pointed_thing.type == "node" then
                        return
                end
-               
-               
                local sneak = placer:get_player_control().sneak
                local noddef = minetest.registered_nodes[minetest.get_node(pointed_thing.under).name]
                if not sneak and noddef.on_rightclick then
                        minetest.item_place(itemstack, placer, pointed_thing)
                        return
                end
-               
-               
-               
                local _,pos = minetest.item_place_node(ItemStack("bed:bed_front"), placer, pointed_thing)
-               
                if pos then
                        local param2 = minetest.get_node(pos).param2
                        local pos2 = vector.add(pos, vector.multiply(minetest.facedir_to_dir(param2),-1))
@@ -117,8 +214,8 @@ minetest.register_node("bed:bed_front", {
                local obj = minetest.add_item(pos, "bed:bed")
                minetest.remove_node(pos)
                minetest.remove_node(vector.add(pos,facedir))
-               remove_spawnpoint(pos,digger)
-               remove_spawnpoint(vector.add(pos,facedir),digger)
+               --remove_spawnpoint(pos,digger)
+               --remove_spawnpoint(vector.add(pos,facedir),digger)
                minetest.punch_node(vector.new(pos.x,pos.y+1,pos.z))
        end,
        on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
@@ -126,7 +223,10 @@ minetest.register_node("bed:bed_front", {
                        tnt(pos,10)
                        return
                end
-               create_spawnpoint(pos,clicker)
+
+               local param2 = minetest.get_node(pos).param2
+               
+               do_sleep(clicker,pos,param2)
        end,
 })
 
@@ -154,8 +254,8 @@ minetest.register_node("bed:bed_back", {
                local obj = minetest.add_item(pos, "bed:bed")
                minetest.remove_node(pos)
                minetest.remove_node(vector.add(pos,facedir))
-               remove_spawnpoint(pos,digger)
-               remove_spawnpoint(vector.add(pos,facedir),digger)
+               --remove_spawnpoint(pos,digger)
+               --remove_spawnpoint(vector.add(pos,facedir),digger)
                minetest.punch_node(vector.new(pos.x,pos.y+1,pos.z))
        end,
        on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
@@ -163,12 +263,17 @@ minetest.register_node("bed:bed_back", {
                        tnt(pos,10)
                        return
                end
+
                local param2 = minetest.get_node(pos).param2
-               local facedir = minetest.facedir_to_dir(param2) 
-               create_spawnpoint(vector.add(pos,facedir),clicker)
+               local dir = minetest.facedir_to_dir(param2)     
+
+               do_sleep(clicker,vector.add(pos,dir),param2)
        end,
 })
 
+
+
+
 minetest.register_craft({
        output = "bed:bed",
        recipe = {
diff --git a/mods/bed/textures/sleep.png b/mods/bed/textures/sleep.png
new file mode 100644 (file)
index 0000000..5862038
Binary files /dev/null and b/mods/bed/textures/sleep.png differ
index a8640a126e8555ffb763fdab9fc8803241b4f4b0..560fdf6697b2cf55411c53bb4b39c39aad104353 100644 (file)
@@ -5,7 +5,7 @@ local client_version_channels = {}
 
 --I needed to add in a dev cycle to adopt for a decimal place error
 local current_development_cycle = "alpha"
-local current_version = 0.05010
+local current_version = 0.05011
 
 minetest.register_on_joinplayer(function(player)
        local name = player:get_player_name()
index 9219167a8fa56526102d3233a128e95cec1e8849..7e0c30f48200a983699aa7e22971211cc016aa62 100644 (file)
@@ -84,6 +84,7 @@ local set_all_properties = function(player)
        temp_pool.stepheight   = player_constant.stepheight
        temp_pool.visual_size  = player_constant.visual_size
        temp_pool.attached     = false
+       temp_pool.sleeping     = false
        player:set_properties(temp_pool)
 end
 
@@ -151,6 +152,17 @@ player_is_attached = function(player,truth)
        pool[name].attached = truth
 end
 
+local name
+player_is_sleeping = function(player,truth)
+       name = player:get_player_name()
+       pool[name].sleeping = truth
+end
+
+local name
+get_if_player_sleeping = function(player)
+       name = player:get_player_name()
+       return(pool[name].sleeping)
+end
 
 
 -- toggles nametag visibility
@@ -364,7 +376,7 @@ local do_animations = function(player)
 
        if player:get_hp() <= 0 then
                set_animation(player,"die",40,false)
-       elseif not temp_pool.attached or not player:get_attach() then
+       elseif not temp_pool.sleeping and (not temp_pool.attached or not player:get_attach()) then
                temp_pool.attached = false
                update = control_check(player,control_table)
                update_wield_item(player)
index c2f119674af58af1ab92766b61364e794564cda9..d3008d1251a437bdd33f7f1c265916d842d6d70a 100644 (file)
Binary files a/mods/player_api/models/player.b3d and b/mods/player_api/models/player.b3d differ
index 530f9eb4a1ad1d1ac8b296b5476c2afb0da436ad..7285d32772c6be8aa4a96210fe0cb5a80681dc11 100644 (file)
Binary files a/mods/player_api/models/player.blend and b/mods/player_api/models/player.blend differ
index c8bf41fe0e728726ca25f546fdf6da3e2f182949..66e6c0c68abea4bc6c275d35872875ccdb7b9344 100644 (file)
@@ -267,7 +267,9 @@ minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch,
                elseif modify_output then
                        hurt = 0
                end
+
                player:add_player_velocity(dir)
+
                player:set_hp(hp-hurt)
        end
 end)