diff --git a/minetestforfun_game/mods/beds/functions.lua b/minetestforfun_game/mods/beds/functions.lua index f57a3765..ea9cf93b 100755 --- a/minetestforfun_game/mods/beds/functions.lua +++ b/minetestforfun_game/mods/beds/functions.lua @@ -181,13 +181,27 @@ minetest.register_on_joinplayer(function(player) beds.read_spawns() end) --- respawn player at bed if enabled and valid position is found -minetest.register_on_respawnplayer(function(player) - --MFF DEBUT crabman(8/01/2016 ) respawn player in special area(event) if a spawn is set. - if ((minetest.get_modpath("areas") ~= nil) and (areas:onRespawn(player))) then - return true - end +local dead_players = {} +local have_areas_mod = false +if (minetest.get_modpath("areas") ~= nil) and areas.getSpawn then + have_areas_mod = true +end + + +local function teleport_player(player, clear) + local name = player:get_player_name() + if not name or name == "" then return false end + if have_areas_mod and dead_players[name] ~= nil then + local pos = areas:getSpawn(dead_players[name]) + if clear then + dead_players[name] = nil + end + if pos then + player:setpos(pos) + return true + end + end if not enable_respawn then return false end @@ -197,8 +211,31 @@ minetest.register_on_respawnplayer(function(player) player:setpos(pos) return true end + --if not areas or bed spawnpoint, tp to the spawn + local spawn = minetest.string_to_pos(minetest.setting_get("static_spawnpoint") or "0,0,0") + player:setpos(spawn) + return false +end + + +minetest.register_on_dieplayer(function(player) + local name = player:get_player_name() + if not name or name == "" then return end + if have_areas_mod then + local pos = player:getpos() + if pos then + dead_players[name] = pos + end + end + minetest.after(0.20, teleport_player, player) -- tp after all others on_dieplayer callback otherwise their pos is wrong end) +-- respawn player at bed if enabled and valid position is found +minetest.register_on_respawnplayer(function(player) + return teleport_player(player, true) +end) + + minetest.register_on_leaveplayer(function(player) local name = player:get_player_name() lay_down(player, nil, nil, false, true) diff --git a/mods/areas/api.lua b/mods/areas/api.lua index 44874dfc..d6f758d9 100755 --- a/mods/areas/api.lua +++ b/mods/areas/api.lua @@ -162,32 +162,13 @@ function areas:canMakeArea(pos1, pos2, name) --MFF crabman(25/02/2016) fix areas end ---MFF DEBUT crabman(17/09/2015 ) respawn player in special area(event) if a spawn is set. +--MFF crabman(5/03/2016 ) return special area pos if a spawn is set. --1 party (2 party in beds mod) -local dead_players = {} -minetest.register_on_dieplayer(function(player) - local player_name = player:get_player_name() - if not player_name then return end - local pos = player:getpos() - if pos then - dead_players[player_name] = pos - end -end) - - -function areas:onRespawn(player) - local player_name = player:get_player_name() - if not player_name or not dead_players[player_name] then return false end - local pos = dead_players[player_name] - dead_players[player_name] = nil - if pos then - for _, area in pairs(areas:getAreasAtPos(pos)) do - if area.spawn then - player:setpos(area.spawn) - return true - end +function areas:getSpawn(pos) + for _, area in pairs(areas:getAreasAtPos(pos)) do + if area.spawn and area.spawn.x then + return area.spawn end end - return false + return nil end ---FIN diff --git a/mods/item_drop/init.lua b/mods/item_drop/init.lua index dfb54db5..9e54705a 100755 --- a/mods/item_drop/init.lua +++ b/mods/item_drop/init.lua @@ -4,36 +4,6 @@ local creative_mode = minetest.setting_getbool("creative_mode") local TICK_UPDATE = 0.1 -local die_timeout = 20 -local die_time = {} -local die_respawned = {} - -minetest.register_on_joinplayer(function(player) - local player_name = player:get_player_name() - die_time[player_name] = 0 - die_respawned[player_name] = false -end) - -minetest.register_on_leaveplayer(function(player) - local player_name = player:get_player_name() - die_time[player_name] = nil - die_respawned[player_name] = nil -end) - -minetest.register_on_dieplayer(function(player) - local player_name = player:get_player_name() - if not player_name then return end - die_respawned[player_name] = false - die_time[player_name] = die_timeout -end) - -minetest.register_on_respawnplayer(function(player) - local player_name = player:get_player_name() - if not player_name then return end - die_respawned[player_name] = true -end) - - -- Following edits by gravgun item_drop.drop_callbacks = {} @@ -67,83 +37,76 @@ local pickup_inv_duration = 1/pickup_duration*0.7 local function tick() local tstamp = minetest.get_us_time() for _,player in ipairs(minetest.get_connected_players()) do - local player_name = player:get_player_name() - if die_time[player_name] and die_time[player_name] < 1 then - if player:get_hp() > 0 or not enable_damage then - local pos = player:getpos() - pos.y = pos.y + player_half_height - local inv = player:get_inventory() + if player:get_hp() > 0 or not enable_damage then + local pos = player:getpos() + pos.y = pos.y + player_half_height + local inv = player:get_inventory() - if inv then - for _,object in ipairs(minetest.get_objects_inside_radius(pos, scan_range)) do - local luaEnt = object:get_luaentity() - if luaEnt and luaEnt.name == "__builtin:item" then - local ticky = luaEnt.item_drop_min_tstamp - if ticky then - if tstamp >= ticky then - luaEnt.item_drop_min_tstamp = nil - end - elseif not luaEnt.item_drop_nopickup then - -- Point-line distance computation, heavily simplified since the wanted line, - -- being the player, is completely upright (no variation on X or Z) - local pos2 = object:getpos() - -- No sqrt, avoid useless computation - -- (just take the radius, compare it to the square of what you want) - -- Pos order doesn't really matter, we're squaring the result - -- (but don't change it, we use the cached values afterwards) - local dX = pos.x-pos2.x - local dZ = pos.z-pos2.z - local playerDistance = dX*dX+dZ*dZ - if playerDistance <= pickup_range_squared then - local itemStack = ItemStack(luaEnt.itemstring) - if inv:room_for_item("main", itemStack) then - local vec = {x=dX, y=pos.y-pos2.y, z=dZ} - vec.x = vec.x*pickup_inv_duration - vec.y = vec.y*pickup_inv_duration - vec.z = vec.z*pickup_inv_duration - object:setvelocity(vec) - luaEnt.physical_state = false - luaEnt.object:set_properties({ - physical = false - }) - -- Mark the object as already picking up - luaEnt.item_drop_nopickup = true + if inv then + for _,object in ipairs(minetest.get_objects_inside_radius(pos, scan_range)) do + local luaEnt = object:get_luaentity() + if luaEnt and luaEnt.name == "__builtin:item" then + local ticky = luaEnt.item_drop_min_tstamp + if ticky then + if tstamp >= ticky then + luaEnt.item_drop_min_tstamp = nil + end + elseif not luaEnt.item_drop_nopickup then + -- Point-line distance computation, heavily simplified since the wanted line, + -- being the player, is completely upright (no variation on X or Z) + local pos2 = object:getpos() + -- No sqrt, avoid useless computation + -- (just take the radius, compare it to the square of what you want) + -- Pos order doesn't really matter, we're squaring the result + -- (but don't change it, we use the cached values afterwards) + local dX = pos.x-pos2.x + local dZ = pos.z-pos2.z + local playerDistance = dX*dX+dZ*dZ + if playerDistance <= pickup_range_squared then + local itemStack = ItemStack(luaEnt.itemstring) + if inv:room_for_item("main", itemStack) then + local vec = {x=dX, y=pos.y-pos2.y, z=dZ} + vec.x = vec.x*pickup_inv_duration + vec.y = vec.y*pickup_inv_duration + vec.z = vec.z*pickup_inv_duration + object:setvelocity(vec) + luaEnt.physical_state = false + luaEnt.object:set_properties({ + physical = false + }) + -- Mark the object as already picking up + luaEnt.item_drop_nopickup = true - minetest.after(pickup_duration, function() - local lua = luaEnt - if object == nil or lua == nil or lua.itemstring == nil then - return + minetest.after(pickup_duration, function() + local lua = luaEnt + if object == nil or lua == nil or lua.itemstring == nil then + return + end + if inv:room_for_item("main", itemStack) then + inv:add_item("main", itemStack) + if luaEnt.itemstring ~= "" then + minetest.sound_play("item_drop_pickup", {pos = pos, gain = 0.3, max_hear_distance = 8}) end - if inv:room_for_item("main", itemStack) then - inv:add_item("main", itemStack) - if luaEnt.itemstring ~= "" then - minetest.sound_play("item_drop_pickup", {pos = pos, gain = 0.3, max_hear_distance = 8}) - end - luaEnt.itemstring = "" - object:remove() - for i, cb in ipairs(item_drop.pickup_callbacks) do - cb(player, itemstack) - end - else - object:setvelocity({x = 0,y = 0,z = 0}) - luaEnt.physical_state = true - luaEnt.object:set_properties({ - physical = true - }) - luaEnt.item_drop_nopickup = nil + luaEnt.itemstring = "" + object:remove() + for i, cb in ipairs(item_drop.pickup_callbacks) do + cb(player, itemstack) end - end) - end + else + object:setvelocity({x = 0,y = 0,z = 0}) + luaEnt.physical_state = true + luaEnt.object:set_properties({ + physical = true + }) + luaEnt.item_drop_nopickup = nil + end + end) end end end end end end - else - if die_respawned[player_name] then - die_time[player_name] = (die_time[player_name] or die_timeout) - TICK_UPDATE - end end end minetest.after(TICK_UPDATE, tick)