2020-06-28 06:37:00 -07:00
parties = { }
2021-02-03 05:38:13 -08:00
local function add_party_prefix ( ) end
2020-06-28 06:37:00 -07:00
local function format_party_message ( ) end
2020-06-30 04:24:06 -07:00
local S = minetest.get_translator ( " parties " )
local current_parties = { } -- KEY party_leader; VALUE: {members (party_leader included)}
2020-06-30 04:28:08 -07:00
local players_in_parties = { } -- KEY p_name; VALUE: party_leader
2020-07-22 10:01:22 -07:00
local players_invited = { } -- KEY p_name; VALUE: {inviter(s)}
2020-06-28 06:37:00 -07:00
2020-07-18 04:31:58 -07:00
2020-06-28 06:37:00 -07:00
function parties . invite ( sender , p_name )
2020-06-30 11:55:03 -07:00
-- se si è in un gruppo ma non si è il capo gruppo
2020-06-30 04:24:06 -07:00
if players_in_parties [ sender ] and not current_parties [ sender ] then
2020-06-30 11:55:03 -07:00
minetest.chat_send_player ( sender , minetest.colorize ( " #e6482e " , S ( " [!] Only the party leader can perform this action! " ) ) )
2020-06-28 06:37:00 -07:00
return end
2020-06-30 04:28:08 -07:00
-- se si invita se stessi
if sender == p_name then
minetest.chat_send_player ( sender , minetest.colorize ( " #e6482e " , S ( " [!] You can't invite yourself! " ) ) )
return end
2020-06-28 06:37:00 -07:00
-- se il giocatore non è online
if not minetest.get_player_by_name ( p_name ) then
2020-06-30 04:24:06 -07:00
minetest.chat_send_player ( sender , minetest.colorize ( " #e6482e " , S ( " [!] This player is not online! " ) ) )
2020-06-28 06:37:00 -07:00
return end
2020-06-30 13:18:48 -07:00
-- se è già in un gruppo
if players_in_parties [ p_name ] then
minetest.chat_send_player ( sender , minetest.colorize ( " #e6482e " , S ( " [!] This player is already in a party! " ) ) )
return end
2020-07-22 10:01:22 -07:00
-- se è già stato invitato dalla stessa persona
if players_invited [ p_name ] then
for _ , inviter in pairs ( players_invited [ p_name ] ) do
if inviter == sender then
minetest.chat_send_player ( sender , minetest.colorize ( " #e6482e " , S ( " [!] You've already invited this player! " ) ) )
return end
end
end
2020-07-18 04:31:58 -07:00
-- se non può essere invitato (callback)
for _ , callback in ipairs ( parties.registered_on_pre_party_invite ) do
if not callback ( sender , p_name ) then return end
end
2020-07-22 05:02:54 -07:00
minetest.sound_play ( " parties_invite " , { to_player = p_name } )
2021-02-03 05:38:13 -08:00
minetest.chat_send_player ( sender , add_party_prefix ( S ( " Invite to @1 successfully sent " , p_name ) ) )
minetest.chat_send_player ( p_name , add_party_prefix ( S ( " @1 has invited you to a party, would you like to join? (/party join, or /party join @2) " , sender , sender ) ) )
2020-07-22 10:01:22 -07:00
if players_invited [ p_name ] then
table.insert ( players_invited [ p_name ] , sender )
else
players_invited [ p_name ] = { sender }
end
2020-06-28 06:37:00 -07:00
2020-07-18 04:31:58 -07:00
-- eventuali callback
for _ , callback in ipairs ( parties.registered_on_party_invite ) do
callback ( sender , p_name )
end
2020-06-28 06:37:00 -07:00
-- se non ha accettato dopo 15 secondi, annullo l'invito
minetest.after ( 15 , function ( )
2020-07-22 10:01:22 -07:00
if not players_invited [ p_name ] then return end
for _ , inviter in pairs ( players_invited [ p_name ] ) do
if inviter == sender then
if # players_invited [ p_name ] == 1 then
players_invited [ p_name ] = nil
end
if minetest.get_player_by_name ( sender ) then
2021-02-03 05:38:13 -08:00
minetest.chat_send_player ( sender , add_party_prefix ( minetest.colorize ( " #ededed " , S ( " No answer from @1... " , p_name ) ) ) )
2020-07-22 10:01:22 -07:00
end
2020-07-19 07:08:44 -07:00
end
2020-06-28 06:37:00 -07:00
end
end )
end
2020-07-22 10:01:22 -07:00
function parties . join ( p_name , inviter )
2020-06-28 06:37:00 -07:00
2020-06-30 11:55:03 -07:00
-- se non ha nesssun invito
2020-06-30 04:24:06 -07:00
if not players_invited [ p_name ] then
minetest.chat_send_player ( p_name , minetest.colorize ( " #e6482e " , S ( " [!] You have no pending invites! " ) ) )
2020-06-28 06:37:00 -07:00
return end
2020-07-22 10:01:22 -07:00
-- se chi lo ha invitato è specificato ma non esiste come giocatore
if inviter then
local is_inviter_legit = false
for _ , p_leader in pairs ( players_invited [ p_name ] ) do
if p_leader == inviter then
is_inviter_legit = true
break
end
end
if not is_inviter_legit then
minetest.chat_send_player ( p_name , minetest.colorize ( " #e6482e " , S ( " [!] You have no pending invites from this player! " ) ) )
return end
end
local party_leader
-- ottenimento capo gruppo
if not inviter then
party_leader = players_invited [ p_name ] [ table.maxn ( players_invited [ p_name ] ) ]
else
party_leader = inviter
end
2020-06-28 06:37:00 -07:00
2020-07-19 07:03:14 -07:00
-- se il capo gruppo si è disconnesso nei 15 secondi
if not minetest.get_player_by_name ( party_leader ) then
minetest.chat_send_player ( p_name , minetest.colorize ( " #e6482e " , S ( " [!] The party leader has disconnected! " ) ) )
2020-07-22 10:01:22 -07:00
if # players_invited [ p_name ] == 1 then
players_invited [ p_name ] = nil
else
table.remove ( players_invited [ p_name ] , party_leader )
end
return
end
2020-07-19 07:03:14 -07:00
2020-07-18 04:31:58 -07:00
-- se non può accettare (callback)
for _ , callback in ipairs ( parties.registered_on_pre_party_join ) do
if not callback ( party_leader , p_name ) then return end
end
2020-07-22 05:02:54 -07:00
-- se non esisteva un gruppo, lo creo
2020-06-28 06:37:00 -07:00
if players_in_parties [ party_leader ] == nil then
2020-06-30 04:24:06 -07:00
current_parties [ party_leader ] = { party_leader }
2020-06-28 06:37:00 -07:00
players_in_parties [ party_leader ] = party_leader
end
2020-07-22 05:02:54 -07:00
-- riproduzione suono
for _ , pl_name in pairs ( current_parties [ party_leader ] ) do
minetest.sound_play ( " parties_join " , { to_player = pl_name } )
end
2020-06-30 04:24:06 -07:00
parties.chat_send_party ( party_leader , S ( " @1 has joined the party " , p_name ) , true )
2020-06-28 06:37:00 -07:00
2020-07-22 10:01:22 -07:00
for _ , old_inviter in pairs ( players_invited [ p_name ] ) do
if old_inviter ~= party_leader and minetest.get_player_by_name ( old_inviter ) then
2021-02-03 05:38:13 -08:00
minetest.chat_send_player ( old_inviter , add_party_prefix ( minetest.colorize ( " #ededed " , S ( " @1 has joined another party " , p_name ) ) ) )
2020-07-22 10:01:22 -07:00
end
end
2020-06-30 04:24:06 -07:00
players_invited [ p_name ] = nil
players_in_parties [ p_name ] = party_leader
2020-06-28 06:37:00 -07:00
2020-06-30 04:24:06 -07:00
table.insert ( current_parties [ party_leader ] , p_name )
2021-02-03 05:38:13 -08:00
minetest.chat_send_player ( p_name , add_party_prefix ( S ( " You've joined @1's party " , party_leader ) ) )
2020-06-28 06:37:00 -07:00
2020-07-18 04:31:58 -07:00
-- eventuali callback
for _ , callback in ipairs ( parties.registered_on_party_join ) do
callback ( party_leader , p_name )
end
2020-06-28 06:37:00 -07:00
end
2020-06-30 04:24:06 -07:00
function parties . leave ( p_name )
2020-06-30 11:55:03 -07:00
-- se non si è in un gruppo
2020-06-30 04:24:06 -07:00
if not players_in_parties [ p_name ] then
minetest.chat_send_player ( p_name , minetest.colorize ( " #e6482e " , S ( " [!] You must enter a party first! " ) ) )
return end
local party_leader = players_in_parties [ p_name ]
2020-07-22 05:02:54 -07:00
-- riproduzione suono
for _ , pl_name in pairs ( current_parties [ party_leader ] ) do
minetest.sound_play ( " parties_leave " , { to_player = pl_name } )
end
2020-06-30 11:55:03 -07:00
-- rimuovo dal gruppo
for k , pl_name in pairs ( current_parties [ party_leader ] ) do
if pl_name == p_name then
2020-06-30 13:18:48 -07:00
table.remove ( current_parties [ party_leader ] , k )
break
2020-06-30 04:24:06 -07:00
end
2020-06-30 11:55:03 -07:00
end
players_in_parties [ p_name ] = nil
2021-02-03 05:38:13 -08:00
minetest.chat_send_player ( p_name , add_party_prefix ( S ( " You've left the party " ) ) , true )
2020-06-30 11:55:03 -07:00
2020-07-18 04:31:58 -07:00
-- eventuali callback
for _ , callback in ipairs ( parties.registered_on_party_leave ) do
callback ( party_leader , p_name )
end
2020-06-30 13:18:48 -07:00
-- se ad abbandonare è stato il capo gruppo, lo cambio
2020-06-30 11:55:03 -07:00
if p_name == party_leader then
2020-06-30 04:24:06 -07:00
2020-06-30 13:18:48 -07:00
local new_leader = current_parties [ party_leader ] [ 1 ]
2020-06-30 11:55:03 -07:00
parties.chat_send_party ( new_leader , S ( " @1 has left the party " , p_name ) , true )
parties.change_party_leader ( p_name , new_leader )
2020-06-30 04:24:06 -07:00
2020-06-30 13:18:48 -07:00
-- ...sciolgo se sono rimasti in 2
if # current_parties [ new_leader ] == 1 then
parties.disband ( new_leader )
end
2020-06-30 04:24:06 -07:00
else
2020-06-30 11:55:03 -07:00
parties.chat_send_party ( party_leader , S ( " @1 has left the party " , p_name ) , true )
2020-06-30 13:18:48 -07:00
if # current_parties [ party_leader ] == 1 then
parties.disband ( party_leader )
end
2020-06-30 11:55:03 -07:00
end
2020-06-30 04:24:06 -07:00
2020-06-30 11:55:03 -07:00
end
function parties . disband ( p_name )
-- se non si è in un gruppo
if not players_in_parties [ p_name ] then
minetest.chat_send_player ( p_name , minetest.colorize ( " #e6482e " , S ( " [!] You must enter a party first! " ) ) )
return end
-- se si è in un gruppo ma non si è il capo gruppo
if players_in_parties [ p_name ] and not current_parties [ p_name ] then
minetest.chat_send_player ( p_name , minetest.colorize ( " #e6482e " , S ( " [!] Only the party leader can perform this action! " ) ) )
return end
2020-07-22 05:02:54 -07:00
-- riproduzione suono
for _ , pl_name in pairs ( current_parties [ p_name ] ) do
minetest.sound_play ( " parties_leave " , { p_name = pl_name } )
end
2020-06-30 13:18:48 -07:00
parties.chat_send_party ( p_name , S ( " The party has been disbanded " ) , true )
2020-07-18 04:31:58 -07:00
-- eventuali callback
for _ , callback in ipairs ( parties.registered_on_party_disband ) do
callback ( p_name )
end
2020-06-30 11:55:03 -07:00
for _ , pl_name in pairs ( current_parties [ p_name ] ) do
players_in_parties [ pl_name ] = nil
2020-06-30 04:24:06 -07:00
end
2020-06-30 11:55:03 -07:00
current_parties [ p_name ] = nil
2020-06-30 04:24:06 -07:00
end
----------------------------------------------
--------------------UTILS---------------------
----------------------------------------------
2020-07-19 07:08:44 -07:00
function parties . is_player_invited ( p_name )
if players_invited [ p_name ] then return true
else return false end
end
2020-06-30 04:24:06 -07:00
function parties . is_player_in_party ( p_name )
if players_in_parties [ p_name ] then return true
else return false end
end
2020-06-30 11:55:03 -07:00
function parties . is_player_party_leader ( p_name )
2020-06-30 04:24:06 -07:00
if current_parties [ p_name ] then return true
else return false end
end
2020-06-28 06:37:00 -07:00
function parties . chat_send_party ( p_name , msg , as_broadcast )
if not players_in_parties [ p_name ] then
2020-06-30 04:24:06 -07:00
minetest.chat_send_player ( p_name , minetest.colorize ( " #e6482e " , S ( " [!] You must enter a party first! " ) ) )
2020-06-28 06:37:00 -07:00
return end
local party_leader = players_in_parties [ p_name ]
if as_broadcast then
2020-06-30 04:24:06 -07:00
for _ , pl_name in pairs ( current_parties [ party_leader ] ) do
2021-02-03 05:38:13 -08:00
minetest.chat_send_player ( pl_name , add_party_prefix ( msg ) )
2020-06-28 06:37:00 -07:00
end
else
2020-06-30 04:24:06 -07:00
for _ , pl_name in pairs ( current_parties [ party_leader ] ) do
2021-02-03 05:38:13 -08:00
minetest.chat_send_player ( pl_name , add_party_prefix ( format_party_message ( p_name , msg ) ) )
2020-06-28 06:37:00 -07:00
end
end
end
2020-06-30 11:55:03 -07:00
function parties . change_party_leader ( old_leader , new_leader )
current_parties [ new_leader ] = { }
for k , v in pairs ( current_parties [ old_leader ] ) do
current_parties [ new_leader ] [ k ] = v
players_in_parties [ v ] = new_leader
end
current_parties [ old_leader ] = nil
2020-06-30 13:18:48 -07:00
if # current_parties [ new_leader ] > 1 then
parties.chat_send_party ( new_leader , S ( " @1 is the new party leader " , new_leader ) , true )
end
2020-06-30 11:55:03 -07:00
end
2020-07-22 10:01:22 -07:00
function parties . cancel_invite ( p_name , inviter )
for _ , p_leader in pairs ( players_invited [ p_name ] ) do
if p_leader == inviter then
table.remove ( players_invited [ p_name ] , inviter )
return
end
end
minetest.log ( " warning " , " [PARTIES] There was an attempt to cancel an invite from " .. inviter .. " to " .. p_name .. " but there is none " )
end
function parties . cancel_invites ( p_name )
2020-07-19 07:08:44 -07:00
players_invited [ p_name ] = nil
end
2020-06-30 04:24:06 -07:00
----------------------------------------------
-----------------GETTERS----------------------
----------------------------------------------
2020-07-22 10:01:22 -07:00
function parties . get_inviters ( p_name )
2020-07-19 07:08:44 -07:00
return players_invited [ p_name ]
end
2020-06-30 04:24:06 -07:00
function parties . get_party_leader ( p_name )
return players_in_parties [ p_name ]
end
function parties . get_party_members ( party_leader )
return current_parties [ party_leader ]
end
2020-07-19 07:08:44 -07:00
2020-06-30 04:24:06 -07:00
----------------------------------------------
---------------FUNZIONI LOCALI----------------
----------------------------------------------
2021-02-03 05:38:13 -08:00
function add_party_prefix ( msg )
2020-06-30 11:55:03 -07:00
return minetest.colorize ( " #ddffdd " , " [ " .. S ( " Party " ) .. " ] " .. msg )
2020-06-28 06:37:00 -07:00
end
2021-02-03 05:38:13 -08:00
function format_party_message ( p_name , msg )
local msg_format = minetest.settings : get ( " chat_message_format " )
return minetest.colorize ( " #ddffdd " , msg_format : gsub ( " @name " , p_name ) : gsub ( " @message " , msg ) )
end