Funzione/status on_load + giocatore può entrare a partita avviata + pulizia + codice più performante
parent
470267dd6c
commit
a365cbf0cd
150
api.lua
150
api.lua
|
@ -1,18 +1,24 @@
|
|||
local storage = minetest.get_mod_storage()
|
||||
storage:set_string("arenas", nil) -- PER RESETTARE LO STORAGE
|
||||
----------------------------------------------
|
||||
--------------GESTIONE STORAGE----------------
|
||||
----------------------------------------------
|
||||
|
||||
arena_lib = { arenas = {} }
|
||||
local storage = minetest.get_mod_storage()
|
||||
--storage:set_string("arenas", nil) -- PER RESETTARE LO STORAGE
|
||||
|
||||
if minetest.deserialize(storage:get_string("arenas")) ~= nil then
|
||||
arena_lib.arenas = minetest.deserialize(storage:get_string("arenas"))
|
||||
end
|
||||
|
||||
function arena_lib.update_storage()
|
||||
storage:set_string("arenas", minetest.serialize(arena_lib.arenas))
|
||||
end
|
||||
|
||||
local function newArena() end
|
||||
local function nextID() end
|
||||
----------------------------------------------
|
||||
---------------DICHIARAZIONI------------------
|
||||
----------------------------------------------
|
||||
|
||||
local function update_storage() end
|
||||
local function new_arena() end
|
||||
local function next_ID() end
|
||||
|
||||
arena_lib = { arenas = {} }
|
||||
|
||||
local arenasID
|
||||
local players_in_game = {} --KEY: player name, INDEX: arenaID
|
||||
|
@ -22,7 +28,7 @@ local arena_default_max_players = 2
|
|||
local arena_default_min_players = 1
|
||||
local arena_default_kill_cap = 10
|
||||
|
||||
arena_lib.arena_default = {
|
||||
local arena_default = {
|
||||
name = "",
|
||||
sign = {},
|
||||
players = {}, --KEY: player name, INDEX: kills, deaths, killstreak
|
||||
|
@ -32,6 +38,7 @@ arena_lib.arena_default = {
|
|||
kill_cap = arena_default_kill_cap,
|
||||
kill_leader = "",
|
||||
in_queue = false,
|
||||
in_loading = false,
|
||||
in_game = false,
|
||||
in_celebration = false
|
||||
}
|
||||
|
@ -43,6 +50,7 @@ local immunity_time = 3
|
|||
local immunity_slot = 9 --people may have tweaked the slots, hence the custom parameter
|
||||
|
||||
|
||||
-- call this in your mod to override the last block of values
|
||||
function arena_lib.settings(def)
|
||||
|
||||
if def.prefix then
|
||||
|
@ -69,9 +77,13 @@ end
|
|||
|
||||
|
||||
|
||||
----------------------------------------------
|
||||
---------------GESTIONE ARENA-----------------
|
||||
----------------------------------------------
|
||||
|
||||
function arena_lib.create_arena(sender, arena_name)
|
||||
|
||||
arenasID = nextID()
|
||||
arenasID = next_ID()
|
||||
|
||||
-- controllo che non ci siano duplicati
|
||||
if arenasID > 1 and arena_lib.get_arena_by_name(arena_name) ~= nil then
|
||||
|
@ -79,9 +91,9 @@ function arena_lib.create_arena(sender, arena_name)
|
|||
return end
|
||||
|
||||
-- creo l'arena e la rinomino, aggiornando anche lo storage
|
||||
arena_lib.arenas[arenasID] = newArena(arena_lib.arena_default)
|
||||
arena_lib.arenas[arenasID] = new_arena(arena_default)
|
||||
arena_lib.arenas[arenasID].name = arena_name
|
||||
arena_lib.update_storage()
|
||||
update_storage()
|
||||
minetest.chat_send_player(sender, prefix .. "Arena " .. arena_name .. " creata con successo")
|
||||
|
||||
end
|
||||
|
@ -109,15 +121,52 @@ function arena_lib.remove_arena(sender, arena_name)
|
|||
|
||||
-- rimozione arena e aggiornamento storage
|
||||
arena_lib.arenas[id] = nil
|
||||
arena_lib.update_storage()
|
||||
update_storage()
|
||||
minetest.chat_send_player(sender, prefix .. "Arena " .. arena_name .. " rimossa con successo")
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
||||
-- Gli spawn points si impostano prendendo la coordinata del giocatore che lancia il comando.
|
||||
-- Non ci possono essere più spawn points del numero massimo di giocatori e non possono essere impostati in aria
|
||||
function arena_lib.set_spawner(name, arena_name)
|
||||
|
||||
local id, arena = arena_lib.get_arena_by_name(arena_name)
|
||||
|
||||
if arena == nil then minetest.chat_send_player(name, minetest.colorize("#e6482e", "[!] Quest'arena non esiste!"))
|
||||
return end
|
||||
|
||||
local spawn_points_count = arena_lib.get_arena_spawners_count(id)
|
||||
|
||||
if spawn_points_count == arena.max_players then
|
||||
minetest.chat_send_player(name, minetest.colorize("#e6482e", "[!] Gli spawn point non possono superare i giocatori massimi! Vuoi cancellarne alcuni con /quakeadmin delspawn <arena>?"))
|
||||
return end
|
||||
|
||||
local pos = vector.floor(minetest.get_player_by_name(name):get_pos()) --tolgo i decimali per storare un int
|
||||
local pos_Y_up = {x = pos.x, y = pos.y+1, z = pos.z} -- alzo Y di uno sennò tippa nel blocco
|
||||
local pos_feet = {x = pos.x, y = pos.y-1, z = pos.z}
|
||||
|
||||
if minetest.get_node(pos_feet).name == "air" then minetest.chat_send_player(name, minetest.colorize("#e6482e", "[!] Non puoi impostare spawn point nell'aria!"))
|
||||
return end
|
||||
|
||||
for id, spawn in pairs(arena.spawn_points) do
|
||||
if minetest.serialize(pos_Y_up) == minetest.serialize(spawn) then minetest.chat_send_player(name, minetest.colorize("#e6482e", "[!] C'è già uno spawn in questo punto!"))
|
||||
return end
|
||||
end
|
||||
|
||||
local new_spawn_ID = spawn_points_count +1
|
||||
|
||||
arena.spawn_points[new_spawn_ID] = pos_Y_up
|
||||
update_storage()
|
||||
minetest.chat_send_player(name, prefix .. "Spawn point " .. new_spawn_ID .. " impostato con successo" )
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
||||
----------------------------------------------
|
||||
---------------GESTIONE ARENA-----------------
|
||||
--------------GESTIONE PARTITA-----------------
|
||||
----------------------------------------------
|
||||
|
||||
-- per tutti i giocatori quando finisce la coda
|
||||
|
@ -126,6 +175,9 @@ function arena_lib.load_arena(arena_ID)
|
|||
local count = 1
|
||||
local arena = arena_lib.arenas[arena_ID]
|
||||
|
||||
arena.in_loading = true
|
||||
arena_lib.update_sign(arena.sign, arena)
|
||||
|
||||
-- teletrasporto giocatori e sostituisco l'inventario
|
||||
for pl_name, stats in pairs(arena.players) do
|
||||
|
||||
|
@ -154,8 +206,26 @@ end
|
|||
|
||||
|
||||
|
||||
-- per il player singolo a match iniziato
|
||||
function arena_lib.join_arena(p_name, arena_ID)
|
||||
|
||||
local player = minetest.get_player_by_name(p_name)
|
||||
|
||||
player:set_pos(arena_lib.get_random_spawner(arena_ID))
|
||||
player:get_inventory():set_list("main",{})
|
||||
players_in_game[pl_name] = arena_ID
|
||||
|
||||
arena_lib.on_join(p_name, arena_ID)
|
||||
end
|
||||
|
||||
|
||||
|
||||
function arena_lib.start_arena(arena)
|
||||
|
||||
arena.in_loading = false
|
||||
arena.in_game = true
|
||||
arena_lib.update_sign(arena.sign, arena)
|
||||
|
||||
for pl_name, stats in pairs(arena.players) do
|
||||
|
||||
minetest.get_player_by_name(pl_name):set_physics_override({
|
||||
|
@ -169,18 +239,19 @@ function arena_lib.start_arena(arena)
|
|||
end
|
||||
|
||||
|
||||
|
||||
--a partita finita
|
||||
function arena_lib.load_celebration(arena_ID, winner_name)
|
||||
|
||||
local arena = arena_lib.arenas[arena_ID]
|
||||
arena.in_celebration = true
|
||||
|
||||
arena.in_celebration = true
|
||||
arena_lib.update_sign(arena.sign, arena)
|
||||
arena_lib.update_storage()
|
||||
|
||||
for pl_name, stats in pairs(arena.players) do
|
||||
|
||||
local inv = minetest.get_player_by_name(pl_name):get_inventory()
|
||||
|
||||
-- giocatori immortali
|
||||
if not inv:contains_item("main", "arena_lib.immunity") then
|
||||
inv:set_stack("main", immunity_slot, "arena_lib:immunity")
|
||||
|
@ -204,30 +275,20 @@ end
|
|||
function arena_lib.end_arena(arena)
|
||||
|
||||
arena_lib.on_end(arena)
|
||||
|
||||
arena.kill_leader = ""
|
||||
|
||||
for pl_name, stats in pairs(arena.players) do
|
||||
|
||||
arena.players[pl_name] = nil
|
||||
players_in_game[pl_name] = nil
|
||||
|
||||
arena.in_celebration = false
|
||||
arena.in_game = false
|
||||
arena_lib.update_sign(arena.sign, arena)
|
||||
arena_lib.update_storage()
|
||||
|
||||
minetest.get_player_by_name(pl_name):get_inventory():set_list("main", {})
|
||||
|
||||
--TODO: teleport lobby, metti variabile locale
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
-- per il player singolo a match iniziato
|
||||
function arena_lib.join_arena(arena_ID)
|
||||
--TODO
|
||||
arena_lib.update_sign(arena.sign, arena)
|
||||
end
|
||||
|
||||
|
||||
|
@ -251,6 +312,13 @@ end
|
|||
|
||||
|
||||
|
||||
function arena_lib.on_join(p_name, arena_ID)
|
||||
--[[override this function on your mod if you wanna add more!
|
||||
Just do: function arena_lib.on_join() yourstuff end]]
|
||||
end
|
||||
|
||||
|
||||
|
||||
function arena_lib.on_start(arena)
|
||||
--[[override this function on your mod if you wanna add more!
|
||||
Just do: function arena_lib.on_load() yourstuff end]]
|
||||
|
@ -295,13 +363,18 @@ end
|
|||
function arena_lib.remove_player_from_arena(p_name)
|
||||
|
||||
local arena_ID = players_in_game[p_name]
|
||||
local arena = arena_lib.arenas[arena_ID]
|
||||
|
||||
arena_lib.arenas[arena_ID].players[p_name] = nil
|
||||
if arena == nil then return end
|
||||
|
||||
arena.players[p_name] = nil
|
||||
players_in_game[p_name] = nil
|
||||
players_in_queue[p_name] = nil
|
||||
arena_lib.send_message_players_in_arena(arena_ID, prefix .. p_name .. " ha abbandonato la partita")
|
||||
|
||||
--TODO: se in arena è rimasto solo un giocatore, ha vinto e end arena
|
||||
if arena.get_arena_players_count(arena_ID) == 1 then
|
||||
arena.send_message_players_in_arena(arena_ID, prefix .. "Hai vinto la partita per troppi pochi giocatori")
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
@ -369,7 +442,7 @@ function arena_lib.get_arena_players_count(arena_ID)
|
|||
local count = 0
|
||||
local arena = arena_lib.arenas[arena_ID]
|
||||
|
||||
for id, spawn in pairs(arena.players) do
|
||||
for pl_name, stats in pairs(arena.players) do
|
||||
count = count+1
|
||||
end
|
||||
|
||||
|
@ -397,23 +470,31 @@ end
|
|||
-----------------SETTERS----------------------
|
||||
----------------------------------------------
|
||||
|
||||
-- nothing to see here ¯\_(ツ)_/¯
|
||||
|
||||
|
||||
|
||||
----------------------------------------------
|
||||
---------------FUNZIONI LOCALI----------------
|
||||
----------------------------------------------
|
||||
|
||||
function update_storage()
|
||||
storage:set_string("arenas", minetest.serialize(arena_lib.arenas))
|
||||
end
|
||||
|
||||
|
||||
|
||||
--[[ Dato che in Lua non è possibile istanziare le tabelle copiandole, bisogna istanziare ogni campo in una nuova tabella.
|
||||
Ricorsivo per le sottotabelle. Codice da => http://lua-users.org/wiki/CopyTable]]
|
||||
function newArena(orig)
|
||||
function new_arena(orig)
|
||||
local orig_type = type(orig)
|
||||
local copy
|
||||
if orig_type == 'table' then
|
||||
copy = {}
|
||||
for orig_key, orig_value in next, orig, nil do
|
||||
copy[newArena(orig_key)] = newArena(orig_value)
|
||||
copy[new_arena(orig_key)] = new_arena(orig_value)
|
||||
end
|
||||
setmetatable(copy, newArena(getmetatable(orig)))
|
||||
setmetatable(copy, new_arena(getmetatable(orig)))
|
||||
else -- number, string, boolean, etc
|
||||
copy = orig
|
||||
end
|
||||
|
@ -421,9 +502,10 @@ function newArena(orig)
|
|||
end
|
||||
|
||||
|
||||
|
||||
--[[ l'ID di base parte da 1 (n+1) per non generare errori, tipo "if arenaID == 0" al verificare se non esiste.
|
||||
In una sequenza 0, 1, 2, 3 se si rimuove "2" e si aggiunge un nuovo ID perciò si avrà 0, 1, 3, 4]]
|
||||
function nextID()
|
||||
function next_ID()
|
||||
local n = 0
|
||||
for id, arena in pairs(arena_lib.arenas) do
|
||||
if id > n then n = id end
|
||||
|
|
|
@ -29,6 +29,6 @@ minetest.register_on_respawnplayer(function(player)
|
|||
|
||||
player:set_pos(arena_lib.get_random_spawner(arenaID))
|
||||
arena_lib.immunity(player)
|
||||
return true -- <=== dovrebbe sovrascrivere la posizione di respawn del giocatore stando all'API riga 4283, ma non lo fa
|
||||
return true
|
||||
|
||||
end)
|
||||
|
|
28
signs.lua
28
signs.lua
|
@ -2,7 +2,7 @@
|
|||
-- For the item to set signs, being a declaration of a new item, look at items.lua
|
||||
--
|
||||
|
||||
|
||||
local queue_waiting_time = 5
|
||||
|
||||
local function in_game_txt(arena) end
|
||||
|
||||
|
@ -50,31 +50,34 @@ minetest.override_item("default:sign_wall", {
|
|||
minetest.chat_send_player(p_name, minetest.colorize("#e6482e", "[!] L'arena è già piena!"))
|
||||
return end
|
||||
|
||||
-- se sta caricando
|
||||
if sign_arena.in_loading then
|
||||
minetest.chat_send_player(p_name, minetest.colorize("#e6482e", "[!] L'arena è in caricamento, riprova tra qualche secondo!"))
|
||||
return end
|
||||
|
||||
-- aggiungo il giocatore e aggiorno il cartello
|
||||
sign_arena.players[p_name] = {kills = 0, deaths = 0, killstreak = 0}
|
||||
arena_lib.update_sign(pos, sign_arena)
|
||||
|
||||
-- notifico i vari giocatori del nuovo player
|
||||
if sign_arena.in_game then
|
||||
--TODO: butta dentro alla partita in corso. Sì, si può entrare mentre è in corso -------- arena_lib.join_arena(arenaID)
|
||||
|
||||
arena_lib.join_arena(p_name, arenaID)
|
||||
arena_lib.send_message_players_in_arena(arenaID, "[Quake] " .. p_name .. " si è aggiunto alla partita")
|
||||
minetest.chat_send_player(p_name, "[Quake] Sei entrato nell'arena " .. sign_arena.name)
|
||||
return
|
||||
else
|
||||
arena_lib.add_to_queue(p_name, arenaID)
|
||||
arena_lib.send_message_players_in_arena(arenaID, "[Quake] " .. p_name .. " si è aggiunto alla coda")
|
||||
minetest.chat_send_player(p_name, "[Quake] Ti sei aggiunto alla coda per " .. sign_arena.name)
|
||||
end
|
||||
|
||||
-- aggiungo il giocatore e aggiorno il cartello
|
||||
sign_arena.players[p_name] = {kills = 0, deaths = 0, killstreak = 0}
|
||||
arena_lib.add_to_queue(p_name, arenaID)
|
||||
arena_lib.update_storage()
|
||||
arena_lib.update_sign(pos, sign_arena)
|
||||
|
||||
local timer = minetest.get_node_timer(pos)
|
||||
local waiting_time = 5
|
||||
|
||||
-- se ci sono abbastanza giocatori, parte il timer di attesa
|
||||
if arena_lib.get_arena_players_count(arenaID) == sign_arena.min_players and not sign_arena.in_queue and not sign_arena.in_game then
|
||||
arena_lib.send_message_players_in_arena(arenaID, "[Quake] La partita inizierà tra " .. waiting_time .. " secondi!")
|
||||
arena_lib.send_message_players_in_arena(arenaID, "[Quake] La partita inizierà tra " .. queue_waiting_time .. " secondi!")
|
||||
sign_arena.in_queue = true
|
||||
timer:start(waiting_time)
|
||||
timer:start(queue_waiting_time)
|
||||
end
|
||||
|
||||
-- se raggiungo i giocatori massimi e la partita non è iniziata, parte subito
|
||||
|
@ -155,6 +158,7 @@ function in_game_txt(arena)
|
|||
|
||||
if arena.in_celebration then txt = "Concludendo"
|
||||
elseif arena.in_game then txt = "In partita"
|
||||
elseif arena.in_loading then txt = "In caricamento"
|
||||
else txt = "In attesa" end
|
||||
|
||||
return txt
|
||||
|
|
Loading…
Reference in New Issue