Merge master into testing
|
@ -10,3 +10,4 @@ local modpath = minetest.get_modpath("mcl_beds")
|
|||
dofile(modpath .. "/functions.lua")
|
||||
dofile(modpath .. "/api.lua")
|
||||
dofile(modpath .. "/beds.lua")
|
||||
dofile(modpath .. "/respawn_anchor.lua")
|
|
@ -2,4 +2,4 @@ name = mcl_beds
|
|||
author = BlockMen
|
||||
description =
|
||||
depends = playerphysics
|
||||
optional_depends = mcl_sounds, mcl_worlds, mcl_wool, mcl_dye, mcl_explosions, mcl_weather, mcl_spawn, doc
|
||||
optional_depends = mcl_sounds, mcl_worlds, mcl_wool, mcl_dye, mcl_explosions, mcl_weather, mcl_spawn, doc, mcl_nether
|
|
@ -0,0 +1,172 @@
|
|||
--TODO: Add sounds for the respawn anchor
|
||||
|
||||
--Nether ends at y -29077
|
||||
--Nether roof at y -28933
|
||||
|
||||
|
||||
minetest.register_node("mcl_beds:respawn_anchor",{
|
||||
description="respawn anchor",
|
||||
tiles = {
|
||||
"respawn_anchor_top_off.png",
|
||||
"respawn_anchor_bottom.png",
|
||||
"respawn_anchor_side0.png"
|
||||
},
|
||||
drawtype = "nodebox",
|
||||
node_box= { --Reused the composter nodebox, since it is basicly the same
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.5, -0.375, 0.5, 0.5}, -- Left wall
|
||||
{ 0.375, -0.5, -0.5, 0.5, 0.5, 0.5}, -- Right wall
|
||||
{-0.375, -0.5, 0.375, 0.375, 0.5, 0.5}, -- Back wall
|
||||
{-0.375, -0.5, -0.5, 0.375, 0.5, -0.375}, -- Front wall
|
||||
{-0.5, -0.5, -0.5, 0.5, -0.47, 0.5}, -- Bottom level, -0.47 because -0.5 is so low that you can see the texture of the block below through
|
||||
}
|
||||
},
|
||||
on_rightclick = function(pos, node, player, itemstack)
|
||||
if itemstack.get_name(itemstack) == "mcl_nether:glowstone" then
|
||||
minetest.set_node(pos, {name="mcl_beds:respawn_anchor_charged_1"})
|
||||
itemstack:take_item()
|
||||
else
|
||||
if pos.y < -29077 or pos.y > -28933 then
|
||||
mcl_explosions.explode(pos, 5, {drop_chance = 0, fire = true})
|
||||
end
|
||||
end
|
||||
end,
|
||||
groups = {pickaxey=1, material_stone=1},
|
||||
_mcl_hardness = 22.5
|
||||
})
|
||||
minetest.register_node("mcl_beds:respawn_anchor_charged_1",{
|
||||
description="respawn anchor",
|
||||
tiles = {
|
||||
"portal.png",
|
||||
"respawn_anchor_bottom.png",
|
||||
"respawn_anchor_side1.png"
|
||||
},
|
||||
drawtype = "nodebox",
|
||||
node_box= { --Reused the composter nodebox, since it is basicly the same
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.5, -0.375, 0.5, 0.5}, -- Left wall
|
||||
{ 0.375, -0.5, -0.5, 0.5, 0.5, 0.5}, -- Right wall
|
||||
{-0.375, -0.5, 0.375, 0.375, 0.5, 0.5}, -- Back wall
|
||||
{-0.375, -0.5, -0.5, 0.375, 0.5, -0.375}, -- Front wall
|
||||
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, -- Bottom level
|
||||
}
|
||||
},
|
||||
on_rightclick = function(pos, node, player, itemstack)
|
||||
if itemstack.get_name(itemstack) == "mcl_nether:glowstone" then
|
||||
minetest.set_node(pos, {name="mcl_beds:respawn_anchor_charged_2"})
|
||||
itemstack:take_item()
|
||||
else
|
||||
if pos.y < -29077 or pos.y > -28933 then
|
||||
mcl_explosions.explode(pos, 5, {drop_chance = 0, fire = true})
|
||||
else
|
||||
mcl_spawn.set_spawn_pos(player, pos, nil)
|
||||
end
|
||||
end
|
||||
end,
|
||||
groups = {pickaxey=1, material_stone=1, not_in_creative_inventory=1},
|
||||
_mcl_hardness = 22.5
|
||||
})
|
||||
|
||||
minetest.register_node("mcl_beds:respawn_anchor_charged_2",{
|
||||
description="respawn anchor",
|
||||
tiles = {
|
||||
"portal.png",
|
||||
"respawn_anchor_bottom.png",
|
||||
"respawn_anchor_side2.png"
|
||||
},
|
||||
drawtype = "nodebox",
|
||||
node_box= { --Reused the composter nodebox, since it is basicly the same
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.5, -0.375, 0.5, 0.5}, -- Left wall
|
||||
{ 0.375, -0.5, -0.5, 0.5, 0.5, 0.5}, -- Right wall
|
||||
{-0.375, -0.5, 0.375, 0.375, 0.5, 0.5}, -- Back wall
|
||||
{-0.375, -0.5, -0.5, 0.375, 0.5, -0.375}, -- Front wall
|
||||
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, -- Bottom level
|
||||
}
|
||||
},
|
||||
on_rightclick = function(pos, node, player, itemstack)
|
||||
if itemstack.get_name(itemstack) == "mcl_nether:glowstone" then
|
||||
minetest.set_node(pos, {name="mcl_beds:respawn_anchor_charged_3"})
|
||||
itemstack:take_item()
|
||||
else
|
||||
if pos.y < -29077 or pos.y > -28933 then
|
||||
mcl_explosions.explode(pos, 5, {drop_chance = 0, fire = true})
|
||||
else
|
||||
mcl_spawn.set_spawn_pos(player, pos, nil)
|
||||
end
|
||||
end
|
||||
end,
|
||||
groups = {pickaxey=1, material_stone=1, not_in_creative_inventory=1},
|
||||
_mcl_hardness = 22.5
|
||||
})
|
||||
|
||||
minetest.register_node("mcl_beds:respawn_anchor_charged_3",{
|
||||
description="respawn anchor",
|
||||
tiles = {
|
||||
"portal.png",
|
||||
"respawn_anchor_bottom.png",
|
||||
"respawn_anchor_side3.png"
|
||||
},
|
||||
drawtype = "nodebox",
|
||||
node_box= { --Reused the composter nodebox, since it is basicly the same
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.5, -0.375, 0.5, 0.5}, -- Left wall
|
||||
{ 0.375, -0.5, -0.5, 0.5, 0.5, 0.5}, -- Right wall
|
||||
{-0.375, -0.5, 0.375, 0.375, 0.5, 0.5}, -- Back wall
|
||||
{-0.375, -0.5, -0.5, 0.375, 0.5, -0.375}, -- Front wall
|
||||
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, -- Bottom level
|
||||
}
|
||||
},
|
||||
on_rightclick = function(pos, node, player, itemstack)
|
||||
if itemstack.get_name(itemstack) == "mcl_nether:glowstone" then
|
||||
minetest.set_node(pos, {name="mcl_beds:respawn_anchor_charged_4"})
|
||||
itemstack:take_item()
|
||||
else
|
||||
if pos.y < -29077 or pos.y > -28933 then
|
||||
mcl_explosions.explode(pos, 5, {drop_chance = 0, fire = true})
|
||||
else
|
||||
mcl_spawn.set_spawn_pos(player, pos, nil)
|
||||
end
|
||||
end
|
||||
end,
|
||||
groups = {pickaxey=1, material_stone=1, not_in_creative_inventory=1},
|
||||
_mcl_hardness = 22.5
|
||||
})
|
||||
|
||||
minetest.register_node("mcl_beds:respawn_anchor_charged_4",{
|
||||
description="respawn anchor",
|
||||
tiles = {
|
||||
"portal.png",
|
||||
"respawn_anchor_bottom.png",
|
||||
"respawn_anchor_side4.png"
|
||||
},
|
||||
drawtype = "nodebox",
|
||||
node_box= { --Reused the composter nodebox, since it is basicly the same
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.5, -0.375, 0.5, 0.5}, -- Left wall
|
||||
{ 0.375, -0.5, -0.5, 0.5, 0.5, 0.5}, -- Right wall
|
||||
{-0.375, -0.5, 0.375, 0.375, 0.5, 0.5}, -- Back wall
|
||||
{-0.375, -0.5, -0.5, 0.375, 0.5, -0.375}, -- Front wall
|
||||
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, -- Bottom level
|
||||
}
|
||||
},
|
||||
on_rightclick = function(pos, node, player, itemstack)
|
||||
if pos.y < -29077 or pos.y > -28933 then
|
||||
mcl_explosions.explode(pos, 5, {drop_chance = 0, fire = true})
|
||||
else
|
||||
mcl_spawn.set_spawn_pos(player, pos, nil)
|
||||
end
|
||||
end,
|
||||
groups = {pickaxey=1, material_stone=1, not_in_creative_inventory=1},
|
||||
_mcl_hardness = 22.5
|
||||
})
|
||||
|
||||
minetest.register_craft({ output = "mcl_beds:respawn_anchor",
|
||||
recipe = { {"mcl_core:crying_obsidian", "mcl_core:crying_obsidian", "mcl_core:crying_obsidian"},
|
||||
{"mcl_nether:glowstone", "mcl_nether:glowstone", "mcl_nether:glowstone"},
|
||||
{"mcl_core:crying_obsidian", "mcl_core:crying_obsidian", "mcl_core:crying_obsidian"} } })
|
After Width: | Height: | Size: 6.9 KiB |
After Width: | Height: | Size: 6.4 KiB |
After Width: | Height: | Size: 6.6 KiB |
After Width: | Height: | Size: 6.7 KiB |
After Width: | Height: | Size: 6.7 KiB |
After Width: | Height: | Size: 6.7 KiB |
After Width: | Height: | Size: 6.7 KiB |
After Width: | Height: | Size: 6.4 KiB |
|
@ -77,8 +77,7 @@ minetest.register_node("mcl_nether:netheriteblock", {
|
|||
sounds = mcl_sounds.node_sound_stone_defaults(),
|
||||
_mcl_blast_resistance = 1200,
|
||||
_mcl_hardness = 50,
|
||||
_mcl_silk_touch_drop = true,
|
||||
_mcl_fortune_drop = mcl_core.fortune_drop_ore
|
||||
_mcl_silk_touch_drop = true
|
||||
})
|
||||
|
||||
-- For eternal fire on top of netherrack and magma blocks
|
||||
|
|
|
@ -452,10 +452,60 @@ function mcl_spawn.get_player_spawn_pos(player)
|
|||
if bgroup ~= 1 and bgroup ~= 2 then
|
||||
-- Bed is destroyed:
|
||||
if player and player:is_player() then
|
||||
player:get_meta():set_string("mcl_beds:spawn", "")
|
||||
|
||||
local function split(s, delimiter) --this is just a common function to split strings, since it is way harder to do in lua like in python, java etc.
|
||||
result = {};
|
||||
for match in (s..delimiter):gmatch("(.-)"..delimiter) do
|
||||
table.insert(result, match);
|
||||
end
|
||||
return result;
|
||||
end
|
||||
s = split(player:get_meta():get_string("mcl_beds:spawn"), ",")
|
||||
x = nil
|
||||
y = nil
|
||||
z = nil
|
||||
for key, value in pairs(s) do
|
||||
if key == 1 then
|
||||
value = value:sub(2)
|
||||
x = tonumber(value)
|
||||
else
|
||||
if key == 2 then
|
||||
y = tonumber(value)
|
||||
else
|
||||
if key == 3 then
|
||||
value = value:sub(1, -2)
|
||||
z = tonumber(value)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
checkblock = {x = x, y = y, z = z}
|
||||
|
||||
if minetest.get_node(checkblock).name == "mcl_beds:respawn_anchor_charged_1" then
|
||||
minetest.set_node(checkblock, {name="mcl_beds:respawn_anchor"})
|
||||
player:set_pos(checkblock)
|
||||
else
|
||||
if minetest.get_node(checkblock).name == "mcl_beds:respawn_anchor_charged_2" then
|
||||
minetest.set_node(checkblock, {name="mcl_beds:respawn_anchor_charged_1"})
|
||||
player:set_pos(checkblock)
|
||||
else
|
||||
if minetest.get_node(checkblock).name == "mcl_beds:respawn_anchor_charged_3" then
|
||||
minetest.set_node(checkblock, {name="mcl_beds:respawn_anchor_charged_2"})
|
||||
player:set_pos(checkblock)
|
||||
else
|
||||
if minetest.get_node(checkblock).name == "mcl_beds:respawn_anchor_charged_4" then
|
||||
minetest.set_node(checkblock, {name="mcl_beds:respawn_anchor_charged_3"})
|
||||
player:set_pos(checkblock)
|
||||
else
|
||||
player:get_meta():set_string("mcl_beds:spawn", "")
|
||||
minetest.chat_send_player(player:get_player_name(), S("Your spawn bed was missing or blocked, and you had no charged respawn anchor"))
|
||||
return mcl_spawn.get_world_spawn_pos(), false
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
minetest.chat_send_player(player:get_player_name(), S("Your spawn bed was missing or blocked."))
|
||||
return mcl_spawn.get_world_spawn_pos(), false
|
||||
end
|
||||
|
||||
-- Find spawning position on/near the bed free of solid or damaging blocks iterating a square spiral 15x15:
|
||||
|
@ -531,4 +581,4 @@ minetest.after(respawn_search_initial_delay, function()
|
|||
storage:set_int("mcl_spawn_dir_step", dir_step)
|
||||
storage:set_int("mcl_spawn_dir_ind", dir_ind)
|
||||
end)
|
||||
end)
|
||||
end)
|