99 lines
2.4 KiB
Lua
99 lines
2.4 KiB
Lua
|
function ctf_classes.register(cname, def)
|
||
|
assert(not ctf_classes.__classes[cname])
|
||
|
def.name = cname
|
||
|
ctf_classes.__classes[cname] = def
|
||
|
table.insert(ctf_classes.__classes_ordered, def)
|
||
|
|
||
|
def.max_hp = def.max_hp or 20
|
||
|
def.speed = def.speed or 1
|
||
|
def.pros = def.pros or {}
|
||
|
def.cons = def.cons or {}
|
||
|
end
|
||
|
|
||
|
function ctf_classes.set_skin(player, color, class)
|
||
|
player:set_properties({
|
||
|
textures = {"ctf_classes_skins_" .. class.name .. "_" .. (color or "blue") .. ".png"}
|
||
|
})
|
||
|
end
|
||
|
|
||
|
function ctf_classes.get(player)
|
||
|
if type(player) == "string" then
|
||
|
player = minetest.get_player_by_name(player)
|
||
|
end
|
||
|
|
||
|
local cname = player:get_meta():get("ctf_classes:class") or "knight"
|
||
|
return ctf_classes.__classes[cname]
|
||
|
end
|
||
|
|
||
|
function ctf_classes.set(player, cname)
|
||
|
assert(type(cname) == "string")
|
||
|
local class = ctf_classes.__classes[cname]
|
||
|
assert(class)
|
||
|
|
||
|
local meta = player:get_meta()
|
||
|
local old = meta:get("ctf_classes:class")
|
||
|
meta:set_string("ctf_classes:class", cname)
|
||
|
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))
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local function set_max_hp(player, max_hp)
|
||
|
local cur_hp = player:get_hp()
|
||
|
local new_hp = cur_hp + max_hp - player:get_properties().hp_max
|
||
|
player:set_properties({
|
||
|
hp_max = max_hp
|
||
|
})
|
||
|
|
||
|
assert(new_hp <= max_hp)
|
||
|
if cur_hp > max_hp then
|
||
|
player:set_hp(max_hp)
|
||
|
elseif new_hp > cur_hp then
|
||
|
player:set_hp(new_hp)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function ctf_classes.update(player)
|
||
|
local class = ctf_classes.get(player)
|
||
|
local color, _ = ctf_colors.get_color(ctf.player(player:get_player_name()))
|
||
|
|
||
|
set_max_hp(player, class.max_hp)
|
||
|
ctf_classes.set_skin(player, color, class)
|
||
|
physics.set(player:get_player_name(), "ctf_classes:speed", {
|
||
|
speed = class.speed,
|
||
|
})
|
||
|
end
|
||
|
|
||
|
local function sqdist(a, b)
|
||
|
local x = a.x - b.x
|
||
|
local y = a.y - b.y
|
||
|
local z = a.z - b.z
|
||
|
return x*x + y*y + z*z
|
||
|
end
|
||
|
|
||
|
local function get_flag_pos(player)
|
||
|
local tplayer = ctf.player(player:get_player_name())
|
||
|
if not tplayer or not tplayer.team then
|
||
|
return nil
|
||
|
end
|
||
|
|
||
|
local team = ctf.team(tplayer.team)
|
||
|
if team and team.flags[1] then
|
||
|
return vector.new(team.flags[1])
|
||
|
end
|
||
|
return nil
|
||
|
end
|
||
|
|
||
|
function ctf_classes.can_change(player)
|
||
|
local flag_pos = get_flag_pos(player)
|
||
|
if not flag_pos then
|
||
|
return false
|
||
|
end
|
||
|
|
||
|
return sqdist(player:get_pos(), flag_pos) < 25
|
||
|
end
|