Add class items

This commit is contained in:
rubenwardy 2020-03-13 21:58:42 +00:00
parent f610722b83
commit 02d527eaf5
18 changed files with 384 additions and 211 deletions

View file

@ -3,7 +3,7 @@
local healing_limit = 15 local healing_limit = 15
minetest.register_craftitem("ctf_bandages:bandage", { 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", inventory_image = "ctf_bandages_bandage.png",
on_use = function(itemstack, player, pointed_thing) on_use = function(itemstack, player, pointed_thing)
if pointed_thing.type ~= "object" then if pointed_thing.type ~= "object" then

View file

@ -15,6 +15,11 @@ function ctf_classes.register(cname, def)
def.properties.max_hp = def.properties.max_hp or 20 def.properties.max_hp = def.properties.max_hp or 20
end 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) function ctf_classes.set_skin(player, color, class)
player:set_properties({ player:set_properties({
textures = {"ctf_classes_skin_" .. class.name .. "_" .. (color or "blue") .. ".png"} textures = {"ctf_classes_skin_" .. class.name .. "_" .. (color or "blue") .. ".png"}
@ -30,20 +35,22 @@ function ctf_classes.get(player)
return ctf_classes.__classes[cname] return ctf_classes.__classes[cname]
end end
function ctf_classes.set(player, cname) function ctf_classes.set(player, new_name)
assert(type(cname) == "string") assert(type(new_name) == "string")
local class = ctf_classes.__classes[cname] local new = ctf_classes.__classes[new_name]
assert(class) assert(new)
local meta = player:get_meta() local meta = player:get_meta()
local old = meta:get("ctf_classes:class") local old_name = meta:get("ctf_classes:class")
meta:set_string("ctf_classes:class", cname)
meta:set_string("ctf_classes:class", new_name)
ctf_classes.update(player) ctf_classes.update(player)
if old ~= nil and old ~= cname then if old_name == nil or old_name ~= new_name then
local pname = player:get_player_name() local old = old_name and ctf_classes.__classes[old_name]
ctf.chat_send_team(ctf.player(pname).team, for i=1, #registered_on_changed do
minetest.colorize("#ABCDEF", pname .. " is now a " .. class.description)) registered_on_changed[i](player, old, new)
end
end end
end end
@ -68,13 +75,21 @@ local function set_max_hp(player, max_hp)
end end
function ctf_classes.update(player) function ctf_classes.update(player)
local name = player:get_player_name()
local class = ctf_classes.get(player) 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) set_max_hp(player, class.properties.max_hp)
ctf_classes.set_skin(player, color, class) 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", { physics.set(player:get_player_name(), "ctf_classes:speed", {
speed = class.properties.speed, speed = speed,
}) })
end end

View file

@ -41,6 +41,24 @@ function ctf_classes.show_gui(name, player)
fs[#fs + 1] = ",#fcc," .. minetest.formspec_escape(item) fs[#fs + 1] = ",#fcc," .. minetest.formspec_escape(item)
end end
fs[#fs + 1] = "]" 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] = "button_exit[0.5,2.7;2,1;select_"
fs[#fs + 1] = class.name fs[#fs + 1] = class.name
fs[#fs + 1] = ";Select]" fs[#fs + 1] = ";Select]"

View file

@ -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") .. "/gui.lua")
dofile(minetest.get_modpath("ctf_classes") .. "/regen.lua") dofile(minetest.get_modpath("ctf_classes") .. "/regen.lua")
dofile(minetest.get_modpath("ctf_classes") .. "/ranged.lua") dofile(minetest.get_modpath("ctf_classes") .. "/ranged.lua")
dofile(minetest.get_modpath("ctf_classes") .. "/items.lua")
ctf_classes.register("knight", { ctf_classes.register("knight", {
description = "Knight", description = "Knight",
@ -16,16 +17,23 @@ ctf_classes.register("knight", {
properties = { properties = {
max_hp = 30, max_hp = 30,
speed = 0.90, speed = 0.90,
items = {
"default:sword_steel",
},
}, },
}) })
ctf_classes.register("shooter", { ctf_classes.register("shooter", {
description = "Shooter", description = "Sharp Shooter",
pros = { "+10% ranged skill", "Rifles and grappling hooks" }, pros = { "+10% ranged skill" },
cons = { "Can't capture the flag" }, cons = {},
color = "#c60", color = "#c60",
properties = { properties = {
can_capture = false, items = {
"shooter:rifle",
"shooter:grapple_gun_loaded",
}
}, },
}) })
@ -36,6 +44,10 @@ ctf_classes.register("medic", {
color = "#0af", color = "#0af",
properties = { properties = {
max_hp = 10, max_hp = 10,
items = {
"ctf_bandages:bandage 20",
},
}, },
}) })
@ -48,6 +60,14 @@ minetest.register_on_joinplayer(function(player)
end end
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", { minetest.register_chatcommand("class", {
func = function(name, params) func = function(name, params)
local player = minetest.get_player_by_name(name) local player = minetest.get_player_by_name(name)
@ -114,3 +134,13 @@ for _, flagname in pairs(flags) do
on_rightclick = show, on_rightclick = show,
}) })
end 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)

