Avoid issues with spectators in the future, once players are able to change weapons and optionally play with less than 3 weapons (closes #113)
This commit is contained in:
parent
b1a309bafd
commit
fb8639a9d4
@ -3,7 +3,10 @@ local S = minetest.get_translator("block_league")
|
|||||||
local function get_formspec() end
|
local function get_formspec() end
|
||||||
local function get_weapon_details() end
|
local function get_weapon_details() end
|
||||||
|
|
||||||
|
-- Funzionamento in breve: uso il metadato bl_profile_elem_active per tenere traccia
|
||||||
|
-- di una stringa equivalente al nome tecnico di un'arma o di un'abilità, senza
|
||||||
|
-- "block_league:". In caso di un'arma uso i campi del formspec weap e wslot; per
|
||||||
|
-- le abilità skill e sslot
|
||||||
|
|
||||||
function block_league.show_profile(p_name)
|
function block_league.show_profile(p_name)
|
||||||
minetest.get_player_by_name(p_name):get_meta():set_string("bl_profile_elem_active", "")
|
minetest.get_player_by_name(p_name):get_meta():set_string("bl_profile_elem_active", "")
|
||||||
|
@ -164,7 +164,6 @@ end
|
|||||||
|
|
||||||
|
|
||||||
function create_panel(arena, sp_name, p_name, y_offset)
|
function create_panel(arena, sp_name, p_name, y_offset)
|
||||||
|
|
||||||
local name = string.len(p_name) < 13 and p_name or string.sub(p_name, 1, 12) .. "..."
|
local name = string.len(p_name) < 13 and p_name or string.sub(p_name, 1, 12) .. "..."
|
||||||
local skin = minetest.get_player_by_name(p_name):get_properties().textures[1]
|
local skin = minetest.get_player_by_name(p_name):get_properties().textures[1]
|
||||||
local skin_clean = string.match(skin, "(.*)^%[")
|
local skin_clean = string.match(skin, "(.*)^%[")
|
||||||
@ -181,9 +180,9 @@ function create_panel(arena, sp_name, p_name, y_offset)
|
|||||||
end
|
end
|
||||||
|
|
||||||
local teamID = arena.players[p_name].teamID
|
local teamID = arena.players[p_name].teamID
|
||||||
|
local p_weaps = block_league.get_player_weapons(p_name)
|
||||||
|
|
||||||
if teamID == 1 then
|
if teamID == 1 then
|
||||||
|
|
||||||
Panel:new("bl_spectate_" .. p_name, {
|
Panel:new("bl_spectate_" .. p_name, {
|
||||||
player = sp_name,
|
player = sp_name,
|
||||||
bg = "",
|
bg = "",
|
||||||
@ -205,17 +204,17 @@ function create_panel(arena, sp_name, p_name, y_offset)
|
|||||||
weapon1 = {
|
weapon1 = {
|
||||||
scale = { x = 1.4, y = 1.4 },
|
scale = { x = 1.4, y = 1.4 },
|
||||||
offset = { x = 60, y = 10 },
|
offset = { x = 60, y = 10 },
|
||||||
text = "bl_smg.png"
|
text = p_weaps[1] and minetest.registered_nodes[p_weaps[1]].inventory_image
|
||||||
},
|
},
|
||||||
weapon2 = {
|
weapon2 = {
|
||||||
scale = { x = 1.4, y = 1.4 },
|
scale = { x = 1.4, y = 1.4 },
|
||||||
offset = { x = 85, y = 10 },
|
offset = { x = 85, y = 10 },
|
||||||
text = "bl_sword.png"
|
text = p_weaps[2] and minetest.registered_nodes[p_weaps[2]].inventory_image
|
||||||
},
|
},
|
||||||
weapon3 = {
|
weapon3 = {
|
||||||
scale = { x = 1.4, y = 1.4 },
|
scale = { x = 1.4, y = 1.4 },
|
||||||
offset = { x = 110, y = 10 },
|
offset = { x = 110, y = 10 },
|
||||||
text = "bl_pixelgun.png"
|
text = p_weaps[3] and minetest.registered_nodes[p_weaps[3]].inventory_image
|
||||||
},
|
},
|
||||||
skill = {
|
skill = {
|
||||||
scale = { x = 1.4, y = 1.4 },
|
scale = { x = 1.4, y = 1.4 },
|
||||||
@ -257,7 +256,6 @@ function create_panel(arena, sp_name, p_name, y_offset)
|
|||||||
})
|
})
|
||||||
|
|
||||||
else
|
else
|
||||||
|
|
||||||
Panel:new("bl_spectate_" .. p_name, {
|
Panel:new("bl_spectate_" .. p_name, {
|
||||||
player = sp_name,
|
player = sp_name,
|
||||||
bg = "",
|
bg = "",
|
||||||
@ -279,17 +277,17 @@ function create_panel(arena, sp_name, p_name, y_offset)
|
|||||||
weapon1 = {
|
weapon1 = {
|
||||||
scale = { x = 1.4, y = 1.4 },
|
scale = { x = 1.4, y = 1.4 },
|
||||||
offset = { x = -110, y = 10 },
|
offset = { x = -110, y = 10 },
|
||||||
text = "bl_smg.png"
|
text = p_weaps[1] and minetest.registered_nodes[p_weaps[1]].inventory_image
|
||||||
},
|
},
|
||||||
weapon2 = {
|
weapon2 = {
|
||||||
scale = { x = 1.4, y = 1.4 },
|
scale = { x = 1.4, y = 1.4 },
|
||||||
offset = { x = -85, y = 10 },
|
offset = { x = -85, y = 10 },
|
||||||
text = "bl_sword.png"
|
text = p_weaps[2] and minetest.registered_nodes[p_weaps[2]].inventory_image
|
||||||
},
|
},
|
||||||
weapon3 = {
|
weapon3 = {
|
||||||
scale = { x = 1.4, y = 1.4 },
|
scale = { x = 1.4, y = 1.4 },
|
||||||
offset = { x = -60, y = 10 },
|
offset = { x = -60, y = 10 },
|
||||||
text = "bl_pixelgun.png"
|
text = p_weaps[3] and minetest.registered_nodes[p_weaps[3]].inventory_image
|
||||||
},
|
},
|
||||||
skill = {
|
skill = {
|
||||||
scale = { x = 1.4, y = 1.4 },
|
scale = { x = 1.4, y = 1.4 },
|
||||||
|
@ -1,29 +1,9 @@
|
|||||||
local function get_bullet_count() end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function block_league.HUD_weapons_create(p_name, is_spectator)
|
function block_league.HUD_weapons_create(p_name, is_spectator)
|
||||||
local inv = "" -- TODO: cementato. Quando potran cambiare equip con nuove armi, cambiare
|
local inv = minetest.get_player_by_name(p_name):get_inventory()
|
||||||
local sub_img_elems = {}
|
local sub_img_elems = {}
|
||||||
local sub_txt_elems = {}
|
local sub_txt_elems = {}
|
||||||
local offset_x = -90
|
local offset_x = -90
|
||||||
local offset_y
|
local offset_y = is_spectator and -160 or -125
|
||||||
|
|
||||||
if is_spectator then
|
|
||||||
local arena = arena_lib.get_arena_by_player(p_name)
|
|
||||||
local random_p
|
|
||||||
|
|
||||||
for pl_name, _ in pairs(arena.players) do
|
|
||||||
random_p = minetest.get_player_by_name(pl_name)
|
|
||||||
break
|
|
||||||
end
|
|
||||||
|
|
||||||
inv = random_p:get_inventory()
|
|
||||||
offset_y = -160
|
|
||||||
else
|
|
||||||
inv = minetest.get_player_by_name(p_name):get_inventory()
|
|
||||||
offset_y = -125
|
|
||||||
end
|
|
||||||
|
|
||||||
-- mirino
|
-- mirino
|
||||||
Panel:new("bl_crosshair", {
|
Panel:new("bl_crosshair", {
|
||||||
@ -35,18 +15,19 @@ function block_league.HUD_weapons_create(p_name, is_spectator)
|
|||||||
})
|
})
|
||||||
|
|
||||||
-- armi
|
-- armi
|
||||||
-- TODO: in futuro, con nuove armi non + possibile usare w_name perché ogni gioc
|
|
||||||
-- avrà suo equip. Due possibili approcci:
|
|
||||||
-- 1. trovare modo x usare ID caselle al posto di w_name (ma dovrò fare
|
|
||||||
-- get_stack(ID):get_name() == w_name ogni volta?)
|
|
||||||
-- 2. ricreare HUD ogni volta che si cambia gioc seguitə, e mantenere w_name. Non
|
|
||||||
-- dovrebbe dar problemi con async perché armi non sparano su globalstep, non so
|
|
||||||
-- però se potrebbe creare casini con gli after invocati dalle armi
|
|
||||||
for i = 1, 3 do
|
for i = 1, 3 do
|
||||||
local w_name = inv:get_stack("main", i):get_name() ~= "" and inv:get_stack("main", i):get_name() or ("NIL" .. i)
|
local w_name = ""
|
||||||
local weapon = minetest.registered_nodes[w_name]
|
local weapon = {}
|
||||||
|
|
||||||
sub_img_elems[w_name .. "_bg"] = {
|
-- dato che quando entrano, lɜ spettanti non sono ancora dentro alla spettatore,
|
||||||
|
-- inizializzo stringhe vuote che verranno colmate dal primo on_change_spectated_target
|
||||||
|
-- (che è istantaneo)
|
||||||
|
if not is_spectator then
|
||||||
|
w_name = inv:get_stack("main", i):get_name() ~= "" and inv:get_stack("main", i):get_name() or ""
|
||||||
|
weapon = minetest.registered_nodes[w_name]
|
||||||
|
end
|
||||||
|
|
||||||
|
sub_img_elems[i .. "_bg"] = {
|
||||||
scale = { x = 2, y = 2 },
|
scale = { x = 2, y = 2 },
|
||||||
offset = { x = offset_x, y = offset_y },
|
offset = { x = offset_x, y = offset_y },
|
||||||
alignment = { x = 0, y = 1 },
|
alignment = { x = 0, y = 1 },
|
||||||
@ -55,7 +36,7 @@ function block_league.HUD_weapons_create(p_name, is_spectator)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if weapon then
|
if weapon then
|
||||||
sub_img_elems[w_name .. "_icon"] = {
|
sub_img_elems[i .. "_icon"] = {
|
||||||
scale = { x = 2, y = 2 },
|
scale = { x = 2, y = 2 },
|
||||||
offset = { x = offset_x, y = offset_y },
|
offset = { x = offset_x, y = offset_y },
|
||||||
alignment = { x = -1, y = 1 },
|
alignment = { x = -1, y = 1 },
|
||||||
@ -63,7 +44,7 @@ function block_league.HUD_weapons_create(p_name, is_spectator)
|
|||||||
z_index = 1
|
z_index = 1
|
||||||
}
|
}
|
||||||
|
|
||||||
sub_txt_elems[w_name .. "_magazine_txt"] = {
|
sub_txt_elems[i .. "_magazine_txt"] = {
|
||||||
alignment = { x = 0, y = 1 },
|
alignment = { x = 0, y = 1 },
|
||||||
offset = { x = offset_x + 30, y = offset_y + 6 },
|
offset = { x = offset_x + 30, y = offset_y + 6 },
|
||||||
text = weapon.magazine or "",
|
text = weapon.magazine or "",
|
||||||
@ -90,10 +71,20 @@ end
|
|||||||
|
|
||||||
|
|
||||||
function block_league.HUD_weapons_update(arena, p_name, w_name, is_reloading)
|
function block_league.HUD_weapons_update(arena, p_name, w_name, is_reloading)
|
||||||
local weapon = minetest.registered_nodes[w_name]
|
local inv_main = minetest.get_player_by_name(p_name):get_inventory():get_list("main") -- TODO: per ottimizzare, salva (e solo i nomi) quando entrano
|
||||||
local current_magazine = not weapon.magazine and "" or arena.players[p_name].weapons_magazine[w_name]
|
local slot_id
|
||||||
|
|
||||||
local panel = panel_lib.get_panel(p_name, "bl_weapons")
|
for i = 1, 3 do
|
||||||
|
if inv_main[i]:get_name() == w_name then
|
||||||
|
slot_id = i
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- se è casella vuota, annulla
|
||||||
|
if not slot_id then return end
|
||||||
|
|
||||||
|
local weapon = minetest.registered_nodes[w_name] or {} -- TODO: è possibile che sia vuota?
|
||||||
|
local current_magazine = not weapon.magazine and "" or arena.players[p_name].weapons_magazine[w_name]
|
||||||
local bg_pic = ""
|
local bg_pic = ""
|
||||||
|
|
||||||
if is_reloading then
|
if is_reloading then
|
||||||
@ -104,17 +95,37 @@ function block_league.HUD_weapons_update(arena, p_name, w_name, is_reloading)
|
|||||||
bg_pic = "bl_hud_bullets_bg.png"
|
bg_pic = "bl_hud_bullets_bg.png"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local panel = panel_lib.get_panel(p_name, "bl_weapons")
|
||||||
|
|
||||||
panel:update(nil,
|
panel:update(nil,
|
||||||
{[w_name .. "_magazine_txt"] = { text = current_magazine }},
|
{[slot_id .. "_magazine_txt"] = { text = current_magazine }},
|
||||||
{[w_name .. "_bg"] = { text = bg_pic }}
|
{[slot_id .. "_bg"] = { text = bg_pic }}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
local icon = weapon.inventory_image or "" -- TODO: è possibile che sia vuota?
|
||||||
|
|
||||||
for sp_name, _ in pairs(arena_lib.get_player_spectators(p_name)) do
|
for sp_name, _ in pairs(arena_lib.get_player_spectators(p_name)) do
|
||||||
local panel_sp = panel_lib.get_panel(sp_name, "bl_weapons")
|
local panel_sp = panel_lib.get_panel(sp_name, "bl_weapons")
|
||||||
|
|
||||||
panel_sp:update(nil,
|
panel_sp:update(nil,
|
||||||
{[w_name .. "_magazine_txt"] = { text = current_magazine }},
|
{[slot_id .. "_magazine_txt"] = { text = current_magazine }},
|
||||||
{[w_name .. "_bg"] = { text = bg_pic }}
|
{[slot_id .. "_bg"] = { text = bg_pic }, [slot_id .. "_icon"] = {text = icon}}
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- funzione chiamata esclusivamente quando spettanti cambiano giocante seguitə e
|
||||||
|
-- questə ha un buco nella casella dove lə giocante precedente invece aveva un'arma.
|
||||||
|
-- In altre parole, svuoto la casella
|
||||||
|
function block_league.HUD_weapons_update_empty(p_name, empty_id)
|
||||||
|
for sp_name, _ in pairs(arena_lib.get_player_spectators(p_name)) do
|
||||||
|
local panel_sp = panel_lib.get_panel(sp_name, "bl_weapons")
|
||||||
|
|
||||||
|
panel_sp:update(nil,
|
||||||
|
{[empty_id .. "_magazine_txt"] = { text = "" }},
|
||||||
|
{[empty_id .. "_bg"] = { text = "bl_hud_bullets_bg.png" }, [empty_id .. "_icon"] = { text = ""}}
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -132,25 +143,3 @@ function block_league.HUD_crosshair_update(p_name, w_name, is_reloading)
|
|||||||
|
|
||||||
panel:update({bg = weap.crosshair .. col})
|
panel:update({bg = weap.crosshair .. col})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
----------------------------------------------
|
|
||||||
---------------FUNZIONI LOCALI----------------
|
|
||||||
----------------------------------------------
|
|
||||||
|
|
||||||
function get_bullet_count(definition, inv)
|
|
||||||
if not definition.bullet then return end
|
|
||||||
|
|
||||||
for i=0,inv:get_size("main"),1 do
|
|
||||||
|
|
||||||
local stack = inv:get_stack("main", i)
|
|
||||||
local item_name = stack:get_name()
|
|
||||||
|
|
||||||
if item_name == definition.bullet then
|
|
||||||
return stack:get_count()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
@ -15,8 +15,14 @@ arena_lib.on_change_spectated_target("block_league", function(arena, sp_name, t_
|
|||||||
minetest.get_player_by_name(sp_name):hud_set_flags({healthbar = true})
|
minetest.get_player_by_name(sp_name):hud_set_flags({healthbar = true})
|
||||||
end
|
end
|
||||||
|
|
||||||
for _, weap_name in pairs(block_league.get_player_weapons(t_name)) do
|
local p_weaps = block_league.get_player_weapons(t_name)
|
||||||
block_league.HUD_weapons_update(arena, t_name, weap_name)
|
|
||||||
|
for i = 1, 3 do
|
||||||
|
if p_weaps[i] then
|
||||||
|
block_league.HUD_weapons_update(arena, t_name, p_weaps[i])
|
||||||
|
else
|
||||||
|
block_league.HUD_weapons_update_empty(t_name, i)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
block_league.HUD_skill_update(sp_name)
|
block_league.HUD_skill_update(sp_name)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user