diff --git a/bones/README.txt b/bones/README.txt new file mode 100644 index 0000000..b40a384 --- /dev/null +++ b/bones/README.txt @@ -0,0 +1,17 @@ +Minetest Game mod: bones +======================== + +License of source code: +----------------------- +Copyright (C) 2012 PilzAdam + +WTFPL + +License of media (textures and sounds) +-------------------------------------- +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +http://creativecommons.org/licenses/by-sa/3.0/ + +Authors of media files +---------------------- +Bad_Command_ diff --git a/bones/depends.txt b/bones/depends.txt new file mode 100644 index 0000000..088f357 --- /dev/null +++ b/bones/depends.txt @@ -0,0 +1,2 @@ +default +kingdoms diff --git a/bones/init.lua b/bones/init.lua new file mode 100644 index 0000000..2b475db --- /dev/null +++ b/bones/init.lua @@ -0,0 +1,235 @@ +-- Minetest 0.4 mod: bones +-- See README.txt for licensing and other information. + +bones = {} + +local function is_owner(pos, name) + local akingdom = kingdoms.bypos(pos) + local owner = minetest.get_meta(pos):get_string("owner") + if not akingdom or minetest.check_player_privs(name, "protection_bypass") or owner == "" or owner == name or kingdoms.player.can(name, "heavy_chests") then + return true + end + return false +end + +bones.bones_formspec = + "size[8,9]" .. + default.gui_bg .. + default.gui_bg_img .. + default.gui_slots .. + "list[current_name;main;0,0.3;8,4;]" .. + "list[current_player;main;0,4.85;8,1;]" .. + "list[current_player;main;0,6.08;8,3;8]" .. + "listring[current_name;main]" .. + "listring[current_player;main]" .. + default.get_hotbar_bg(0,4.85) + +local share_bones_time = tonumber(minetest.setting_get("share_bones_time")) or 1200 +local share_bones_time_early = tonumber(minetest.setting_get("share_bones_time_early")) or share_bones_time / 4 + +minetest.register_node("bones:bones", { + description = "Bones", + tiles = { + "bones_top.png", + "bones_bottom.png", + "bones_side.png", + "bones_side.png", + "bones_rear.png", + "bones_front.png" + }, + paramtype2 = "facedir", + groups = {dig_immediate=2}, + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_gravel_footstep", gain=0.5}, + dug = {name="default_gravel_footstep", gain=1.0}, + }), + + can_dig = function(pos, player) + local inv = minetest.get_meta(pos):get_inventory() + local name = "" + if player then + name = player:get_player_name() + end + return is_owner(pos, name) and inv:is_empty("main") + end, + + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + if is_owner(pos, player:get_player_name()) then + return count + end + return 0 + end, + + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + return 0 + end, + + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + if is_owner(pos, player:get_player_name()) then + return stack:get_count() + end + return 0 + end, + + on_metadata_inventory_take = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if meta:get_inventory():is_empty("main") then + minetest.remove_node(pos) + end + end, + + on_punch = function(pos, node, player) + if(not is_owner(pos, player:get_player_name())) then + return + end + + if(minetest.get_meta(pos):get_string("infotext") == "") then + return + end + + local inv = minetest.get_meta(pos):get_inventory() + local player_inv = player:get_inventory() + local has_space = true + + for i=1,inv:get_size("main") do + local stk = inv:get_stack("main", i) + if player_inv:room_for_item("main", stk) then + inv:set_stack("main", i, nil) + player_inv:add_item("main", stk) + else + has_space = false + break + end + end + + -- remove bones if player emptied them + if has_space then + if player_inv:room_for_item("main", {name = "bones:bones"}) then + player_inv:add_item("main", {name = "bones:bones"}) + else + minetest.add_item(pos,"bones:bones") + end + minetest.remove_node(pos) + end + end, + + on_timer = function(pos, elapsed) + local meta = minetest.get_meta(pos) + local time = meta:get_int("time") + elapsed + if time >= share_bones_time then + meta:set_string("infotext", meta:get_string("owner").."'s old bones") + meta:set_string("owner", "") + else + meta:set_int("time", time) + return true + end + end, +}) + +local function may_replace(pos, player) + local node_name = minetest.get_node(pos).name + local node_definition = minetest.registered_nodes[node_name] + + -- if the node is unknown, we let the protection mod decide + -- this is consistent with when a player could dig or not dig it + -- unknown decoration would often be removed + -- while unknown building materials in use would usually be left + if not node_definition then + -- only replace nodes that are not protected + return not minetest.is_protected(pos, player:get_player_name()) + end + + -- allow replacing air and liquids + if node_name == "air" or node_definition.liquidtype ~= "none" then + return true + end + + -- don't replace filled chests and other nodes that don't allow it + local can_dig_func = node_definition.can_dig + if can_dig_func and not can_dig_func(pos, player) then + return false + end + + -- default to each nodes buildable_to; if a placed block would replace it, why shouldn't bones? + -- flowers being squished by bones are more realistical than a squished stone, too + -- exception are of course any protected buildable_to + return node_definition.buildable_to and not minetest.is_protected(pos, player:get_player_name()) +end + +minetest.register_on_dieplayer(function(player) + if minetest.setting_getbool("creative_mode") then + return + end + + local player_inv = player:get_inventory() + if player_inv:is_empty("main") and + player_inv:is_empty("craft") then + return + end + + local pos = player:getpos() + pos.x = math.floor(pos.x+0.5) + pos.y = math.floor(pos.y+0.5) + pos.z = math.floor(pos.z+0.5) + local param2 = minetest.dir_to_facedir(player:get_look_dir()) + local player_name = player:get_player_name() + local player_inv = player:get_inventory() + + if (not may_replace(pos, player)) then + if (may_replace({x=pos.x, y=pos.y+1, z=pos.z}, player)) then + -- drop one node above if there's space + -- this should solve most cases of protection related deaths in which players dig straight down + -- yet keeps the bones reachable + pos.y = pos.y+1 + else + -- drop items instead of delete + for i=1,player_inv:get_size("main") do + minetest.add_item(pos, player_inv:get_stack("main", i)) + end + for i=1,player_inv:get_size("craft") do + minetest.add_item(pos, player_inv:get_stack("craft", i)) + end + -- empty lists main and craft + player_inv:set_list("main", {}) + player_inv:set_list("craft", {}) + return + end + end + + minetest.set_node(pos, {name="bones:bones", param2=param2}) + + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("main", 8*4) + inv:set_list("main", player_inv:get_list("main")) + + for i=1,player_inv:get_size("craft") do + local stack = player_inv:get_stack("craft", i) + if inv:room_for_item("main", stack) then + inv:add_item("main", stack) + else + --drop if no space left + minetest.add_item(pos, stack) + end + end + + player_inv:set_list("main", {}) + player_inv:set_list("craft", {}) + + meta:set_string("formspec", bones.bones_formspec) + meta:set_string("owner", player_name) + + if share_bones_time ~= 0 then + meta:set_string("infotext", player_name.."'s fresh bones") + + if share_bones_time_early == 0 or not minetest.is_protected(pos, player_name) then + meta:set_int("time", 0) + else + meta:set_int("time", (share_bones_time - share_bones_time_early)) + end + + minetest.get_node_timer(pos):start(10) + else + meta:set_string("infotext", player_name.."'s bones") + end +end) diff --git a/bones/textures/bones_bottom.png b/bones/textures/bones_bottom.png new file mode 100644 index 0000000..ada72ce Binary files /dev/null and b/bones/textures/bones_bottom.png differ diff --git a/bones/textures/bones_front.png b/bones/textures/bones_front.png new file mode 100644 index 0000000..9dcbb97 Binary files /dev/null and b/bones/textures/bones_front.png differ diff --git a/bones/textures/bones_rear.png b/bones/textures/bones_rear.png new file mode 100644 index 0000000..8e1ac10 Binary files /dev/null and b/bones/textures/bones_rear.png differ diff --git a/bones/textures/bones_side.png b/bones/textures/bones_side.png new file mode 100644 index 0000000..3b4810c Binary files /dev/null and b/bones/textures/bones_side.png differ diff --git a/bones/textures/bones_top.png b/bones/textures/bones_top.png new file mode 100644 index 0000000..6119864 Binary files /dev/null and b/bones/textures/bones_top.png differ diff --git a/kingdoms/barriers.lua b/kingdoms/barriers.lua index 4ec21b0..c071ff9 100644 --- a/kingdoms/barriers.lua +++ b/kingdoms/barriers.lua @@ -27,7 +27,7 @@ for level = 1, kingdoms.config.materialized_levels do minetest.register_node("kingdoms:materialized_wall_"..tostring(level), { description = "Materializer Wall Level "..tostring(level), drawtype = "nodebox", - tiles = {"kingdoms_materialized.png"}, + tiles = (last and {"kingdoms_materialized_final.png"} or {"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)}, diff --git a/kingdoms/corestone.lua b/kingdoms/corestone.lua index 5899481..1a624e3 100644 --- a/kingdoms/corestone.lua +++ b/kingdoms/corestone.lua @@ -332,6 +332,14 @@ minetest.register_node("kingdoms:servercorestone", { on_destruct = function(pos) kingdoms.db.servercorestone = nil end, + + on_rightclick = function(pos, node, clicker) + minetest.show_formspec(clicker:get_player_name(), "kingdoms:kingdoms_info", + "size[6,6]" + .."textarea[0.4,0.25;5.75,6.75;info;Info;"..minetest.formspec_escape( +[[This is some help text.]]).."]" + ) + end, }) minetest.register_abm{ diff --git a/kingdoms/depends.txt b/kingdoms/depends.txt index 4ad96d5..c12cc51 100644 --- a/kingdoms/depends.txt +++ b/kingdoms/depends.txt @@ -1 +1,2 @@ default +3d_armor? diff --git a/kingdoms/ext/silver.lua b/kingdoms/ext/silver.lua new file mode 100644 index 0000000..e4f6d05 --- /dev/null +++ b/kingdoms/ext/silver.lua @@ -0,0 +1,95 @@ +minetest.register_node("kingdoms:stone_with_silver", { + description = "Silver Ore", + tiles = {"default_stone.png^kingdoms_mineral_silver.png"}, + groups = {cracky = 2}, + drop = "kingdoms:silver_lump", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_ore({ + ore_type = "scatter", + ore = "kingdoms:stone_with_silver", + wherein = "default:stone", + clust_scarcity = 11 * 11 * 11, + clust_num_ores = 5, + clust_size = 4, + y_min = 128, + y_max = 31000, +}) + +minetest.register_ore({ + ore_type = "scatter", + ore = "kingdoms:stone_with_silver", + wherein = "default:stone", + clust_scarcity = 16 * 16 * 16, + clust_num_ores = 5, + clust_size = 4, + y_min = 32, + y_max = 128, +}) + +minetest.register_ore({ + ore_type = "scatter", + ore = "kingdoms:stone_with_silver", + wherein = "default:stone", + clust_scarcity = 14 * 14 * 14, + clust_num_ores = 4, + clust_size = 2, + y_min = -255, + y_max = -32, +}) + +minetest.register_ore({ + ore_type = "scatter", + ore = "kingdoms:stone_with_silver", + wherein = "default:stone", + clust_scarcity = 12 * 12 * 12, + clust_num_ores = 6, + clust_size = 3, + y_min = -31000, + y_max = -256, +}) + +minetest.register_node("kingdoms:silverblock", { + description = "Silver Block", + tiles = {"kingdoms_silver_block.png"}, + is_ground_content = false, + groups = {cracky = 1}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_craftitem("kingdoms:silver_lump", { + description = "Silver Lump", + inventory_image = "kingdoms_silver_lump.png", +}) + +minetest.register_craftitem("kingdoms:silver_ingot", { + description = "Silver Ingot", + inventory_image = "kingdoms_silver_ingot.png" +}) + +minetest.register_craft({ + output = 'kingdoms:silverblock', + recipe = { + {'kingdoms:silver_ingot', 'kingdoms:silver_ingot', 'kingdoms:silver_ingot'}, + {'kingdoms:silver_ingot', 'kingdoms:silver_ingot', 'kingdoms:silver_ingot'}, + {'kingdoms:silver_ingot', 'kingdoms:silver_ingot', 'kingdoms:silver_ingot'}, + } +}) + +minetest.register_craft({ + output = 'kingdoms:silver_ingot 9', + recipe = { + {'kingdoms:silverblock'}, + } +}) + +minetest.register_craft({ + type = "cooking", + output = "kingdoms:silver_ingot", + recipe = "kingdoms:silver_lump", +}) + +minetest.register_alias("moreores:silver_lump", "kingdoms:silver_lump") +minetest.register_alias("moreores:mineral_silver", "kingdoms:stone_with_silver") +minetest.register_alias("moreores:silver_block", "kingdoms:silverblock") diff --git a/kingdoms/gen.lua b/kingdoms/gen.lua index 8479c11..c590c31 100644 --- a/kingdoms/gen.lua +++ b/kingdoms/gen.lua @@ -17,6 +17,8 @@ local items = kingdoms.utils.probability_list({ ["default:goldblock"] = 2, ["default:copperblock"] = 2, + ["kingdoms:silverblock"] = 3, + ["default:bronzeblock"] = 3, ["default:steelblock"] = 3, diff --git a/kingdoms/init.lua b/kingdoms/init.lua index 29538f7..3c35183 100644 --- a/kingdoms/init.lua +++ b/kingdoms/init.lua @@ -67,9 +67,14 @@ domodfile("barriers.lua") -- Overrides of default to support kingdoms. domodfile("ext/chests.lua") domodfile("ext/furnace.lua") +-- Silver without moreores. +domodfile("ext/silver.lua") domodfile("crafts.lua") +-- 3d_armor +ARMOR_HEAL_MULTIPLIER = 0 + -- All done! kingdoms.log("action", "Completely loaded.") kingdoms.log("action", "Number of kingdoms in the database: "..tostring(kingdoms.utils.table_len(kingdoms.db.kingdoms))) diff --git a/kingdoms/kingdom.lua b/kingdoms/kingdom.lua index 4945c95..5946968 100644 --- a/kingdoms/kingdom.lua +++ b/kingdoms/kingdom.lua @@ -71,6 +71,7 @@ local kcommand = { return true end } +kingdoms.show_main_formspec = kcommand.func minetest.register_chatcommand("k", kcommand) minetest.register_chatcommand("kingdoms", kcommand) @@ -88,11 +89,11 @@ end local function leave_kingdom(name) local kingdom = kingdoms.player.kingdom(name) local level = kingdoms.player.kingdom_state(name).level - + kingdom.memberlist = kingdoms.utils.filteri(kingdom.memberlist, function(v) return v ~= name end) kingdom.members[name] = nil kingdoms.db.players[name] = nil - + -- If there are no members, then the kingdom is disbanded. if #kingdom.memberlist == 0 then kingdoms.db.invitations = kingdoms.utils.filteri(kingdoms.db.invitations, function(v) return v.kingdom ~= kingdom.id end) @@ -101,7 +102,7 @@ local function leave_kingdom(name) minetest.chat_send_player(name, ("%s has been disbanded."):format(kingdom.longname)) return end - + -- If this was the level 100 member, choose a new level 100 member from the highest-level member available. If there are two or more, choose the one who joined first. -- Level 100s can choose their successor by reserving level 99 for that purpose. if level == kingdoms.config.maxlevel then @@ -142,9 +143,9 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) joined = os.time(), } table.insert(kingdom.memberlist, name) - + clear_invitations(name) - + kingdoms.log("action", ("'%s' has joined '%s'."):format(name, kingdom.longname)) minetest.chat_send_player(name, "You are now a member of "..kingdom.longname) return kcommand.func(name) @@ -161,7 +162,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) minetest.chat_send_player(name, "That name is too long.") return true end - + local kingdom = { id = kingdoms.utils.uniqueid(), longname = formattedname, @@ -185,9 +186,9 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) return true end end - + clear_invitations(name) - + kingdoms.db.players[name] = kingdom.id kingdom.members[name] = { name = name, @@ -353,7 +354,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if formname ~= "kingdoms:levels" then return false end local name = player:get_player_name() local kingdom = kingdoms.player.kingdom(name) - + if fields.levels then formspec_levels.selected[name] = formspec_levels.possible[minetest.explode_textlist_event(fields.levels).index] if not kingdoms.player.can(name, "set_levels") then @@ -376,12 +377,12 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) local level = formspec_levels.selected[name] local oldvalue = kingdom.levels[level] local value = tonumber(fields.value) - + if fields.go then if oldvalue == value then return formspec_levels.func(name) end - + if not kingdoms.player.can(name, "set_levels") then minetest.chat_send_player(name, "You do not have sufficient level to set levels.") return formspec_levels.func(name) @@ -430,7 +431,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if formname ~= "kingdoms:info" then return false end local name = player:get_player_name() local kingdom = kingdoms.player.kingdom(name) - + if fields.save then if not kingdoms.player.can(name, "set_info") then return true diff --git a/kingdoms/player.lua b/kingdoms/player.lua index a65e317..e308358 100644 --- a/kingdoms/player.lua +++ b/kingdoms/player.lua @@ -37,4 +37,5 @@ local function respawn(player) return false end +minetest.register_on_newplayer(respawn) minetest.register_on_respawnplayer(respawn) diff --git a/kingdoms/textures/kingdoms_materialized_final.png b/kingdoms/textures/kingdoms_materialized_final.png new file mode 100644 index 0000000..93ed987 Binary files /dev/null and b/kingdoms/textures/kingdoms_materialized_final.png differ diff --git a/kingdoms/textures/kingdoms_mineral_silver.png b/kingdoms/textures/kingdoms_mineral_silver.png new file mode 100644 index 0000000..104106c Binary files /dev/null and b/kingdoms/textures/kingdoms_mineral_silver.png differ diff --git a/kingdoms/textures/kingdoms_silver_block.png b/kingdoms/textures/kingdoms_silver_block.png new file mode 100644 index 0000000..ce63c77 Binary files /dev/null and b/kingdoms/textures/kingdoms_silver_block.png differ diff --git a/kingdoms/textures/kingdoms_silver_ingot.png b/kingdoms/textures/kingdoms_silver_ingot.png new file mode 100644 index 0000000..4b81698 Binary files /dev/null and b/kingdoms/textures/kingdoms_silver_ingot.png differ diff --git a/kingdoms/textures/kingdoms_silver_lump.png b/kingdoms/textures/kingdoms_silver_lump.png new file mode 100644 index 0000000..1ad579c Binary files /dev/null and b/kingdoms/textures/kingdoms_silver_lump.png differ diff --git a/kingdoms/textures/ui_kingdoms_icon.png b/kingdoms/textures/ui_kingdoms_icon.png new file mode 100644 index 0000000..b67243b Binary files /dev/null and b/kingdoms/textures/ui_kingdoms_icon.png differ diff --git a/kingdoms_ui/depends.txt b/kingdoms_ui/depends.txt new file mode 100644 index 0000000..5f915e3 --- /dev/null +++ b/kingdoms_ui/depends.txt @@ -0,0 +1,2 @@ +unified_inventory? +kingdoms diff --git a/kingdoms_ui/init.lua b/kingdoms_ui/init.lua new file mode 100644 index 0000000..2e52927 --- /dev/null +++ b/kingdoms_ui/init.lua @@ -0,0 +1,11 @@ +if rawget(_G, "unified_inventory") then + unified_inventory.register_button("kingdoms", { + type = "image", + image = "ui_kingdoms_icon.png", + tooltip = "Open the kingdoms GUI", + hide_lite=false, + action = function(player) + kingdoms.show_main_formspec(player:get_player_name()) + end, + }) +end diff --git a/magic/crafts.lua b/magic/crafts.lua new file mode 100644 index 0000000..d9b1995 --- /dev/null +++ b/magic/crafts.lua @@ -0,0 +1,8 @@ +for _,def in ipairs(magic.crystals) do + minetest.register_craft({ + type = "cooking", + output = "magic:"..def.name.."_essence", + recipe = "magic:crystal_"..def.name, + cooktime = 6, + }) +end diff --git a/magic/crystals.lua b/magic/crystals.lua new file mode 100644 index 0000000..364a05d --- /dev/null +++ b/magic/crystals.lua @@ -0,0 +1,105 @@ +magic.crystals = { + { + name = "rage", + desc = "Rage", + color = "#A00", + light = 10, + ores = { + { + rarity = 10 * 10 * 10, + clust_num_ores = 1, + clust_size = 1, + wherein = "default:lava_source", + y_max = -64, + }, + }, + }, + { + name = "calm", + desc = "Calm", + color = "#00F", + light = 5, + ores = { + { + rarity = 10 * 10 * 10, + clust_num_ores = 1, + clust_size = 1, + wherein = "default:water_source", + y_max = -64, + }, + { + rarity = 16 * 16 * 16, + clust_num_ores = 1, + clust_size = 1, + wherein = "default:water_source", + y_min = -32, + y_max = -8, + }, + }, + }, +} + +for _,def in ipairs(magic.crystals) do + minetest.register_node("magic:crystal_"..def.name, { + description = def.desc.." Crystal", + drawtype = "glasslike", + tiles = {"magic_crystal.png^[colorize:"..def.color..":"..tostring(0xCC)}, + groups = {cracky = 2}, + light_source = def.light or 7, + sunlight_propagates = true, + use_texture_alpha = true, + paramtype = "light", + sounds = default.node_sound_stone_defaults(), + }) + + minetest.register_craftitem("magic:"..def.name.."_essence", { + description = def.desc.." Essence", + inventory_image = "magic_essence.png^[colorize:"..def.color..":"..tostring(0xCC), + }) + + local ndefd = { + ore_type = "scatter", + ore = "magic:crystal_"..def.name, + wherein = "default:stone", + clust_num_ores = 1, + clust_size = 1, + y_min = -31000, + y_max = 31000, + } + + if def.ores then + for _,oredef in ipairs(def.ores) do + local ndef = table.copy(ndefd) + ndef.clust_scarcity = oredef.rarity * #magic.crystals * (def.rarity or 1) + for k,v in pairs(oredef) do + ndef[k] = v + end + minetest.register_ore(ndef) + end + end + + if not def.nodefgen then + local ores = { + { + rarity = 16 * 16 * 16, + clust_num_ores = 3, + clust_size = 2, + y_max = -64, + }, + { + rarity = 14 * 14 * 14, + clust_num_ores = 3, + clust_size = 2, + y_min = 32, + }, + } + for _,oredef in ipairs(ores) do + local ndef = table.copy(ndefd) + ndef.clust_scarcity = oredef.rarity * #magic.crystals * (def.rarity or 1) + for k,v in pairs(oredef) do + ndef[k] = v + end + minetest.register_ore(ndef) + end + end +end diff --git a/magic/init.lua b/magic/init.lua index 2496998..2d564f1 100644 --- a/magic/init.lua +++ b/magic/init.lua @@ -7,4 +7,8 @@ end -- Mod namespace. magic = {} +domodfile("crystals.lua") +domodfile("spells.lua") +domodfile("crafts.lua") + kingdoms.log("action", "Magic loaded.") diff --git a/magic/spells.lua b/magic/spells.lua new file mode 100644 index 0000000..e69de29 diff --git a/magic/textures/magic_crystal.png b/magic/textures/magic_crystal.png new file mode 100644 index 0000000..bd07962 Binary files /dev/null and b/magic/textures/magic_crystal.png differ diff --git a/magic/textures/magic_essence.png b/magic/textures/magic_essence.png new file mode 100644 index 0000000..6e93c38 Binary files /dev/null and b/magic/textures/magic_essence.png differ