diff --git a/mods/ctf/ctf_bandages/init.lua b/mods/ctf/ctf_bandages/init.lua index 2a95754..37f9a95 100644 --- a/mods/ctf/ctf_bandages/init.lua +++ b/mods/ctf/ctf_bandages/init.lua @@ -3,7 +3,7 @@ local healing_limit = 15 minetest.register_craftitem("ctf_bandages:bandage", { - description = "Bandage, heals teammates for 3-4 HP until HP is equal to "..healing_limit, + description = "Bandage\n\nHeals teammates for 3-4 HP until HP is equal to "..healing_limit, inventory_image = "ctf_bandages_bandage.png", on_use = function(itemstack, player, pointed_thing) if pointed_thing.type ~= "object" then diff --git a/mods/ctf/ctf_classes/api.lua b/mods/ctf/ctf_classes/api.lua index 88728e8..b1c4080 100644 --- a/mods/ctf/ctf_classes/api.lua +++ b/mods/ctf/ctf_classes/api.lua @@ -15,6 +15,11 @@ function ctf_classes.register(cname, def) def.properties.max_hp = def.properties.max_hp or 20 end +local registered_on_changed = {} +function ctf_classes.register_on_changed(func) + table.insert(registered_on_changed, func) +end + function ctf_classes.set_skin(player, color, class) player:set_properties({ textures = {"ctf_classes_skin_" .. class.name .. "_" .. (color or "blue") .. ".png"} @@ -30,20 +35,22 @@ function ctf_classes.get(player) return ctf_classes.__classes[cname] end -function ctf_classes.set(player, cname) - assert(type(cname) == "string") - local class = ctf_classes.__classes[cname] - assert(class) +function ctf_classes.set(player, new_name) + assert(type(new_name) == "string") + local new = ctf_classes.__classes[new_name] + assert(new) local meta = player:get_meta() - local old = meta:get("ctf_classes:class") - meta:set_string("ctf_classes:class", cname) + local old_name = meta:get("ctf_classes:class") + + meta:set_string("ctf_classes:class", new_name) ctf_classes.update(player) - if old ~= nil and old ~= cname then - local pname = player:get_player_name() - ctf.chat_send_team(ctf.player(pname).team, - minetest.colorize("#ABCDEF", pname .. " is now a " .. class.description)) + if old_name == nil or old_name ~= new_name then + local old = old_name and ctf_classes.__classes[old_name] + for i=1, #registered_on_changed do + registered_on_changed[i](player, old, new) + end end end @@ -68,13 +75,21 @@ local function set_max_hp(player, max_hp) end function ctf_classes.update(player) + local name = player:get_player_name() + local class = ctf_classes.get(player) - local color = ctf_colors.get_color(ctf.player(player:get_player_name())).text + local color = ctf_colors.get_color(ctf.player(name)).text set_max_hp(player, class.properties.max_hp) ctf_classes.set_skin(player, color, class) + + local speed = class.properties.speed + if ctf_flag.has_flag(name) and speed > 0.9 then + speed = 0.9 + end + physics.set(player:get_player_name(), "ctf_classes:speed", { - speed = class.properties.speed, + speed = speed, }) end diff --git a/mods/ctf/ctf_classes/gui.lua b/mods/ctf/ctf_classes/gui.lua index 6eb3bcf..1fd5bae 100644 --- a/mods/ctf/ctf_classes/gui.lua +++ b/mods/ctf/ctf_classes/gui.lua @@ -41,6 +41,24 @@ function ctf_classes.show_gui(name, player) fs[#fs + 1] = ",#fcc," .. minetest.formspec_escape(item) end fs[#fs + 1] = "]" + + for i, item in pairs(class.properties.items or {}) do + fs[#fs + 1] = "item_image[" + fs[#fs + 1] = tostring(i * 0.5 - 0.4) + fs[#fs + 1] = ",2.15;0.5,0.5;" + fs[#fs + 1] = minetest.formspec_escape(ItemStack(item):get_name()) + fs[#fs + 1] = "]" + + local desc = ItemStack(item):get_description():split("\n")[1] + + fs[#fs + 1] = "tooltip[" + fs[#fs + 1] = tostring(i * 0.5 - 0.4) + fs[#fs + 1] = ",2.15;0.5,0.5;" + fs[#fs + 1] = minetest.formspec_escape(desc) + fs[#fs + 1] = "]" + end + + fs[#fs + 1] = "button_exit[0.5,2.7;2,1;select_" fs[#fs + 1] = class.name fs[#fs + 1] = ";Select]" diff --git a/mods/ctf/ctf_classes/init.lua b/mods/ctf/ctf_classes/init.lua index fdab6f2..705957b 100644 --- a/mods/ctf/ctf_classes/init.lua +++ b/mods/ctf/ctf_classes/init.lua @@ -7,6 +7,7 @@ dofile(minetest.get_modpath("ctf_classes") .. "/api.lua") dofile(minetest.get_modpath("ctf_classes") .. "/gui.lua") dofile(minetest.get_modpath("ctf_classes") .. "/regen.lua") dofile(minetest.get_modpath("ctf_classes") .. "/ranged.lua") +dofile(minetest.get_modpath("ctf_classes") .. "/items.lua") ctf_classes.register("knight", { description = "Knight", @@ -16,16 +17,23 @@ ctf_classes.register("knight", { properties = { max_hp = 30, speed = 0.90, + + items = { + "default:sword_steel", + }, }, }) ctf_classes.register("shooter", { - description = "Shooter", - pros = { "+10% ranged skill", "Rifles and grappling hooks" }, - cons = { "Can't capture the flag" }, + description = "Sharp Shooter", + pros = { "+10% ranged skill" }, + cons = {}, color = "#c60", properties = { - can_capture = false, + items = { + "shooter:rifle", + "shooter:grapple_gun_loaded", + } }, }) @@ -36,6 +44,10 @@ ctf_classes.register("medic", { color = "#0af", properties = { max_hp = 10, + + items = { + "ctf_bandages:bandage 20", + }, }, }) @@ -48,6 +60,14 @@ minetest.register_on_joinplayer(function(player) end end) +ctf_flag.register_on_pick_up(function(name) + ctf_classes.update(minetest.get_player_by_name(name)) +end) + +ctf_flag.register_on_drop(function(name) + ctf_classes.update(minetest.get_player_by_name(name)) +end) + minetest.register_chatcommand("class", { func = function(name, params) local player = minetest.get_player_by_name(name) @@ -114,3 +134,13 @@ for _, flagname in pairs(flags) do on_rightclick = show, }) end + +ctf_classes.register_on_changed(function(player, old, new) + if not old then + return + end + + local pname = player:get_player_name() + ctf.chat_send_team(ctf.player(pname).team, + minetest.colorize("#ABCDEF", pname .. " is now a " .. new.description)) +end) diff --git a/mods/ctf/ctf_classes/items.lua b/mods/ctf/ctf_classes/items.lua new file mode 100644 index 0000000..e10ea05 --- /dev/null +++ b/mods/ctf/ctf_classes/items.lua @@ -0,0 +1,60 @@ +give_initial_stuff.register_stuff_provider(function(player) + local class = ctf_classes.get(player) + return class.properties.items or {} +end, 1) + +ctf_classes.register_on_changed(function(player, old, new) + local inv = player:get_inventory() + + if old then + local items = old.properties.items or {} + for i = 1, #items do + inv:remove_item("main", ItemStack(items[i])) + end + end + + do + assert(new) + + local items = new.properties.items or {} + for i = 1, #items do + inv:add_item("main", ItemStack(items[i])) + end + end +end) + +local function stack_list_to_map(stacks) + local map = {} + for i = 1, #stacks do + map[ItemStack(stacks[i]):get_name()] = true + end + return map +end + +local old_item_drop = minetest.item_drop +minetest.item_drop = function(itemstack, player, pos) + local class = ctf_classes.get(player) + + local items = stack_list_to_map(class.properties.items or {}) + if items[itemstack:get_name()] then + minetest.chat_send_player(player:get_player_name(), + "You're not allowed to drop class items!") + return itemstack + else + return old_item_drop(itemstack, player, pos) + end +end + +local old_is_allowed = ctf_map.is_item_allowed_in_team_chest +ctf_map.is_item_allowed_in_team_chest = function(listname, stack, player) + local class = ctf_classes.get(player) + + local items = stack_list_to_map(class.properties.items or {}) + if items[stack:get_name()] then + minetest.chat_send_player(player:get_player_name(), + "You're not allowed to put class items in the chest!") + return false + else + return old_is_allowed(listname, stack, player) + end +end diff --git a/mods/ctf/ctf_classes/mod.conf b/mods/ctf/ctf_classes/mod.conf index c0e72d5..1967fb0 100644 --- a/mods/ctf/ctf_classes/mod.conf +++ b/mods/ctf/ctf_classes/mod.conf @@ -1,3 +1,3 @@ name = ctf_classes -depends = ctf, ctf_flag, ctf_colors, physics, shooter, hpregen +depends = ctf, ctf_flag, ctf_colors, ctf_map_core, physics, shooter, hpregen, give_initial_stuff description = Adds classes, including knight, shooter, and medic diff --git a/mods/ctf/ctf_classes/ranged.lua b/mods/ctf/ctf_classes/ranged.lua index 4f65452..0f4edf4 100644 --- a/mods/ctf/ctf_classes/ranged.lua +++ b/mods/ctf/ctf_classes/ranged.lua @@ -49,6 +49,13 @@ local function check_grapple(itemname) return itemstack end + if ctf_flag.has_flag(user:get_player_name()) then + minetest.chat_send_player(user:get_player_name(), + "You can't use grapples whilst carrying the flag") + + return itemstack + end + return old_func(itemstack, user, ...) end, }) diff --git a/mods/ctf/ctf_crafting/init.lua b/mods/ctf/ctf_crafting/init.lua index deef651..36fd84c 100644 --- a/mods/ctf/ctf_crafting/init.lua +++ b/mods/ctf/ctf_crafting/init.lua @@ -1,28 +1,33 @@ local full_ores = { - {"diamond", "default:diamond"}, - {"mese", "default:mese_crystal"}, - {"bronze", "default:bronze_ingot"}, - {"steel", "default:steel_ingot"}, - {"stone", "default:cobble"}, + diamond = "default:diamond", + mese = "default:mese_crystal", + bronze = "default:bronze_ingot", + steel = "default:steel_ingot", + stone = "default:cobble", +} + +local upgrades = { + steel = "mese", + mese = "diamond", } -- Swords -for _, orex in pairs(full_ores) do +for from, to in pairs(upgrades) do crafting.register_recipe({ type = "inv", - output = "default:sword_" .. orex[1], - items = { "default:stick", orex[2] .. " 2" }, + output = "default:sword_" .. to, + items = { "default:sword_" .. from, full_ores[to] .. " 2" }, always_known = true, level = 1, }) end -- Pickaxes -for _, orex in pairs(full_ores) do +for ore, ore_item in pairs(full_ores) do crafting.register_recipe({ type = "inv", - output = "default:pick_" .. orex[1], - items = { "default:stick 2", orex[2] .. " 3" }, + output = "default:pick_" .. ore, + items = { "default:stick 2", ore_item .. " 3" }, always_known = true, level = 1, }) @@ -187,22 +192,22 @@ crafting.register_recipe({ }) -- Shovels -for _, orex in pairs(full_ores) do +for ore, ore_item in pairs(full_ores) do crafting.register_recipe({ type = "inv", - output = "default:shovel_" .. orex[1], - items = { "default:stick 2", orex[2] }, + output = "default:shovel_" .. ore, + items = { "default:stick 2", ore_item }, always_known = true, level = 1, }) end -- Axes -for _, orex in pairs(full_ores) do +for ore, ore_item in pairs(full_ores) do crafting.register_recipe({ type = "inv", - output = "default:axe_" .. orex[1], - items = { "default:stick 2", orex[2] .. " 3" }, + output = "default:axe_" .. ore, + items = { "default:stick 2", ore_item .. " 3" }, always_known = true, level = 1, }) diff --git a/mods/ctf/ctf_flag/api.lua b/mods/ctf/ctf_flag/api.lua index 1420ecb..4fdeba2 100644 --- a/mods/ctf/ctf_flag/api.lua +++ b/mods/ctf/ctf_flag/api.lua @@ -50,13 +50,14 @@ function ctf_flag.collect_claimed() return claimed end -function ctf_flag.get_claimed_by_player(name) +function ctf_flag.has_flag(name) local claimed = ctf_flag.collect_claimed() for _, flag in pairs(claimed) do if flag.claimed.player == name then - return name + return true end end + return false end function ctf_flag.player_drop_flag(name) diff --git a/mods/ctf/ctf_map/ctf_map_core/chest.lua b/mods/ctf/ctf_map/ctf_map_core/chest.lua index 70c9df2..b0e86d4 100644 --- a/mods/ctf/ctf_map/ctf_map_core/chest.lua +++ b/mods/ctf/ctf_map/ctf_map_core/chest.lua @@ -6,9 +6,24 @@ local blacklist = { "default:aspen_leaves" } + +function ctf_map.is_item_allowed_in_team_chest(listname, stack, player) + if listname == "helper" then + return false + end + + for _, itemstring in ipairs(blacklist) do + if stack:get_name() == itemstring then + return false + end + end + + return true +end + local colors = {"red", "blue"} for _, chest_color in pairs(colors) do - minetest.register_node("ctf_map_core:chest_" .. chest_color, { + local def = { description = "Chest", tiles = { "default_chest_top_" .. chest_color .. ".png", @@ -22,185 +37,188 @@ for _, chest_color in pairs(colors) do legacy_facedir_simple = true, is_ground_content = false, sounds = default.node_sound_wood_defaults(), - on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string("infotext", "Chest") - local inv = meta:get_inventory() - inv:set_size("main", 4 * 7) - inv:set_size("pro", 4 * 7) - inv:set_size("helper", 1 * 1) - end, - on_rightclick = function(pos, node, player) - local name = player:get_player_name() - if chest_color ~= ctf.player(name).team then - minetest.chat_send_player(name, "You're not on team " .. chest_color) + } + + function def.on_construct(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", "Chest") + local inv = meta:get_inventory() + inv:set_size("main", 4 * 7) + inv:set_size("pro", 4 * 7) + inv:set_size("helper", 1 * 1) + end + + function def.can_dig(pos, player) + return false + end + + function def.on_rightclick(pos, node, player) + local name = player:get_player_name() + if chest_color ~= ctf.player(name).team then + minetest.chat_send_player(name, "You're not on team " .. chest_color) + return + end + + local territory_owner = ctf.get_territory_owner(pos) + if chest_color ~= territory_owner then + if not territory_owner then + ctf.warning("ctf_map", "Unowned team chest") + minetest.set_node(pos, { name = "air" }) return end + ctf.warning("ctf_map", "Wrong chest, changing to " .. + territory_owner .. " from " .. chest_color) + minetest.set_node(pos, "ctf_map_core:chest_" .. territory_owner) + end - local territory_owner = ctf.get_territory_owner(pos) - if chest_color ~= territory_owner then - if not territory_owner then - ctf.warning("ctf_map", "Unowned team chest") - minetest.set_node(pos, { name = "air" }) - return - end - ctf.warning("ctf_map", "Wrong chest, changing to " .. - territory_owner .. " from " .. chest_color) - minetest.set_node(pos, "ctf_map_core:chest_" .. territory_owner) - end + local formspec = table.concat({ + "size[8,12]", + default.gui_bg, + default.gui_bg_img, + default.gui_slots, + default.get_hotbar_bg(0,7.85), + "list[current_player;main;0,7.85;8,1;]", + "list[current_player;main;0,9.08;8,3;8]", + }, "") - local formspec = table.concat({ - "size[8,12]", - default.gui_bg, - default.gui_bg_img, - default.gui_slots, - default.get_hotbar_bg(0,7.85), - "list[current_player;main;0,7.85;8,1;]", - "list[current_player;main;0,9.08;8,3;8]", - }, "") + if ctf_stats.player(name).score < 10 then + local msg = "You need at least 10 score to access the team chest.\n" .. + "Try killing an enemy player, or at least try to capture the flag.\n" .. + "Find resources in chests scattered around the map." + formspec = formspec .. "label[0.75,3;" .. minetest.formspec_escape(msg) .. "]" + minetest.show_formspec(name, "ctf_map_core:no_access", formspec) + return + end - if ctf_stats.player(name).score < 10 then - local msg = "You need at least 10 score to access the team chest.\n" .. - "Try killing an enemy player, or at least try to capture the flag.\n" .. - "Find resources in chests scattered around the map." - formspec = formspec .. "label[0.75,3;" .. minetest.formspec_escape(msg) .. "]" - minetest.show_formspec(name, "ctf_map_core:no_access", formspec) - return - end + local is_pro = ctf_stats.is_pro(name) + local chestinv = "nodemeta:" .. pos.x .. "," .. pos.y .. "," .. pos.z - local is_pro = ctf_stats.is_pro(name) - local chestinv = "nodemeta:" .. pos.x .. "," .. pos.y .. "," .. pos.z + formspec = formspec .. "list[" .. chestinv .. ";main;0,0.3;4,7;]" .. + "background[4,-0.2;4.15,7.7;ctf_map_pro_section.png;false]" - formspec = formspec .. "list[" .. chestinv .. ";main;0,0.3;4,7;]" .. - "background[4,-0.2;4.15,7.7;ctf_map_pro_section.png;false]" + if is_pro then + formspec = formspec .. "list[" .. chestinv .. ";pro;4,0.3;4,7;]" .. + "listring[" .. chestinv ..";pro]" .. + "listring[" .. chestinv .. ";helper]" .. + "label[5,-0.2;" .. + minetest.formspec_escape("Pro players only") .. "]" + else + formspec = formspec .. "label[4.75,3;" .. + minetest.formspec_escape("You need at least 10000" .. + "\nscore and 1.5+ KD to\naccess the pro section") .. "]" + end - if is_pro then - formspec = formspec .. "list[" .. chestinv .. ";pro;4,0.3;4,7;]" .. - "listring[" .. chestinv ..";pro]" .. - "listring[" .. chestinv .. ";helper]" .. - "label[5,-0.2;" .. - minetest.formspec_escape("Pro players only") .. "]" - else - formspec = formspec .. "label[4.75,3;" .. - minetest.formspec_escape("You need at least 10000" .. - "\nscore and 1.5+ KD to\naccess the pro section") .. "]" - end + formspec = formspec .. + "listring[" .. chestinv ..";main]" .. + "listring[current_player;main]" - formspec = formspec .. - "listring[" .. chestinv ..";main]" .. - "listring[current_player;main]" + minetest.show_formspec(name, "ctf_map_core:chest", formspec) + end - minetest.show_formspec(name, "ctf_map_core:chest", formspec) - end, + function def.allow_metadata_inventory_move(pos, from_list, from_index, + to_list, to_index, count, player) + local name = player:get_player_name() + if chest_color ~= ctf.player(name).team then + minetest.chat_send_player(name, "You're not on team " .. chest_color) + return 0 + end - allow_metadata_inventory_move = function(pos, from_list, from_index, - to_list, to_index, count, player) - local name = player:get_player_name() - if chest_color ~= ctf.player(name).team then - minetest.chat_send_player(name, "You're not on team " .. chest_color) - return 0 - end + if ctf_stats.player(name).score < 10 then + return 0 + end - if ctf_stats.player(name).score < 10 then - return 0 - end - - if (from_list ~= "pro" and to_list ~= "pro") or ctf_stats.is_pro(name) then - if to_list == "helper" then - -- handle move & overflow - local chestinv = minetest.get_inventory({type = "node", pos = pos}) - local playerinv = player:get_inventory() - local stack = chestinv:get_stack(from_list, from_index) - local leftover = playerinv:add_item("main", stack) - local n_stack = stack - n_stack:set_count(stack:get_count() - leftover:get_count()) - chestinv:remove_item("helper", stack) - chestinv:remove_item("pro", n_stack) - return 0 - elseif from_list == "helper" then - return 0 - else - return count - end - else - return 0 - end - end, - allow_metadata_inventory_put = function(pos, listname, index, stack, player) - if listname == "helper" then - return 0 - end - - local name = player:get_player_name() - if chest_color ~= ctf.player(name).team then - minetest.chat_send_player(name, "You're not on team " .. chest_color) - return 0 - end - - for _, itemstring in ipairs(blacklist) do - if stack:get_name() == itemstring then - return 0 - end - end - - local pstat = ctf_stats.player(name) - if not pstat or not pstat.score or pstat.score < 10 then - return 0 - end - - if listname ~= "pro" or ctf_stats.is_pro(name) then + if (from_list ~= "pro" and to_list ~= "pro") or ctf_stats.is_pro(name) then + if to_list == "helper" then + -- handle move & overflow local chestinv = minetest.get_inventory({type = "node", pos = pos}) - if chestinv:room_for_item("pro", stack) then - return stack:get_count() - else - -- handle overflow - local playerinv = player:get_inventory() - local leftovers = chestinv:add_item("pro", stack) - local leftover = chestinv:add_item("main", leftovers) - local n_stack = stack - n_stack:set_count(stack:get_count() - leftover:get_count()) - playerinv:remove_item("main", n_stack) - return 0 - end + local playerinv = player:get_inventory() + local stack = chestinv:get_stack(from_list, from_index) + local leftover = playerinv:add_item("main", stack) + local n_stack = stack + n_stack:set_count(stack:get_count() - leftover:get_count()) + chestinv:remove_item("helper", stack) + chestinv:remove_item("pro", n_stack) + return 0 + elseif from_list == "helper" then + return 0 else - return 0 - end - end, - allow_metadata_inventory_take = function(pos, listname, index, stack, player) - if listname == "helper" then - return 0 + return count end + else + return 0 + end + end - local name = player:get_player_name() - if chest_color ~= ctf.player(name).team then - minetest.chat_send_player(name, "You're not on team " .. chest_color) - return 0 - end + function def.allow_metadata_inventory_put(pos, listname, index, stack, player) + local name = player:get_player_name() + if chest_color ~= ctf.player(name).team then + minetest.chat_send_player(name, "You're not on team " .. chest_color) + return 0 + end - if ctf_stats.player(name).score < 10 then - return 0 - end + local pstat = ctf_stats.player(name) + if not pstat or not pstat.score or pstat.score < 10 then + return 0 + end - if listname ~= "pro" or ctf_stats.is_pro(name) then + if not ctf_map.is_item_allowed_in_team_chest(listname, stack, player) then + return 0 + end + + if listname ~= "pro" or ctf_stats.is_pro(name) then + local chestinv = minetest.get_inventory({type = "node", pos = pos}) + if chestinv:room_for_item("pro", stack) then return stack:get_count() else + -- handle overflow + local playerinv = player:get_inventory() + local leftovers = chestinv:add_item("pro", stack) + local leftover = chestinv:add_item("main", leftovers) + local n_stack = stack + n_stack:set_count(stack:get_count() - leftover:get_count()) + playerinv:remove_item("main", n_stack) return 0 end - end, - can_dig = function(pos, player) - return false - end, - on_metadata_inventory_put = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name() .. - " moves " .. (stack:get_name() or "stuff") .. " " .. - (stack:get_count() or 0) .. " to chest at " .. - minetest.pos_to_string(pos)) - end, - on_metadata_inventory_take = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name() .. - " takes " .. (stack:get_name() or "stuff") .. " " .. - (stack:get_count() or 0) .. " from chest at " .. - minetest.pos_to_string(pos)) + else + return 0 end - }) + end + + function def.allow_metadata_inventory_take(pos, listname, index, stack, player) + if listname == "helper" then + return 0 + end + + local name = player:get_player_name() + if chest_color ~= ctf.player(name).team then + minetest.chat_send_player(name, "You're not on team " .. chest_color) + return 0 + end + + if ctf_stats.player(name).score < 10 then + return 0 + end + + if listname ~= "pro" or ctf_stats.is_pro(name) then + return stack:get_count() + else + return 0 + end + end + + function def.on_metadata_inventory_put(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name() .. + " moves " .. (stack:get_name() or "stuff") .. " " .. + (stack:get_count() or 0) .. " to chest at " .. + minetest.pos_to_string(pos)) + end + + function def.on_metadata_inventory_take(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name() .. + " takes " .. (stack:get_name() or "stuff") .. " " .. + (stack:get_count() or 0) .. " from chest at " .. + minetest.pos_to_string(pos)) + end + + minetest.register_node("ctf_map_core:chest_" .. chest_color, def) end diff --git a/mods/ctf/ctf_map/ctf_map_core/init.lua b/mods/ctf/ctf_map/ctf_map_core/init.lua index ccb3734..ca88a73 100644 --- a/mods/ctf/ctf_map/ctf_map_core/init.lua +++ b/mods/ctf/ctf_map/ctf_map_core/init.lua @@ -34,10 +34,17 @@ dofile(modpath .. "/barrier.lua") if minetest.get_modpath("ctf") then dofile(modpath .. "/base.lua") dofile(modpath .. "/chest.lua") - dofile(modpath .. "/give_initial_stuff.lua") dofile(modpath .. "/meta_helpers.lua") dofile(modpath .. "/schem_map.lua") dofile(modpath .. "/maps_catalog.lua") ctf_match.register_on_build_time_end(ctf_map.remove_middle_barrier) + + give_initial_stuff.register_stuff_provider(function(player) + return ctf_map.map and ctf_map.map.initial_stuff or { + "default:pick_stone", + "default:sword_stone", + "default:torch 3", + } + end) end diff --git a/mods/ctf/ctf_map/ctf_map_core/meta_helpers.lua b/mods/ctf/ctf_map/ctf_map_core/meta_helpers.lua index 186609a..cbd5106 100644 --- a/mods/ctf/ctf_map/ctf_map_core/meta_helpers.lua +++ b/mods/ctf/ctf_map/ctf_map_core/meta_helpers.lua @@ -98,7 +98,7 @@ function ctf_map.register_treasures(map) end else -- If treasure is a part of map's initial stuff, don't register it - local blacklist = ctf_map.map.initial_stuff or give_initial_stuff.get_stuff() + local blacklist = ctf_map.map.initial_stuff or {} for _, def in pairs(ctf_treasure.get_default_treasures()) do local is_valid = true for _, b_item in pairs(blacklist) do diff --git a/mods/ctf/ctf_map/ctf_map_core/mod.conf b/mods/ctf/ctf_map/ctf_map_core/mod.conf index 3f6139b..f6f0c72 100644 --- a/mods/ctf/ctf_map/ctf_map_core/mod.conf +++ b/mods/ctf/ctf_map/ctf_map_core/mod.conf @@ -1,3 +1,3 @@ name = ctf_map_core depends = default -optional_depends = ctf, ctf_match, ctf_stats, ctf_treasure, stairs, wool, irc, physics +optional_depends = ctf, ctf_match, ctf_stats, ctf_treasure, stairs, wool, irc, physics, give_initial_stuff diff --git a/mods/ctf/ctf_treasure/init.lua b/mods/ctf/ctf_treasure/init.lua index dbbe0ad..0a4542b 100644 --- a/mods/ctf/ctf_treasure/init.lua +++ b/mods/ctf/ctf_treasure/init.lua @@ -10,7 +10,6 @@ function ctf_treasure.get_default_treasures() { "ctf_traps:damage_cobble", 0.3, 4, { 10, 20 } }, { "default:pick_steel", 0.5, 5, { 1, 10 } }, - { "default:sword_steel", 0.4, 5, { 1, 4 } }, { "default:shovel_stone", 0.6, 5, { 1, 10 } }, { "default:shovel_steel", 0.3, 5, { 1, 10 } }, { "default:axe_steel", 0.4, 5, { 1, 10 } }, @@ -21,11 +20,10 @@ function ctf_treasure.get_default_treasures() { "shooter:machine_gun", 0.02, 2, 1 }, { "shooter:crossbow", 0.5, 2, { 1, 5 } }, { "shooter:pistol", 0.4, 2, { 1, 5 } }, - { "shooter:rifle", 0.1, 2, { 1, 2 } }, + { "shooter:ammo", 0.3, 2, { 1, 10 } }, { "shooter:arrow_white", 0.5, 2, { 2, 18 } }, { "medkits:medkit", 0.8, 5, 2 }, - { "ctf_bandages:bandage", 0.8, 2, { 2, 4 } } } end diff --git a/mods/ctf/ctf_map/ctf_map_core/give_initial_stuff.lua b/mods/other/give_initial_stuff/init.lua similarity index 54% rename from mods/ctf/ctf_map/ctf_map_core/give_initial_stuff.lua rename to mods/other/give_initial_stuff/init.lua index 4878616..6ba9cd5 100644 --- a/mods/ctf/ctf_map/ctf_map_core/give_initial_stuff.lua +++ b/mods/other/give_initial_stuff/init.lua @@ -12,7 +12,7 @@ setmetatable(give_initial_stuff, { inv:set_size("craftresult", 0) inv:set_size("hand", 0) - local items = give_initial_stuff.get_stuff() + local items = give_initial_stuff.get_stuff(player) for _, item in pairs(items) do inv:add_item("main", item) @@ -20,12 +20,24 @@ setmetatable(give_initial_stuff, { end }) -function give_initial_stuff.get_stuff() - return ctf_map.map and ctf_map.map.initial_stuff or { - "default:pick_stone", - "default:sword_stone", - "default:torch 3", - } +local registered_stuff_providers = {} +function give_initial_stuff.register_stuff_provider(func, priority) + table.insert(registered_stuff_providers, + priority or (#registered_stuff_providers + 1), + func) +end + +function give_initial_stuff.get_stuff(player) + local stuff = {} + for i=1, #registered_stuff_providers do + local new_stuff = registered_stuff_providers[i](player) + assert(new_stuff) + + for j=1, #new_stuff do + stuff[#stuff + 1] = new_stuff[j] + end + end + return stuff end minetest.register_on_joinplayer(function(player) diff --git a/mods/other/give_initial_stuff/mod.conf b/mods/other/give_initial_stuff/mod.conf new file mode 100644 index 0000000..3fae27e --- /dev/null +++ b/mods/other/give_initial_stuff/mod.conf @@ -0,0 +1,2 @@ +name = give_initial_stuff +description = API to give give_initial_stuff diff --git a/mods/pvp/dropondie/init.lua b/mods/pvp/dropondie/init.lua index 2021210..5da568c 100644 --- a/mods/pvp/dropondie/init.lua +++ b/mods/pvp/dropondie/init.lua @@ -36,7 +36,7 @@ local function drop_all(player) pos.y = math.floor(pos.y + 0.5) local inv = player:get_inventory() - for _, item in pairs(give_initial_stuff.get_stuff()) do + for _, item in pairs(give_initial_stuff.get_stuff(player)) do inv:remove_item("main", ItemStack(item)) end drop_list(pos, inv, "main") diff --git a/mods/pvp/dropondie/mod.conf b/mods/pvp/dropondie/mod.conf index 09918c0..4c1f8b5 100644 --- a/mods/pvp/dropondie/mod.conf +++ b/mods/pvp/dropondie/mod.conf @@ -1,3 +1,3 @@ name = dropondie -depends = ctf_map_core +depends = give_initial_stuff description = With this mod, players will drop all their items in their inventory on the ground when they die.