Chance to areas-style corestone finding.
parent
8c8bff8e9d
commit
fb9c275aec
|
@ -1,4 +1,5 @@
|
|||
kingdoms.corestone = {}
|
||||
kingdoms.db.corestones = kingdoms.db.corestones or {}
|
||||
-- Any mod can set this flag since they run in one thread.
|
||||
kingdoms.show_protection_messages = true
|
||||
-- Helper function to set the message display state.
|
||||
|
@ -6,13 +7,22 @@ function kingdoms.spm(s)
|
|||
kingdoms.show_protection_messages = s
|
||||
end
|
||||
|
||||
function kingdoms.near_pos(r, pos)
|
||||
local ret = {}
|
||||
for k,v in pairs(kingdoms.db.corestones) do
|
||||
local a = {x = v.x - r, y = v.y - r, z = v.z - r}
|
||||
local b = {x = v.x + r, y = v.y + r, z = v.z + r}
|
||||
if pos.x >= a.x and pos.x <= b.x and pos.y >= a.y and pos.y <= b.y and pos.z >= a.z and pos.z <= b.z then
|
||||
table.insert(ret, v)
|
||||
end
|
||||
end
|
||||
return ret
|
||||
end
|
||||
|
||||
function kingdoms.can_dig(r, pos, name)
|
||||
if not name or not pos then return false end
|
||||
local kingdom = kingdoms.player.kingdom(name)
|
||||
local positions = minetest.find_nodes_in_area(
|
||||
{x = pos.x - r, y = pos.y - r, z = pos.z - r},
|
||||
{x = pos.x + r, y = pos.y + r, z = pos.z + r},
|
||||
{"kingdoms:corestone", "kingdoms:servercorestone"})
|
||||
local positions = kingdoms.near_pos(r, pos)
|
||||
for _, pos in ipairs(positions) do
|
||||
local nodename = minetest.get_node(pos).name
|
||||
-- If this is the server spawn, nobody can dig here.
|
||||
|
@ -70,10 +80,7 @@ end
|
|||
|
||||
function kingdoms.bypos(pos, radius)
|
||||
local r = radius or kingdoms.config.corestone_radius
|
||||
local positions = minetest.find_nodes_in_area(
|
||||
{x = pos.x - r, y = pos.y - r, z = pos.z - r},
|
||||
{x = pos.x + r, y = pos.y + r, z = pos.z + r},
|
||||
{"kingdoms:corestone"})
|
||||
local positions = kingdoms.near_pos(r, pos)
|
||||
for _, pos in ipairs(positions) do
|
||||
local meta = minetest.get_meta(pos)
|
||||
if kingdoms.db.kingdoms[meta:get_string("kingdom.id")] then
|
||||
|
@ -179,6 +186,8 @@ minetest.register_node("kingdoms:corestone", {
|
|||
return itemstack
|
||||
end
|
||||
|
||||
kingdoms.db.corestones[minetest.pos_to_string(pointed_thing.above)] = pointed_thing.above
|
||||
|
||||
kingdom.corestone.pos = pointed_thing.above
|
||||
kingdom.corestone.placed = os.time()
|
||||
kingdoms.log("action", ("Corestone of '%s' placed at %s."):format(kingdom.longname, minetest.pos_to_string(pointed_thing.above)))
|
||||
|
@ -200,6 +209,7 @@ minetest.register_node("kingdoms:corestone", {
|
|||
end,
|
||||
|
||||
on_destruct = function(pos)
|
||||
kingdoms.db.corestones[minetest.pos_to_string(pos)] = nil
|
||||
local kingdom = kingdoms.bycspos(pos)
|
||||
if not kingdom then return end
|
||||
kingdom.corestone.pos = nil
|
||||
|
@ -315,6 +325,8 @@ minetest.register_node("kingdoms:servercorestone", {
|
|||
return itemstack
|
||||
end
|
||||
|
||||
kingdoms.db.corestones[minetest.pos_to_string(pointed_thing.above)] = pointed_thing.above
|
||||
|
||||
kingdoms.db.servercorestone = pointed_thing.above
|
||||
|
||||
return minetest.item_place(itemstack, placer, pointed_thing)
|
||||
|
@ -330,6 +342,7 @@ minetest.register_node("kingdoms:servercorestone", {
|
|||
end,
|
||||
|
||||
on_destruct = function(pos)
|
||||
kingdoms.db.corestones[minetest.pos_to_string(pos)] = nil
|
||||
kingdoms.db.servercorestone = nil
|
||||
end,
|
||||
|
||||
|
|
|
@ -30,7 +30,7 @@ kingdoms.config.default_level_doors = 1 -- Open locked doors within the coreston
|
|||
kingdoms.config.default_level_talk = 1 -- Talk in the kingdom's main channel.
|
||||
|
||||
-- A corestone extends in a radius of <corestone_radius>.
|
||||
kingdoms.config.corestone_radius = 5
|
||||
kingdoms.config.corestone_radius = 32
|
||||
kingdoms.config.corestone_overlap_multiplier = 4
|
||||
-- A corestone can be placed only above <corestone_miny>.
|
||||
kingdoms.config.corestone_miny = -32
|
||||
|
|
|
@ -58,6 +58,8 @@ minetest.register_node("kingdoms:silverblock", {
|
|||
sounds = default.node_sound_stone_defaults(),
|
||||
})
|
||||
|
||||
kingdoms.register_dungeon_node("kingdoms:silverblock", 2)
|
||||
|
||||
minetest.register_craftitem("kingdoms:silver_lump", {
|
||||
description = "Silver Lump",
|
||||
inventory_image = "kingdoms_silver_lump.png",
|
||||
|
|
|
@ -7,45 +7,59 @@ minetest.register_on_mapgen_init(function(params)
|
|||
-- Biomes won't be registered properly until done manually.
|
||||
default.register_biomes()
|
||||
default.register_decorations()
|
||||
magic.register_mapgen()
|
||||
end)
|
||||
|
||||
-- Dungeons
|
||||
local items = kingdoms.utils.probability_list({
|
||||
local registered_items = {}
|
||||
function kingdoms.register_dungeon_node(name, probability)
|
||||
registered_items[name] = math.ceil((probability or 3) * 100)
|
||||
end
|
||||
|
||||
local defaultitems = {
|
||||
["default:mese"] = 1,
|
||||
["default:diamondblock"] = 1,
|
||||
|
||||
["default:goldblock"] = 2,
|
||||
["default:copperblock"] = 2,
|
||||
|
||||
["kingdoms:silverblock"] = 3,
|
||||
|
||||
["default:bronzeblock"] = 3,
|
||||
["default:steelblock"] = 3,
|
||||
|
||||
["default:obsidian"] = 3,
|
||||
["default:coalblock"] = 3,
|
||||
})
|
||||
}
|
||||
|
||||
for k,v in pairs(defaultitems) do
|
||||
kingdoms.register_dungeon_node(k, v)
|
||||
end
|
||||
|
||||
local function place_item(tab)
|
||||
local pos = tab[math.random(1, (#tab or 4))]
|
||||
pos.y = pos.y - 1
|
||||
local n = core.get_node_or_nil(pos)
|
||||
if n and n.name ~= "air" then
|
||||
pos.y = pos.y + 1
|
||||
local name = items[math.random(1, #items)]
|
||||
--Failsafe
|
||||
if minetest.registered_nodes[name] then
|
||||
core.set_node(pos, {name = name})
|
||||
else
|
||||
kingdoms.log("warning", "Tried to place unregistered node "..name.." in dungeon.")
|
||||
end
|
||||
end
|
||||
local items = kingdoms.utils.probability_list(registered_items)
|
||||
local pos = tab[math.random(1, (#tab or 4))]
|
||||
pos.y = pos.y - 1
|
||||
local n = core.get_node_or_nil(pos)
|
||||
if n and n.name ~= "air" then
|
||||
pos.y = pos.y + 1
|
||||
local name = items[math.random(1, #items)]
|
||||
--Failsafe
|
||||
if minetest.registered_nodes[name] then
|
||||
core.set_node(pos, {name = name})
|
||||
else
|
||||
kingdoms.log("warning", "Tried to place unregistered node "..name.." in dungeon.")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
core.set_gen_notify("dungeon")
|
||||
core.register_on_generated(function(minp, maxp, blockseed)
|
||||
local ntf = core.get_mapgen_object("gennotify")
|
||||
if ntf and ntf.dungeon and #ntf.dungeon > 0 then
|
||||
core.after(3, place_item, table.copy(ntf.dungeon))
|
||||
end
|
||||
local ntf = core.get_mapgen_object("gennotify")
|
||||
if ntf and ntf.dungeon and #ntf.dungeon > 0 then
|
||||
core.after(3, place_item, table.copy(ntf.dungeon))
|
||||
if math.random(1, 100) < 25 then
|
||||
core.after(3, place_item, table.copy(ntf.dungeon))
|
||||
end
|
||||
if math.random(1, 100) < 25 then
|
||||
core.after(3, place_item, table.copy(ntf.dungeon))
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
|
|
@ -5,7 +5,7 @@ minetest.register_globalstep(function(dtime)
|
|||
timer = timer + dtime
|
||||
if timer < 0.1 then return end
|
||||
timer = 0
|
||||
|
||||
|
||||
for _, player in pairs(minetest.get_connected_players()) do
|
||||
local name = player:get_player_name()
|
||||
local pos = vector.round(player:getpos())
|
||||
|
|
|
@ -29,3 +29,19 @@ minetest.register_craft({
|
|||
output = "magic:null_essence 3",
|
||||
recipe = {"group:minor_essence", "default:gold_ingot", "group:minor_essence"},
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "magic:nightcall",
|
||||
recipe = {
|
||||
{"magic:area_essence", "group:spellbinding", ""},
|
||||
{"default:bronzeblock", "magic:calm_essence", "magic:control_essence"},
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "magic:daypull",
|
||||
recipe = {
|
||||
{"magic:area_essence", "group:spellbinding", ""},
|
||||
{"default:bronzeblock", "magic:rage_essence", "magic:control_essence"},
|
||||
},
|
||||
})
|
||||
|
|
|
@ -7,7 +7,7 @@ magic.crystals = {
|
|||
fuel = 500,
|
||||
ores = {
|
||||
{
|
||||
rarity = 10 * 10 * 10,
|
||||
rarity = 4 * 4 * 4,
|
||||
clust_num_ores = 1,
|
||||
clust_size = 1,
|
||||
wherein = "default:lava_source",
|
||||
|
@ -54,18 +54,18 @@ magic.crystals = {
|
|||
light = 5,
|
||||
ores = {
|
||||
{
|
||||
rarity = 10 * 10 * 10,
|
||||
rarity = 4 * 4 * 4,
|
||||
clust_num_ores = 1,
|
||||
clust_size = 1,
|
||||
wherein = "default:water_source",
|
||||
y_max = -64,
|
||||
y_max = -128,
|
||||
},
|
||||
{
|
||||
rarity = 16 * 16 * 16,
|
||||
clust_num_ores = 1,
|
||||
clust_size = 1,
|
||||
wherein = "default:water_source",
|
||||
y_min = -32,
|
||||
y_min = -128,
|
||||
y_max = -8,
|
||||
},
|
||||
},
|
||||
|
@ -105,6 +105,8 @@ for _,def in ipairs(magic.crystals) do
|
|||
sounds = default.node_sound_stone_defaults(),
|
||||
})
|
||||
|
||||
minetest.after(0.01, function() kingdoms.register_dungeon_node("magic:crystal_"..def.name, 3 / #magic.crystals) end)
|
||||
|
||||
minetest.register_craftitem("magic:"..def.name.."_essence", {
|
||||
description = def.desc.." Essence",
|
||||
inventory_image = "magic_essence.png^[colorize:"..def.color..":"..tostring(0xCC),
|
||||
|
|
|
@ -26,5 +26,6 @@ domodfile("crystals.lua")
|
|||
domodfile("spells.lua")
|
||||
domodfile("crafts.lua")
|
||||
domodfile("timegens.lua")
|
||||
domodfile("mapgen.lua")
|
||||
|
||||
magic.log("action", "Loaded.")
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
function magic.register_mapgen()
|
||||
minetest.register_decoration({
|
||||
deco_type = "simple",
|
||||
place_on = {"default:dirt_with_grass"},
|
||||
sidelen = 80,
|
||||
fill_ratio = 0.001,
|
||||
biomes = {"rainforest", "deciduous_forest", "coniferous_forest"},
|
||||
y_min = 1,
|
||||
y_max = 31000,
|
||||
decoration = "magic:crystal_vitality",
|
||||
})
|
||||
end
|
Binary file not shown.
After Width: | Height: | Size: 3.5 KiB |
|
@ -1,7 +1,7 @@
|
|||
minetest.register_node("magic:nightcall", {
|
||||
description = "Nightcall",
|
||||
tiles = {"magic_nightcall.png"},
|
||||
groups = {cracky = 1, level = 2},
|
||||
groups = {cracky = 1},
|
||||
after_place_node = function(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:get_inventory():set_size("input", 1)
|
||||
|
@ -47,3 +47,54 @@ minetest.register_node("magic:nightcall", {
|
|||
return stack:get_count()
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_node("magic:daypull", {
|
||||
description = "Daypull",
|
||||
tiles = {"magic_daypull.png"},
|
||||
groups = {cracky = 1},
|
||||
after_place_node = function(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:get_inventory():set_size("input", 1)
|
||||
meta:get_inventory():set_size("output", 6)
|
||||
meta:set_string("formspec", [[
|
||||
size[8,7]
|
||||
label[0,0.1;Input null essences during the day to produce day essences.]
|
||||
list[context;input;0,1;1,1;]
|
||||
list[context;output;2,1;6,1;]
|
||||
list[current_player;main;0,3;8,4;]
|
||||
]])
|
||||
end,
|
||||
on_metadata_inventory_put = function(pos, listname, index, stack, player)
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:get_inventory():set_list("input", {})
|
||||
local leftover = meta:get_inventory():add_item("output", "magic:day_essence "..tostring(stack:get_count()))
|
||||
minetest.add_item(vector.add(pos, {x=0, y=1, z=0}), leftover)
|
||||
end,
|
||||
allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
|
||||
return 0
|
||||
end,
|
||||
allow_metadata_inventory_put = function(pos, listname, index, stack, player)
|
||||
local tod = minetest.get_timeofday()
|
||||
if listname ~= "input" then return 0 end
|
||||
if stack:get_name() ~= "magic:null_essence" then
|
||||
return 0
|
||||
end
|
||||
if not kingdoms.player.canpos(pos, player:get_player_name(), "devices") then
|
||||
minetest.chat_send_player(player:get_player_name(), "You cannot use this device.")
|
||||
return 0
|
||||
end
|
||||
if tod < 0.2 or tod > 0.805 then
|
||||
minetest.chat_send_player(player:get_player_name(), "It is not day.")
|
||||
return 0
|
||||
end
|
||||
return stack:get_count()
|
||||
end,
|
||||
allow_metadata_inventory_take = function(pos, listname, index, stack, player)
|
||||
if not kingdoms.player.canpos(pos, player:get_player_name(), "devices") then
|
||||
minetest.chat_send_player(player:get_player_name(), "You cannot use this device.")
|
||||
return 0
|
||||
end
|
||||
return stack:get_count()
|
||||
end,
|
||||
})
|
||||
|
||||
|
|
Loading…
Reference in New Issue