From 3b5ea31c28e516f500a59c7b74ebdcfb804649b2 Mon Sep 17 00:00:00 2001 From: Beha Date: Wed, 4 Jan 2017 14:41:23 -0500 Subject: [PATCH] Add worldgen beginnings and materialized_walls --- kingdoms/barriers.lua | 70 ++++++++++++++++++++ kingdoms/corestone.lua | 69 +++++++++---------- kingdoms/crafts.lua | 3 + kingdoms/defaults.lua | 8 +++ kingdoms/gen.lua | 49 ++++++++++++++ kingdoms/init.lua | 1 + kingdoms/textures/kingdoms_materialized.png | Bin 0 -> 728 bytes kingdoms/textures/kingdoms_materializer.png | Bin 0 -> 729 bytes kingdoms/utils.lua | 12 +++- magic/depends.txt | 1 + magic/init.lua | 10 +++ 11 files changed, 183 insertions(+), 40 deletions(-) create mode 100644 kingdoms/barriers.lua create mode 100644 kingdoms/textures/kingdoms_materialized.png create mode 100644 kingdoms/textures/kingdoms_materializer.png create mode 100644 magic/depends.txt create mode 100644 magic/init.lua diff --git a/kingdoms/barriers.lua b/kingdoms/barriers.lua new file mode 100644 index 0000000..4ec21b0 --- /dev/null +++ b/kingdoms/barriers.lua @@ -0,0 +1,70 @@ +minetest.register_node("kingdoms:materializer", { + description = "Materializer", + drawtype = "nodebox", + tiles = {"kingdoms_materializer.png"}, + sounds = default.node_sound_stone_defaults(), + groups = {oddly_breakable_by_hand = 2}, + is_ground_content = false, + paramtype = "light", + light_source = 0, + + node_box = { + type = "fixed", + fixed = { + {-0.5 ,-0.5, -0.5, 0.5, 0.5, 0.5}, + } + }, +}) + +for level = 1, kingdoms.config.materialized_levels do + local first = (level == 1) + local last = (level == kingdoms.config.materialized_levels) + local drop = {} + -- If this is the first level, it should drop something instead of downgrading. + if first then + drop = nil + end + minetest.register_node("kingdoms:materialized_wall_"..tostring(level), { + description = "Materializer Wall Level "..tostring(level), + drawtype = "nodebox", + tiles = {"kingdoms_materialized.png"}, + sounds = default.node_sound_stone_defaults(), + -- Only include the first and last in the creative inventory. + groups = {cracky = 1, level = 2, not_in_creative_inventory = ((first or last) and 0 or 1), kingdoms_materialized_up=(last and 0 or 1)}, + is_ground_content = false, + paramtype = "light", + light_source = 0, + drop = drop, + level = level, + node_box = { + type = "fixed", + fixed = { + {-0.5 ,-0.5, -0.5, 0.5, 0.5, 0.5}, + } + }, + on_destruct = function(pos) + if not first then + minetest.after(0, minetest.set_node, pos, {name="kingdoms:materialized_wall_"..tostring(level - 1)}) + end + end, + }) +end + +minetest.register_abm{ + nodenames = {"group:kingdoms_materialized_up"}, + interval = kingdoms.config.materialized_abm_interval, + chance = kingdoms.config.materialized_abm_chance, + action = function(pos, node) + local nextname = "kingdoms:materialized_wall_"..tostring(minetest.registered_nodes[node.name].level + 1) + local r = kingdoms.config.materializer_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:materializer"}) + for _, mpos in ipairs(positions) do + -- local meta = minetest.get_meta(mpos) + minetest.swap_node(pos, {name=nextname}) + return + end + end, +} diff --git a/kingdoms/corestone.lua b/kingdoms/corestone.lua index 0ff4292..5899481 100644 --- a/kingdoms/corestone.lua +++ b/kingdoms/corestone.lua @@ -127,7 +127,7 @@ minetest.register_node("kingdoms:corestone", { drawtype = "nodebox", tiles = {"kingdoms_corestone.png"}, sounds = default.node_sound_stone_defaults(), - groups = {oddly_breakable_by_hand = 2, unbreakable = 1}, + groups = {oddly_breakable_by_hand = 2, unbreakable = 1, kingdom_infotext = 1}, is_ground_content = false, paramtype = "light", light_source = 0, @@ -147,25 +147,25 @@ minetest.register_node("kingdoms:corestone", { if not placer or pointed_thing.type ~= "node" then return itemstack end - + local kingdom = kingdoms.player.kingdom(placer:get_player_name()) if not kingdom or not kingdoms.player.can(placer:get_player_name(), "corestone") then minetest.chat_send_player(placer:get_player_name(), "You cannot place a corestone if you are not of sufficient level in a kingdom.") return itemstack end - + if kingdom.corestone.pos then minetest.chat_send_player(placer:get_player_name(), "You cannot place a corestone if the kingdom already has a corestone placed.") return itemstack end - + if pointed_thing.under.y < kingdoms.config.corestone_miny then minetest.chat_send_player(placer:get_player_name(), ("You cannot place a corestone below %d."):format(kingdoms.config.corestone_miny)) return itemstack end - + local radius = kingdoms.config.corestone_radius * kingdoms.config.corestone_overlap_multiplier - + kingdoms.spm(false) local cantplace = not kingdoms.can_dig(radius, pointed_thing.under, placer:get_player_name()) or not kingdoms.can_dig(radius, pointed_thing.above, placer:get_player_name()) local cantplaceward = not kingdoms.check_claimward(kingdoms.config.corestone_radius, pointed_thing.above, placer:get_player_name()) or not kingdoms.check_claimward(kingdoms.config.corestone_radius, pointed_thing.under, placer:get_player_name()) @@ -178,11 +178,11 @@ minetest.register_node("kingdoms:corestone", { minetest.chat_send_player(placer:get_player_name(), "You cannot place a corestone this close to an opposing claim ward.") return itemstack end - + 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))) - + return minetest.item_place(itemstack, placer, pointed_thing) end, @@ -190,16 +190,15 @@ minetest.register_node("kingdoms:corestone", { local kingdom = kingdoms.player.kingdom(placer:get_player_name()) local meta = minetest.get_meta(pos) meta:set_string("kingdom.id", kingdom.id) - build_infotext(pos, "Corestone") end, - + can_dig = function(pos, digger) local akingdom = kingdoms.bycspos(pos) local pkingdom = kingdoms.player.kingdom(digger:get_player_name()) -- Can only dig if this is the digger's kingdom and he has enough levels. return not akingdom or (pkingdom and pkingdom.id == akingdom.id and kingdoms.player.can(digger:get_player_name(), "corestone")) end, - + on_destruct = function(pos) local kingdom = kingdoms.bycspos(pos) if not kingdom then return end @@ -216,19 +215,12 @@ minetest.register_node("kingdoms:corestone", { end, }) -minetest.register_abm{ - nodenames = {"kingdoms:corestone"}, - interval = 1, - chance = 1, - action = function(pos) build_infotext(pos, "Corestone") end, -} - minetest.register_node("kingdoms:claimward", { description = "Claim Ward", drawtype = "nodebox", tiles = {"kingdoms_claimward.png"}, sounds = default.node_sound_stone_defaults(), - groups = {oddly_breakable_by_hand = 2, unbreakable = 1}, + groups = {oddly_breakable_by_hand = 2, unbreakable = 1, kingdom_infotext = 1}, is_ground_content = false, paramtype = "light", light_source = 0, @@ -244,15 +236,15 @@ minetest.register_node("kingdoms:claimward", { if not placer or pointed_thing.type ~= "node" then return itemstack end - + local kingdom = kingdoms.player.kingdom(placer:get_player_name()) if not kingdom then minetest.chat_send_player(placer:get_player_name(), "You cannot place a ward if you are not a member of a kingdom.") return itemstack end - + local radius = kingdoms.config.corestone_radius - + kingdoms.spm(false) local cantplace = not kingdoms.can_dig(radius, pointed_thing.under, placer:get_player_name()) or not kingdoms.can_dig(radius, pointed_thing.above, placer:get_player_name()) kingdoms.spm(true) @@ -260,7 +252,7 @@ minetest.register_node("kingdoms:claimward", { minetest.chat_send_player(placer:get_player_name(), "You cannot place a ward this close to another corestone.") return itemstack end - + return minetest.item_place(itemstack, placer, pointed_thing) end, @@ -268,17 +260,9 @@ minetest.register_node("kingdoms:claimward", { local kingdom = kingdoms.player.kingdom(placer:get_player_name()) local meta = minetest.get_meta(pos) meta:set_string("kingdom.id", kingdom.id) - build_infotext(pos, "Claim ward") end, }) -minetest.register_abm{ - nodenames = {"kingdoms:claimward"}, - interval = 1, - chance = 1, - action = function(pos) build_infotext(pos, "Claim ward") end, -} - minetest.register_node("kingdoms:servercorestone", { description = "Server Core", drawtype = "nodebox", @@ -304,20 +288,20 @@ minetest.register_node("kingdoms:servercorestone", { if not placer or pointed_thing.type ~= "node" then return itemstack end - + if not minetest.check_player_privs(placer:get_player_name(), {server = true}) then minetest.chat_send_player(placer:get_player_name(), "You cannot place a server corestone. How did you even get it?") return itemstack end - + if kingdoms.db.servercorestone then minetest.chat_send_player(placer:get_player_name(), "You cannot place a server corestone if there is already one placed.") return itemstack end - + -- Even the server corestone cannot overlap already existent corestones. local radius = kingdoms.config.corestone_radius * kingdoms.config.corestone_overlap_multiplier - + kingdoms.spm(false) local cantplace = not kingdoms.can_dig(radius, pointed_thing.under, placer:get_player_name()) or not kingdoms.can_dig(radius, pointed_thing.above, placer:get_player_name()) local cantplaceward = not kingdoms.check_claimward(kingdoms.config.corestone_radius, pointed_thing.above, placer:get_player_name()) or not kingdoms.check_claimward(kingdoms.config.corestone_radius, pointed_thing.under, placer:get_player_name()) @@ -330,9 +314,9 @@ minetest.register_node("kingdoms:servercorestone", { minetest.chat_send_player(placer:get_player_name(), "You cannot place a corestone this close to an opposing claim ward.") return itemstack end - + kingdoms.db.servercorestone = pointed_thing.above - + return minetest.item_place(itemstack, placer, pointed_thing) end, @@ -340,12 +324,19 @@ minetest.register_node("kingdoms:servercorestone", { local meta = minetest.get_meta(pos) meta:set_string("infotext", "Server Spawn") end, - + can_dig = function(pos, digger) return minetest.check_player_privs(digger:get_player_name(), {server = true}) end, - + on_destruct = function(pos) kingdoms.db.servercorestone = nil end, }) + +minetest.register_abm{ + nodenames = {"group:kingdom_infotext"}, + interval = 1, + chance = 1, + action = function(pos, node) build_infotext(pos, minetest.registered_nodes[node.name].description) end, +} diff --git a/kingdoms/crafts.lua b/kingdoms/crafts.lua index c775806..a79a9fd 100644 --- a/kingdoms/crafts.lua +++ b/kingdoms/crafts.lua @@ -7,3 +7,6 @@ minetest.register_craft({ -- kingdoms:corestone -- kingdoms:claimward + +-- kingdoms:materialized_wall_1 +-- kingdoms:materializer diff --git a/kingdoms/defaults.lua b/kingdoms/defaults.lua index 865f3f1..d34dae8 100644 --- a/kingdoms/defaults.lua +++ b/kingdoms/defaults.lua @@ -40,3 +40,11 @@ kingdoms.config.player_visible_distance = 4 -- Distance of around speech. Use to match with player visibility. kingdoms.config.around = kingdoms.config.player_visible_distance * 16 + +-- Radius a materializer reaches. +kingdoms.config.materializer_radius = 5 +-- Number of levels in materialized blocks. +kingdoms.config.materialized_levels = 4 +-- Materializer ABM settings. +kingdoms.config.materialized_abm_interval = 2 +kingdoms.config.materialized_abm_chance = 2 diff --git a/kingdoms/gen.lua b/kingdoms/gen.lua index e69de29..8479c11 100644 --- a/kingdoms/gen.lua +++ b/kingdoms/gen.lua @@ -0,0 +1,49 @@ +-- Set flags used by Kingdoms. +minetest.register_on_mapgen_init(function(params) + minetest.set_mapgen_params({ + mgname = "v7", + flags = "trees, caves, dungeons, noflat, light, decorations", + }) + -- Biomes won't be registered properly until done manually. + default.register_biomes() + default.register_decorations() +end) + +-- Dungeons +local items = kingdoms.utils.probability_list({ + ["default:mese"] = 1, + ["default:diamondblock"] = 1, + + ["default:goldblock"] = 2, + ["default:copperblock"] = 2, + + ["default:bronzeblock"] = 3, + ["default:steelblock"] = 3, + + ["default:obsidian"] = 3, + ["default:coalblock"] = 3, +}) + +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 +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 +end) diff --git a/kingdoms/init.lua b/kingdoms/init.lua index 79db187..29538f7 100644 --- a/kingdoms/init.lua +++ b/kingdoms/init.lua @@ -62,6 +62,7 @@ domodfile("nametags.lua") domodfile("hud.lua") domodfile("corestone.lua") domodfile("gen.lua") +domodfile("barriers.lua") -- Overrides of default to support kingdoms. domodfile("ext/chests.lua") diff --git a/kingdoms/textures/kingdoms_materialized.png b/kingdoms/textures/kingdoms_materialized.png new file mode 100644 index 0000000000000000000000000000000000000000..512793d67d2e6cc7830802af3a9c64ae3e25d74b GIT binary patch literal 728 zcmV;}0w?{6P)2NH7y#gZ7CYXT zB+b$k)b>aRBoGM1OYi`^H%CVx5aI#|X%n}J#~IIzJsTIi!FTbY4oV;t8A z5ytMya+4%AV_N_$#G^6lbovoRg;E^=(5kxX`y&9F&;RMVyDYotx}EnnimD{3hoP_Q z>o80h+s1L7rZZ}-_TJX@Q^tM+fYxF+${Q`jX`W3mpt|*-daSX#W4AaBmOI1Bls`K6lL4D)Puvux>{+3!CA_;Ku|JbCY( zGZ<6n%rJ1qwneci%ga1pGWMI?-pLBx5ZwNR=Hf_OgvH;!wB@Gx{VP3Qal=P*pQmR)ym ztwIR@J;GQQ1hEiDDO;_@Fr2;j5P)}fPi0007bNklb^AR1$OL}RTGJ$x-`BjZ7tUc> z&V4_14zuiRx0@-IZnraQwY9wvNt)g*%X!~7eP6T3kMB(;PY;KE9N+T&biKaNx&Z*r zC8caMdH_JJ)tt+&+bNY%#`yL1N6v+FSXGNGI|Be~wbm_To-zGyHxojwRzHTryG^s^ z#`MGCGz@b9kTR^Q;_cf{@YkzXFGizB^ZDl}8YAlc{)XoHLn*_ntM`Z&fJhkw01yI% z06^0$7mII`$&;#DG|h@JL5t!`)2vQTo?TwPD~hl1e_3{hXt&!d&P7??01(QUNRm5k zyCH-m$%GIJ0N@-r2LM`kCnwLG!^5GLGV;6udGqGq`TR4bOsQ0eQ0o>^_kA-SpI=}9 zm!?xhLn%v=e`d1}L2$&ou2d>Bre#c&-EK8khJZV5TaDZ z2_e3pP0mJI``Y)D z{l4Ics8q(7_v_cEG@WYQw(U9yMqO7P4y96=l;M7V69h*91i<|PQWsVL!2}5o00000 LNkvXXu0mjfAs0