From f990e271daf00f49da810d1dffad2de4359bf8b3 Mon Sep 17 00:00:00 2001 From: Zughy <4279489-marco_a@users.noreply.gitlab.com> Date: Thu, 13 Aug 2020 22:10:31 +0200 Subject: [PATCH] TANTE cose con gli achievement (separati) --- _HUD/hud_achievements.lua | 6 ++---- _HUD/hud_broadcast.lua | 1 + _HUD/hud_stats.lua | 2 -- _weapons/weapons.lua | 7 ------- achievements.lua | 31 +++++++++++++---------------- database_manager.lua | 3 ++- depends.txt | 1 + player_manager.lua | 41 ++++++++++++++++----------------------- 8 files changed, 36 insertions(+), 56 deletions(-) diff --git a/_HUD/hud_achievements.lua b/_HUD/hud_achievements.lua index afbc82f..3a7b80e 100644 --- a/_HUD/hud_achievements.lua +++ b/_HUD/hud_achievements.lua @@ -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 diff --git a/_HUD/hud_broadcast.lua b/_HUD/hud_broadcast.lua index af9e3f3..a8053cb 100644 --- a/_HUD/hud_broadcast.lua +++ b/_HUD/hud_broadcast.lua @@ -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 diff --git a/_HUD/hud_stats.lua b/_HUD/hud_stats.lua index 31eb056..b5304f7 100644 --- a/_HUD/hud_stats.lua +++ b/_HUD/hud_stats.lua @@ -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, diff --git a/_weapons/weapons.lua b/_weapons/weapons.lua index 8ee7553..8397d05 100644 --- a/_weapons/weapons.lua +++ b/_weapons/weapons.lua @@ -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 diff --git a/achievements.lua b/achievements.lua index 9e9efa4..2766c9e 100644 --- a/achievements.lua +++ b/achievements.lua @@ -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 diff --git a/database_manager.lua b/database_manager.lua index 54becdd..2ce44fc 100644 --- a/database_manager.lua +++ b/database_manager.lua @@ -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])) diff --git a/depends.txt b/depends.txt index 06f38be..ceb0867 100644 --- a/depends.txt +++ b/depends.txt @@ -1,3 +1,4 @@ +achievements_lib arena_lib controls panel_lib diff --git a/player_manager.lua b/player_manager.lua index 00fcec2..c7215dd 100644 --- a/player_manager.lua +++ b/player_manager.lua @@ -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)