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

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

View file

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

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") .. "/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)

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

View file

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