View file

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

View file

@ -1,3 +1,3 @@
name = ctf_classes 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 description = Adds classes, including knight, shooter, and medic

View file

@ -49,6 +49,13 @@ local function check_grapple(itemname)
return itemstack return itemstack
end 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, ...) return old_func(itemstack, user, ...)
end, end,
}) })

View file

@ -1,28 +1,33 @@
local full_ores = { local full_ores = {
{"diamond", "default:diamond"}, diamond = "default:diamond",
{"mese", "default:mese_crystal"}, mese = "default:mese_crystal",
{"bronze", "default:bronze_ingot"}, bronze = "default:bronze_ingot",
{"steel", "default:steel_ingot"}, steel = "default:steel_ingot",
{"stone", "default:cobble"}, stone = "default:cobble",
}
local upgrades = {
steel = "mese",
mese = "diamond",
} }
-- Swords -- Swords
for _, orex in pairs(full_ores) do for from, to in pairs(upgrades) do
crafting.register_recipe({ crafting.register_recipe({
type = "inv", type = "inv",
output = "default:sword_" .. orex[1], output = "default:sword_" .. to,
items = { "default:stick", orex[2] .. " 2" }, items = { "default:sword_" .. from, full_ores[to] .. " 2" },
always_known = true, always_known = true,
level = 1, level = 1,
}) })
end end
-- Pickaxes -- Pickaxes
for _, orex in pairs(full_ores) do for ore, ore_item in pairs(full_ores) do
crafting.register_recipe({ crafting.register_recipe({
type = "inv", type = "inv",
output = "default:pick_" .. orex[1], output = "default:pick_" .. ore,
items = { "default:stick 2", orex[2] .. " 3" }, items = { "default:stick 2", ore_item .. " 3" },
always_known = true, always_known = true,
level = 1, level = 1,
}) })
@ -187,22 +192,22 @@ crafting.register_recipe({
}) })
-- Shovels -- Shovels
for _, orex in pairs(full_ores) do for ore, ore_item in pairs(full_ores) do
crafting.register_recipe({ crafting.register_recipe({
type = "inv", type = "inv",
output = "default:shovel_" .. orex[1], output = "default:shovel_" .. ore,
items = { "default:stick 2", orex[2] }, items = { "default:stick 2", ore_item },
always_known = true, always_known = true,
level = 1, level = 1,
}) })
end end
-- Axes -- Axes
for _, orex in pairs(full_ores) do for ore, ore_item in pairs(full_ores) do
crafting.register_recipe({ crafting.register_recipe({
type = "inv", type = "inv",
output = "default:axe_" .. orex[1], output = "default:axe_" .. ore,
items = { "default:stick 2", orex[2] .. " 3" }, items = { "default:stick 2", ore_item .. " 3" },
always_known = true, always_known = true,
level = 1, level = 1,
}) })

View file

@ -50,13 +50,14 @@ function ctf_flag.collect_claimed()
return claimed return claimed
end end
function ctf_flag.get_claimed_by_player(name) function ctf_flag.has_flag(name)
local claimed = ctf_flag.collect_claimed() local claimed = ctf_flag.collect_claimed()
for _, flag in pairs(claimed) do for _, flag in pairs(claimed) do
if flag.claimed.player == name then if flag.claimed.player == name then
return name return true
end end
end end
return false
end end
function ctf_flag.player_drop_flag(name) function ctf_flag.player_drop_flag(name)

View file

