Chance to areas-style corestone finding.

master
Beha 2017-01-05 10:13:30 -05:00
parent 8c8bff8e9d
commit fb9c275aec
11 changed files with 148 additions and 37 deletions

View File

@ -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,

View File

@ -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

View File

@ -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",

View File

@ -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)

View File

@ -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())

View File

@ -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"},
},
})

View File

@ -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),

View File

@ -26,5 +26,6 @@ domodfile("crystals.lua")
domodfile("spells.lua")
domodfile("crafts.lua")
domodfile("timegens.lua")
domodfile("mapgen.lua")
magic.log("action", "Loaded.")

12
magic/mapgen.lua Normal file
View File

@ -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

View File

@ -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,
})