Add ctf_markers mod
This commit is contained in:
parent
1a2948b359
commit
67975e74c7
3 changed files with 134 additions and 2 deletions
128
mods/ctf/ctf_marker/init.lua
Normal file
128
mods/ctf/ctf_marker/init.lua
Normal file
|
@ -0,0 +1,128 @@
|
|||
-- Locally cache list of team members when adding
|
||||
-- marker, because the members in the team needn't
|
||||
-- be the same within an extended duration of time
|
||||
local teams = {}
|
||||
local visibility_time = 10
|
||||
|
||||
-- Convenience function that returns passed
|
||||
-- string enclosed by color escape codes
|
||||
local function msg(str)
|
||||
if not str then
|
||||
return
|
||||
end
|
||||
return minetest.colorize("#ABCDEF", str)
|
||||
end
|
||||
|
||||
-- Remove waypoint element for valid players in team tname
|
||||
local function remove_marker(tname)
|
||||
for name, hud in pairs(teams[tname].players) do
|
||||
local player = minetest.get_player_by_name(name)
|
||||
if player then
|
||||
player:hud_remove(hud)
|
||||
end
|
||||
end
|
||||
teams[tname] = nil
|
||||
end
|
||||
|
||||
-- Add waypoint element to all players in the same team as name
|
||||
local function add_marker(name, tname, pos, str)
|
||||
local player = minetest.get_player_by_name(name)
|
||||
if not player then
|
||||
return
|
||||
end
|
||||
|
||||
local team = ctf.team(tname)
|
||||
|
||||
teams[tname] = {
|
||||
players = {},
|
||||
time = 0
|
||||
}
|
||||
for pname, _ in pairs(team.players) do
|
||||
local tplayer = minetest.get_player_by_name(pname)
|
||||
if tplayer then
|
||||
teams[tname].players[pname] = tplayer:hud_add({
|
||||
hud_elem_type = "waypoint",
|
||||
name = str,
|
||||
number = ctf.flag_colors[team.data.color],
|
||||
world_pos = pos
|
||||
})
|
||||
end
|
||||
minetest.chat_send_player(pname,
|
||||
msg("Player " .. name .. " placed a marker!"))
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_globalstep(function(dtime)
|
||||
for tname, team in pairs(teams) do
|
||||
-- Increment time of team marker
|
||||
local time = team.time + dtime
|
||||
teams[tname].time = time
|
||||
|
||||
-- If time > visibility_time, destroy team marker
|
||||
if time >= visibility_time then
|
||||
remove_marker(tname)
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
minetest.register_chatcommand("m", {
|
||||
param = "[Optional description]",
|
||||
description = "Allows players to share the location of where " ..
|
||||
"they're looking at with their team-mates.",
|
||||
privs = { interact = true },
|
||||
func = function(name, param)
|
||||
local player = minetest.get_player_by_name(name)
|
||||
if not player then
|
||||
return
|
||||
end
|
||||
|
||||
-- Calculate marker pos
|
||||
local dir = player:get_look_dir()
|
||||
local p1 = vector.add(player:get_pos(),
|
||||
{ x = 0, y = player:get_properties().eye_height, z = 0})
|
||||
p1 = vector.add(p1, dir)
|
||||
local p2 = vector.add(p1, vector.multiply(dir, 500))
|
||||
local pointed = minetest.raycast(p1, p2, true, true):next()
|
||||
|
||||
if not pointed then
|
||||
minetest.chat_send_player(name, msg("Pointed thing out of range!"))
|
||||
return
|
||||
end
|
||||
|
||||
local tname = ctf.player(name).team
|
||||
|
||||
-- Handle waypoint string
|
||||
local str = (param and param:trim() ~= "") and param or name .. "'s marker"
|
||||
if pointed.type == "object" then
|
||||
local concat
|
||||
local obj = pointed.ref
|
||||
if obj:is_player() then
|
||||
concat = obj:get_player_name()
|
||||
else
|
||||
local entity = obj:get_luaentity()
|
||||
-- If obj is item entity, append item description and count to str.
|
||||
-- Fallback to itemstring if description doesn't exist
|
||||
if entity.name == "__builtin:item" then
|
||||
local stack = ItemStack(entity.itemstring)
|
||||
local itemdef = minetest.registered_items[stack:get_name()]
|
||||
concat = itemdef.description or entity.itemstring
|
||||
concat = concat .. " " .. stack:get_count()
|
||||
else
|
||||
-- Pointed thing is a trivial entity, abort
|
||||
minetest.chat_send_player(name,
|
||||
msg("Invalid marker position. Please try again."))
|
||||
return
|
||||
end
|
||||
end
|
||||
str = concat and str .. " <" .. concat .. ">"
|
||||
end
|
||||
str = "[" .. str .. "]"
|
||||
|
||||
-- Remove existing marker if it exists
|
||||
if teams[tname] then
|
||||
remove_marker(tname)
|
||||
end
|
||||
|
||||
add_marker(name, tname, minetest.get_pointed_thing_position(pointed), str)
|
||||
end
|
||||
})
|
3
mods/ctf/ctf_marker/mod.conf
Normal file
3
mods/ctf/ctf_marker/mod.conf
Normal file
|
@ -0,0 +1,3 @@
|
|||
name = ctf_marker
|
||||
description = A chat-command allows team-mates to quickly know what a player is pointing at.
|
||||
depends = ctf
|
|
@ -49,7 +49,7 @@ function random_messages.read_messages()
|
|||
random_messages.messages = {
|
||||
"To talk to only your team, start your messages with /t. For example, /t Hello team!",
|
||||
"Use medkits to gradually restore your health.",
|
||||
"Moving or fighting while healing will interrupt the healing process.",
|
||||
"Moving or fighting while using medkits will interrupt the healing process.",
|
||||
"Steel swords do more damage than guns, but you need to be up close.",
|
||||
"Gain more score by killing more than you die, or by capturing the flag.",
|
||||
"You gain more score the better the opponent you defeat.",
|
||||
|
@ -68,7 +68,8 @@ function random_messages.read_messages()
|
|||
"Help your team claim victory by storing extra weapons in the team chest, and never taking more than you need.",
|
||||
"Excessive spawn-killing is a direct violation of the rules - appropriate punishments will be given.",
|
||||
"Use /r to check your score and rank, and /rankings to see the league tables.",
|
||||
"Use bandages on team-mates to heal them by 3-4 HP if their health is below 15 HP."
|
||||
"Use bandages on team-mates to heal them by 3-4 HP if their health is below 15 HP.",
|
||||
"Use /m to add a team marker at pointed location, that's visible only to team-mates."
|
||||
}
|
||||
end
|
||||
|
||||
|
|
Loading…
Reference in a new issue