@ -6,9 +6,24 @@ local blacklist = {
"default:aspen_leaves" "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"} local colors = {"red", "blue"}
for _, chest_color in pairs(colors) do for _, chest_color in pairs(colors) do
minetest.register_node("ctf_map_core:chest_" .. chest_color, { local def = {
description = "Chest", description = "Chest",
tiles = { tiles = {
"default_chest_top_" .. chest_color .. ".png", "default_chest_top_" .. chest_color .. ".png",
@ -22,185 +37,188 @@ for _, chest_color in pairs(colors) do
legacy_facedir_simple = true, legacy_facedir_simple = true,
is_ground_content = false, is_ground_content = false,
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
on_construct = function(pos) }
local meta = minetest.get_meta(pos)
meta:set_string("infotext", "Chest") function def.on_construct(pos)
local inv = meta:get_inventory() local meta = minetest.get_meta(pos)
inv:set_size("main", 4 * 7) meta:set_string("infotext", "Chest")
inv:set_size("pro", 4 * 7) local inv = meta:get_inventory()
inv:set_size("helper", 1 * 1) inv:set_size("main", 4 * 7)
end, inv:set_size("pro", 4 * 7)
on_rightclick = function(pos, node, player) inv:set_size("helper", 1 * 1)
local name = player:get_player_name() end
if chest_color ~= ctf.player(name).team then
minetest.chat_send_player(name, "You're not on team " .. chest_color) 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 return
end 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) local formspec = table.concat({
if chest_color ~= territory_owner then "size[8,12]",
if not territory_owner then default.gui_bg,
ctf.warning("ctf_map", "Unowned team chest") default.gui_bg_img,
minetest.set_node(pos, { name = "air" }) default.gui_slots,
return default.get_hotbar_bg(0,7.85),
end "list[current_player;main;0,7.85;8,1;]",
ctf.warning("ctf_map", "Wrong chest, changing to " .. "list[current_player;main;0,9.08;8,3;8]",
territory_owner .. " from " .. chest_color) }, "")
minetest.set_node(pos, "ctf_map_core:chest_" .. territory_owner)
end
local formspec = table.concat({ if ctf_stats.player(name).score < 10 then
"size[8,12]", local msg = "You need at least 10 score to access the team chest.\n" ..
default.gui_bg, "Try killing an enemy player, or at least try to capture the flag.\n" ..
default.gui_bg_img, "Find resources in chests scattered around the map."
default.gui_slots, formspec = formspec .. "label[0.75,3;" .. minetest.formspec_escape(msg) .. "]"
default.get_hotbar_bg(0,7.85), minetest.show_formspec(name, "ctf_map_core:no_access", formspec)
"list[current_player;main;0,7.85;8,1;]", return
"list[current_player;main;0,9.08;8,3;8]", end
}, "")
if ctf_stats.player(name).score < 10 then local is_pro = ctf_stats.is_pro(name)
local msg = "You need at least 10 score to access the team chest.\n" .. local chestinv = "nodemeta:" .. pos.x .. "," .. pos.y .. "," .. pos.z
"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) formspec = formspec .. "list[" .. chestinv .. ";main;0,0.3;4,7;]" ..
local chestinv = "nodemeta:" .. pos.x .. "," .. pos.y .. "," .. pos.z "background[4,-0.2;4.15,7.7;ctf_map_pro_section.png;false]"
formspec = formspec .. "list[" .. chestinv .. ";main;0,0.3;4,7;]" .. if is_pro then
"background[4,-0.2;4.15,7.7;ctf_map_pro_section.png;false]" 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 ..
formspec = formspec .. "list[" .. chestinv .. ";pro;4,0.3;4,7;]" .. "listring[" .. chestinv ..";main]" ..
"listring[" .. chestinv ..";pro]" .. "listring[current_player;main]"
"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 .. minetest.show_formspec(name, "ctf_map_core:chest", formspec)
"listring[" .. chestinv ..";main]" .. end
"listring[current_player;main]"
minetest.show_formspec(name, "ctf_map_core:chest", formspec) function def.allow_metadata_inventory_move(pos, from_list, from_index,
end, 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, if ctf_stats.player(name).score < 10 then
to_list, to_index, count, player) return 0
local name = player:get_player_name() end
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 if (from_list ~= "pro" and to_list ~= "pro") or ctf_stats.is_pro(name) then
return 0 if to_list == "helper" then
end -- handle move & overflow
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
local chestinv = minetest.get_inventory({type = "node", pos = pos}) local chestinv = minetest.get_inventory({type = "node", pos = pos})
if chestinv:room_for_item("pro", stack) then local playerinv = player:get_inventory()
return stack:get_count() local stack = chestinv:get_stack(from_list, from_index)
else local leftover = playerinv:add_item("main", stack)
-- handle overflow local n_stack = stack
local playerinv = player:get_inventory() n_stack:set_count(stack:get_count() - leftover:get_count())
local leftovers = chestinv:add_item("pro", stack) chestinv:remove_item("helper", stack)
local leftover = chestinv:add_item("main", leftovers) chestinv:remove_item("pro", n_stack)
local n_stack = stack return 0
n_stack:set_count(stack:get_count() - leftover:get_count()) elseif from_list == "helper" then
playerinv:remove_item("main", n_stack) return 0
return 0
end
else else
return 0 return count
end
end,
allow_metadata_inventory_take = function(pos, listname, index, stack, player)
if listname == "helper" then
return 0
end end
else
return 0
end
end
local name = player:get_player_name() function def.allow_metadata_inventory_put(pos, listname, index, stack, player)
if chest_color ~= ctf.player(name).team then local name = player:get_player_name()
minetest.chat_send_player(name, "You're not on team " .. chest_color) if chest_color ~= ctf.player(name).team then
return 0 minetest.chat_send_player(name, "You're not on team " .. chest_color)
end return 0
end
if ctf_stats.player(name).score < 10 then local pstat = ctf_stats.player(name)
return 0 if not pstat or not pstat.score or pstat.score < 10 then
end 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() return stack:get_count()
else 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 return 0
end end
end, else
can_dig = function(pos, player) return 0
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))
end 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 end

View file

@ -34,10 +34,17 @@ dofile(modpath .. "/barrier.lua")
if minetest.get_modpath("ctf") then if minetest.get_modpath("ctf") then
dofile(modpath .. "/base.lua") dofile(modpath .. "/base.lua")
dofile(modpath .. "/chest.lua") dofile(modpath .. "/chest.lua")
dofile(modpath .. "/give_initial_stuff.lua")
dofile(modpath .. "/meta_helpers.lua") dofile(modpath .. "/meta_helpers.lua")
dofile(modpath .. "/schem_map.lua") dofile(modpath .. "/schem_map.lua")
dofile(modpath .. "/maps_catalog.lua") dofile(modpath .. "/maps_catalog.lua")
ctf_match.register_on_build_time_end(ctf_map.remove_middle_barrier) 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 end

View file

@ -98,7 +98,7 @@ function ctf_map.register_treasures(map)
end end
else else
-- If treasure is a part of map's initial stuff, don't register it -- 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 for _, def in pairs(ctf_treasure.get_default_treasures()) do
local is_valid = true local is_valid = true
for _, b_item in pairs(blacklist) do for _, b_item in pairs(blacklist) do

View file

@ -1,3 +1,3 @@
name = ctf_map_core name = ctf_map_core
depends = default 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

View file

@ -10,7 +10,6 @@ function ctf_treasure.get_default_treasures()
{ "ctf_traps:damage_cobble", 0.3, 4, { 10, 20 } }, { "ctf_traps:damage_cobble", 0.3, 4, { 10, 20 } },
{ "default:pick_steel", 0.5, 5, { 1, 10 } }, { "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_stone", 0.6, 5, { 1, 10 } },
{ "default:shovel_steel", 0.3, 5, { 1, 10 } }, { "default:shovel_steel", 0.3, 5, { 1, 10 } },
{ "default:axe_steel", 0.4, 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:machine_gun", 0.02, 2, 1 },
{ "shooter:crossbow", 0.5, 2, { 1, 5 } }, { "shooter:crossbow", 0.5, 2, { 1, 5 } },
{ "shooter:pistol", 0.4, 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:ammo", 0.3, 2, { 1, 10 } },
{ "shooter:arrow_white", 0.5, 2, { 2, 18 } }, { "shooter:arrow_white", 0.5, 2, { 2, 18 } },
{ "medkits:medkit", 0.8, 5, 2 }, { "medkits:medkit", 0.8, 5, 2 },
{ "ctf_bandages:bandage", 0.8, 2, { 2, 4 } }
} }
end end

View file

@ -12,7 +12,7 @@ setmetatable(give_initial_stuff, {
inv:set_size("craftresult", 0) inv:set_size("craftresult", 0)
inv:set_size("hand", 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 for _, item in pairs(items) do
inv:add_item("main", item) inv:add_item("main", item)
@ -20,12 +20,24 @@ setmetatable(give_initial_stuff, {
end end
}) })
function give_initial_stuff.get_stuff() local registered_stuff_providers = {}
return ctf_map.map and ctf_map.map.initial_stuff or { function give_initial_stuff.register_stuff_provider(func, priority)
"default:pick_stone", table.insert(registered_stuff_providers,
"default:sword_stone", priority or (#registered_stuff_providers + 1),
"default:torch 3", 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 end
minetest.register_on_joinplayer(function(player) minetest.register_on_joinplayer(function(player)

View file

@ -0,0 +1,2 @@
name = give_initial_stuff
description = API to give give_initial_stuff

View file

@ -36,7 +36,7 @@ local function drop_all(player)
pos.y = math.floor(pos.y + 0.5) pos.y = math.floor(pos.y + 0.5)
local inv = player:get_inventory() 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)) inv:remove_item("main", ItemStack(item))
end end
drop_list(pos, inv, "main") drop_list(pos, inv, "main")

View file

@ -1,3 +1,3 @@
name = dropondie 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. description = With this mod, players will drop all their items in their inventory on the ground when they die.