Look at a fixed position on respawn (#1003)

By default, the map center calculated from the positions of the flags is used. Maps can specify a custom look position for each team if needed.
Only the horizontal look direction (rotation around the y axis) is affected, x (vertical) is always set to zero.
master
Gregor Parzefall 2022-05-09 22:50:39 +02:00 committed by GitHub
parent eb094ebf73
commit 65425850b9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 80 additions and 4 deletions

View File

@ -6,6 +6,23 @@ function ctf_map.skybox_exists(subdir)
return table.indexof(list, "skybox") ~= -1
end
-- calc_flag_center() calculates the center of a map from the positions of the flags.
local function calc_flag_center(map)
local flag_center = vector.zero()
local flag_count = 0
for _, team in pairs(map.teams) do
flag_center = flag_center + team.flag_pos
flag_count = flag_count + 1
end
flag_center = flag_center:apply(function(value)
return value / flag_count
end)
return flag_center
end
function ctf_map.load_map_meta(idx, dirname)
local meta = Settings(ctf_map.maps_dir .. dirname .. "/map.conf")
@ -159,6 +176,8 @@ function ctf_map.load_map_meta(idx, dirname)
end
end
map.flag_center = calc_flag_center(map)
if ctf_map.skybox_exists(ctf_map.maps_dir .. dirname) then
skybox.add({dirname, "#ffffff", [5] = "png"})

View File

@ -414,7 +414,55 @@ function ctf_map.show_map_save_form(player, scroll_pos)
end)
end,
}
idx = idx + 1.5
idx = idx + (0.7 / 2) + 0.3 + (0.3 / 2)
local look_pos = context[player].teams[teamname].look_pos
elements[teamname .. "_look_pos"] = {
type = "label",
label = "Look position: " .. (look_pos and vector.to_string(look_pos) or "auto"),
pos = {0.2, idx},
-- "The first line of text is now positioned centered exactly at the position specified."
-- https://github.com/minetest/minetest/blob/480d5f2d51ca8f7c4400b0918bb53b776e4ff440/doc/lua_api.txt#L2929
}
idx = idx + (0.3 / 2) + 0.1 + (0.7 / 2)
local btn_width = (9 - (ctf_gui.SCROLLBAR_WIDTH + 0.1) - 0.1) / 2
elements[teamname.."_look_pos_auto"] = {
type = "button",
label = "Auto",
pos = {0.2, idx - (ctf_gui.ELEM_SIZE.y / 2)},
size = {btn_width, ctf_gui.ELEM_SIZE.y},
func = function(pname, fields)
context[pname].teams[teamname].look_pos = nil
minetest.after(0.1, function()
ctf_map.show_map_save_form(pname, minetest.explode_scrollbar_event(fields.formcontent).value)
end)
end,
}
elements[teamname.."_look_pos_choose"] = {
type = "button",
label = "Choose",
pos = {0.2 + btn_width + 0.1, idx - (ctf_gui.ELEM_SIZE.y / 2)},
size = {btn_width, ctf_gui.ELEM_SIZE.y},
func = function(pname, fields)
ctf_map.get_pos_from_player(pname, 1, function(_, positions)
context[pname].teams[teamname].look_pos = positions[1]
minetest.after(0.1, function()
ctf_map.show_map_save_form(pname, minetest.explode_scrollbar_event(fields.formcontent).value)
end)
end)
end,
exit = true,
}
idx = idx + (0.7 / 2) + 0.3 + (0.7 / 2) + 0.5
end
-- CHEST ZONES

View File

@ -66,7 +66,6 @@ end
local function tp_player_near_flag(player)
local tname = ctf_teams.get(player)
if not tname then return end
local pos = vector.offset(ctf_map.current_map.teams[tname].flag_pos,
@ -74,10 +73,20 @@ local function tp_player_near_flag(player)
0.5,
math.random(-1, 1)
)
player:set_pos(pos)
local rotation_y = vector.dir_to_rotation(
vector.direction(pos, ctf_map.current_map.teams[tname].look_pos or ctf_map.current_map.flag_center)
).y
local function apply()
player:set_pos(pos)
player:set_look_vertical(0)
player:set_look_horizontal(rotation_y)
end
apply()
minetest.after(0.1, function() -- TODO remove after respawn bug will be fixed
if player:is_player() then
player:set_pos(pos)
apply()
end
end)