TANTE cose con gli achievement (separati)
parent
cd10249688
commit
f990e271da
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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]))
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
achievements_lib
|
||||
arena_lib
|
||||
controls
|
||||
panel_lib
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue