TANTE cose con gli achievement (separati)

master
Zughy 2020-08-13 22:10:31 +02:00
parent cd10249688
commit f990e271da
8 changed files with 36 additions and 56 deletions

View File

@ -28,14 +28,12 @@ end
function quake.show_achievement(p_name, achvmt_ID)
--TODO|DOUBT gestione in hub_manager se c'è?
function quake.show_achievement(mod_key, p_name, achvmt_ID)
local player = minetest.get_player_by_name(p_name)
local last_ID = saved_huds[p_name][#saved_huds[p_name]] -- prendo l'ultimo elemento della lista
local last_HUD = player:hud_get(last_ID)
local img = quake.achievements[achvmt_ID].img
local img = achievements_lib.get_achievement(mod_key, achvmt_ID).img
-- se già sta mostrando un achievement, slitto la HUD
if player:hud_get(last_ID).text ~= "" then

View File

@ -40,6 +40,7 @@ function quake.HUD_broadcast_player(p_name, msg, duration)
minetest.after(duration, function()
if not minetest.get_player_by_name(p_name) then return end -- potrebbe essersi disconnesso
if not player:hud_get(HUD_ID) then return end -- potrebbe essere uscito dalla partita (che rimuove la HUD)
local current_message = player:hud_get(HUD_ID).text
if msg == current_message then

View File

@ -77,8 +77,6 @@ function quake.HUD_stats_update(arena, p_name, stat)
local panel = panel_lib.get_panel(p_name, "quake_stats")
minetest.log("action", dump(panel))
if stat == "kill_leader" then
local kill_leader = arena.kill_leader
panel:update(nil,

View File

@ -176,7 +176,6 @@ function quake.shoot(p_name, targets, damage, has_knockback)
-- controllo se è shutdown PRIMA di ucciderlo, sennò si resetta killstreak
if remaining_HP <= 0 and arena.players[t_name].killstreak >= 3 and t_name ~= p_name then
quake.add_achievement(p_name, 4)
quake.show_achievement(p_name, 4)
arena_lib.send_message_players_in_arena(arena, minetest.colorize("#eea160", t_name .. " ") .. minetest.colorize("#d7ded7", S("has been stopped by @1", minetest.colorize("#eea160", p_name))))
end
@ -213,10 +212,8 @@ function after_shoot(arena, p_name, killed_players)
if killed_players == 2 then
quake.add_achievement(p_name, 6)
quake.show_achievement(p_name, 6)
elseif killed_players >= 3 then
quake.add_achievement(p_name, 7)
quake.show_achievement(p_name, 7)
end
arena_lib.send_message_players_in_arena(arena, minetest.colorize("#eea160", p_name .. " ") .. minetest.colorize("#d7ded7", S("has killed @1 players in a row!", killed_players)))
@ -260,7 +257,6 @@ function kill(arena, p_name, target)
if arena.first_blood == "" then
arena.first_blood = p_name
quake.add_achievement(p_name, 5)
quake.show_achievement(p_name, 5)
arena_lib.send_message_players_in_arena(arena, minetest.colorize("#eea160", p_name .. " ") .. minetest.colorize("#d7ded7", S("drew first blood")))
end
@ -275,17 +271,14 @@ function kill(arena, p_name, target)
arena_lib.send_message_players_in_arena(arena, minetest.colorize("#eea160", p_name .. " ") .. minetest.colorize("#d7ded7", S("is on a @1", minetest.colorize("#eea160", S("killing spree")))) .. minetest.colorize("#d7ded7", "!"))
--quake.add_xp(p_name, 10)
quake.add_achievement(p_name, 1)
quake.show_achievement(p_name, 1)
elseif p_stats.killstreak == 5 then
arena_lib.send_message_players_in_arena(arena, minetest.colorize("#eea160", p_name .. " ") .. minetest.colorize("#d7ded7", S("is @1", minetest.colorize("#eea160", S("unstoppable")))) .. minetest.colorize("#d7ded7", "!"))
--quake.add_xp(p_name, 25)
quake.add_achievement(p_name, 2)
quake.show_achievement(p_name, 2)
elseif p_stats.killstreak == 7 then
arena_lib.send_message_players_in_arena(arena, minetest.colorize("#eea160", p_name .. " ") .. minetest.colorize("#d7ded7", S("made a @1", minetest.colorize("#eea160", S("bloodbath")))) .. minetest.colorize("#d7ded7", "!"))
--quake.add_xp(p_name, 50)
quake.add_achievement(p_name, 3)
quake.show_achievement(p_name, 3)
end
-- aggiorno HUD

View File

@ -5,30 +5,25 @@
local S = minetest.get_translator("quake")
quake.achievements = {
local achievements = {
[1] = { name = S("killing spree"), img = "quake_achievement_killstreak.png" },
[2] = { name = S("unstoppable"), img = "quake_achievement_killstreak2.png" },
[3] = { name = S("bloodbath"), img = "quake_achievement_killstreak3.png" },
[4] = { name = S("shutdown!"), img = "quake_achievement_shutdown.png" },
[4] = { name = S("shutdown!"), img = "quake_achievement_shutdown.png" },
[5] = { name = S("first blood"), img = "quake_achievement_firstblood.png" },
[6] = { name = S("two in one"), img = "quake_achievement_doublekill.png" },
[7] = { name = S("three in one"), img = "quake_achievement_triplekill.png" },
[7] = { name = S("three in one"), img = "quake_achievement_triplekill.png" }
}
local access_key = achievements_lib.register_achievements("quake", achievements)
function quake.add_achievement(p_name, achvmt_ID)
--TODO|DOUBT gestione in hub_manager se c'è?
local achievement = quake.achievements[achvmt_ID]
if achievement == nil then return end
if quake.players[p_name].ACHVMTS[achvmt_ID] ~= nil then return end
quake.players[p_name].ACHVMTS[achvmt_ID] = true
quake.update_storage(p_name)
if achievements_lib.has_player_achievement(p_name, "quake", achvmt_ID) then return end
achievements_lib.add_achievement(p_name, access_key, achvmt_ID)
quake.show_achievement(access_key, p_name, achvmt_ID)
end
@ -38,26 +33,26 @@ function quake.list_achievements(sender, t_name)
local p_name = t_name or sender
-- se il giocatore non esiste, annullo
if quake.players[p_name] == nil then
if not achievements_lib.is_player_in_storage(p_name, "quake") then
minetest.chat_send_player(sender, minetest.colorize("#e6482e", S("[!] This player doesn't exist!")))
return end
local p_achievements = quake.players[p_name].ACHVMTS
local p_achievements = achievements_lib.get_player_achievements(p_name, access_key)
local current_achievements = 0
local achievements_to_text = "\n"
for i = 1, #quake.achievements do
for i = 1, #achievements do
if p_achievements[i] then
achievements_to_text = achievements_to_text .. minetest.colorize("#b6d53c", "[X] " .. quake.achievements[i].name) .. "\n"
achievements_to_text = achievements_to_text .. minetest.colorize("#b6d53c", "[X] " .. achievements[i].name) .. "\n"
current_achievements = current_achievements +1
else
achievements_to_text = achievements_to_text .. minetest.colorize("#cfc6b8", "[ ] " ..quake.achievements[i].name) .. "\n"
achievements_to_text = achievements_to_text .. minetest.colorize("#cfc6b8", "[ ] " .. achievements[i].name) .. "\n"
end
end
minetest.chat_send_player(sender,
minetest.colorize("#cfc6b8", "====================================") .. "\n" ..
minetest.colorize("#eea160", S("@1 ACHIEVEMENTS", p_name) .. ": " .. current_achievements .. "/" .. #quake.achievements) .. achievements_to_text
minetest.colorize("#eea160", S("@1 ACHIEVEMENTS", p_name) .. ": " .. current_achievements .. "/" .. #achievements) .. achievements_to_text
)
end

View File

@ -1,4 +1,4 @@
quake.players = {} -- KEY: p_name, INDEX: {lv (int), xp (int), kills (int), time_playing (int), achievements (table)}
quake.players = {} -- KEY: p_name, INDEX: {lv (int), xp (int), kills (int), time_playing (int)}
local storage = minetest.get_mod_storage()
local players_list = minetest.deserialize(storage:get_string("players"))
@ -23,6 +23,7 @@ end
function quake.add_player_to_storage(p_name)
quake.players[p_name] = {LV = 0, XP = 0, KILLS = 0, TIME_PLAYING = 0}
table.insert(players_list, p_name)
storage:set_string("players", minetest.serialize(players_list))
storage:set_string("PLAYER." .. p_name, minetest.serialize(quake.players[p_name]))

View File

@ -1,3 +1,4 @@
achievements_lib
arena_lib
controls
panel_lib

View File

@ -1,45 +1,38 @@
minetest.register_on_newplayer(function(ObjectRef)
local p_name = ObjectRef:get_player_name()
quake.players[p_name] = {LV = 0, XP = 0, KILLS = 0, TIME_PLAYING = 0, ACHVMTS = {}}
quake.add_player_to_storage(p_name)
quake.update_storage(p_name)
end)
minetest.register_on_joinplayer(function(player)
local p_name = player:get_player_name()
-- lo aggiungo allo storage se era un giocatore che si era già connesso in precedenza,
-- quando la mod ancora non esisteva
if not quake.is_player_in_storage(player:get_player_name()) then
-- se non è nello storage degli achievement, lo aggiungo
if not achievements_lib.is_player_in_storage(p_name, "quake") then
achievements_lib.add_player_to_storage(p_name, "quake")
end
quake.players[p_name] = {LV = 0, XP = 0, KILLS = 0, TIME_PLAYING = 0, ACHVMTS = {}}
-- se non è nello storage della mod, lo aggiungo
if not quake.is_player_in_storage(p_name) then
quake.add_player_to_storage(p_name)
end
-- genero la HUD per gli achievement
--TODO|DOUBT gestione in hub_manager se c'è?
-- genero l'HUD per gli achievement
quake.HUD_achievements_create(p_name)
player:get_meta():set_int("quake_weap_delay", 0)
-- resetto la velocità se non c'è hub_manager
if not minetest.get_modpath("hub_manager") then
player: set_physics_override({
speed = 1,
jump = 1,
gravity = 1,
})
end
local inv = player:get_inventory()
local inv = player:get_inventory()
-- non è possibile modificare l'inventario da offline. Se sono crashati o hanno chiuso il gioco in partita,
-- questo è l'unico modo per togliergli l'arma
inv:remove_item("main", ItemStack("quake:railgun"))
inv:remove_item("main", ItemStack("quake:rocket_launcher"))
inv:remove_item("main", ItemStack("quake:match_over"))
-- non è possibile modificare l'inventario da offline. Se sono crashati o hanno chiuso il gioco in partita,
-- questo è l'unico modo per togliere loro l'arma
inv:remove_item("main", ItemStack("quake:railgun"))
inv:remove_item("main", ItemStack("quake:rocket_launcher"))
inv:remove_item("main", ItemStack("quake:grenade"))
inv:remove_item("main", ItemStack("quake:match_over"))
end)