Players can now choose which party they want to join, if they have multiple invites

master
Marco 2020-07-22 19:01:22 +02:00
parent 5316c27be4
commit a76760d6d1
8 changed files with 105 additions and 27 deletions

View File

@ -11,11 +11,12 @@ Because it's always good to understand the API without surfing the code, init? :
* `parties.is_player_party_leader(p_name)`: (bool) checks whether a player is the party leader of any party
* `parties.chat_send_party(p_name, msg, as_broadcast)`: (nil) sends a message to every player inside the party where `p_name` is (`p_name` doesn't necessarily have to be the party leader). If `as_broadcast` is true, it'll be sent without following Minetest chat format. If false, `p_name` will be pointed as the sender when formatting the message
* `parties.change_party_leader(old_leader, new_leader)`: (nil) changes the party leader
* `parties.cancel_invite(p_name)`: (nil) cancels a pending invite
* `parties.cancel_invite(p_name, inviter)`: (nil) cancels a pending invite from `inviter`
* `parties.cancel_invites(p_name)`: (nil) cancels all the pending invites of `p_name`
### 1.2 Getters
* `parties.get_inviter(p_name)`: (string) returns the name of the player who invited `p_name`, if an event is pending
* `parties.get_inviters(p_name)`: (table) returns a table containing the name(s) of the player(s) who invited `p_name`, if an invite is pending
* `parties.get_party_leader(p_name)`: (string) returns the party leader of the party where `p_name` is in
* `parties.get_party_members(party_leader)`: (table) returns a list of every player inside the party where `party_leader` is in

View File

@ -6,7 +6,7 @@ Minimalist party mod for Minetest
## Commands
* `/party invite <player>`: invite a player to a party
* `/party join`: accept an invitation request, if any
* `/party join <player>`: accept an invitation request, if any. If `player` is specified, accepts that specific player request
* `/party leave`: leave a party. If the party leader leaves, the role is assigned to another player (but if there were 2 people)
* `/party disband`: disband a party

104
api.lua
View File

@ -5,7 +5,7 @@ local function format_party_message() end
local S = minetest.get_translator("parties")
local current_parties = {} -- KEY party_leader; VALUE: {members (party_leader included)}
local players_in_parties = {} -- KEY p_name; VALUE: party_leader
local players_invited = {} -- KEY p_name; VALUE: inviter
local players_invited = {} -- KEY p_name; VALUE: {inviter(s)}
@ -28,16 +28,20 @@ function parties.invite(sender, p_name)
minetest.chat_send_player(sender, minetest.colorize("#e6482e", S("[!] This player is not online!")))
return end
-- se è già stato invitato dalla stessa persona
if players_invited[p_name] and players_invited[p_name] == sender then
minetest.chat_send_player(sender, minetest.colorize("#e6482e", S("[!] You've already invited this player!")))
return end
-- 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
-- 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
-- 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
@ -45,8 +49,13 @@ function parties.invite(sender, p_name)
minetest.sound_play("parties_invite", { to_player = p_name })
minetest.chat_send_player(sender, format_party_message(S("Invite to @1 successfully sent", p_name)))
minetest.chat_send_player(p_name, format_party_message(S("@1 has invitied you in a party, would you like to join? (/party join)", sender)))
players_invited[p_name] = sender
minetest.chat_send_player(p_name, format_party_message(S("@1 has invitied you in a party, would you like to join? (/party join, or /party join @2)", sender, sender)))
if players_invited[p_name] then
table.insert(players_invited[p_name], sender)
else
players_invited[p_name] = {sender}
end
-- eventuali callback
for _, callback in ipairs(parties.registered_on_party_invite) do
@ -55,10 +64,20 @@ function parties.invite(sender, p_name)
-- se non ha accettato dopo 15 secondi, annullo l'invito
minetest.after(15, function()
if players_invited[p_name] and players_invited[p_name] == sender then
players_invited[p_name] = nil
if minetest.get_player_by_name(sender) then
minetest.chat_send_player(sender, format_party_message(minetest.colorize("#ededed", S("No answer from @1...", p_name))))
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
minetest.chat_send_player(sender, format_party_message(minetest.colorize("#ededed", S("No answer from @1...", p_name))))
end
end
end
end)
@ -66,20 +85,49 @@ end
function parties.join(p_name)
function parties.join(p_name, inviter)
-- se non ha nesssun invito
if not players_invited[p_name] then
minetest.chat_send_player(p_name, minetest.colorize("#e6482e", S("[!] You have no pending invites!")))
return end
local party_leader = players_invited[p_name]
-- 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
-- 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!")))
players_invited[p_name] = nil
return end
if #players_invited[p_name] == 1 then
players_invited[p_name] = nil
else
table.remove(players_invited[p_name], party_leader)
end
return
end
-- se non può accettare (callback)
for _, callback in ipairs(parties.registered_on_pre_party_join) do
@ -99,6 +147,12 @@ function parties.join(p_name)
parties.chat_send_party(party_leader, S("@1 has joined the party", p_name), true)
for _, old_inviter in pairs(players_invited[p_name]) do
if old_inviter ~= party_leader and minetest.get_player_by_name(old_inviter) then
minetest.chat_send_player(old_inviter, format_party_message(minetest.colorize("#ededed", S("@1 has joined another party", p_name))))
end
end
players_invited[p_name] = nil
players_in_parties[p_name] = party_leader
@ -270,7 +324,21 @@ end
function parties.cancel_invite(p_name)
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)
players_invited[p_name] = nil
end
@ -281,7 +349,7 @@ end
-----------------GETTERS----------------------
----------------------------------------------
function parties.get_inviter(p_name)
function parties.get_inviters(p_name)
return players_invited[p_name]
end

View File

@ -10,6 +10,11 @@ ChatCmdBuilder.new("party", function(cmd)
parties.join(sender)
end)
-- accettazione con nick
cmd:sub("join :inviter", function(sender, inviter)
parties.join(sender, inviter)
end)
-- abbandono
cmd:sub("leave", function(sender)
parties.leave(sender)

View File

@ -1,4 +1,4 @@
local version = "1.1.0"
local version = "1.3.0-dev"
dofile(minetest.get_modpath("parties") .. "/api.lua")
dofile(minetest.get_modpath("parties") .. "/callbacks.lua")

View File

@ -1,4 +1,4 @@
# version 1.1.0
# version 1.3.0-dev
# author(s):
# reviewer(s):
# textdomain: parties
@ -10,11 +10,13 @@
[!] You've already invited this player!=[!] Hai già invitato questo giocatore!
[!] This player is already in a party!=[!] Questo giocatore è già in un gruppo!
Invite to @1 successfully sent=Invito a @1 inviato con successo
@1 has invitied you in a party, would you like to join? (/party join)=@1 ti ha invitato in un gruppo, vuoi unirti? (/party join)
@1 has invitied you in a party, would you like to join? (/party join, or /party join @2)=@1 ti ha invitato in un gruppo, vuoi unirti? (/party join, o /party join @2)
No answer from @1...=Nessuna risposta da @1...
[!] You have no pending invites!=[!] Non hai nessun invito da accettare!
[!] You have no pending invites from this player!=[!] Non hai nessun invito da accettare da parte di questo giocatore!
[!] The party leader has disconnected!=[!] Il capo gruppo si è disconnesso!
@1 has joined the party=@1 si è unito al gruppo
@1 has joined another party=@1 si è unito a un altro gruppo
You've joined @1's party=Ti sei unito al gruppo di @1
[!] You must enter a party first!=[!] Devi prima entrare in un gruppo!
The party has been disbanded=Il gruppo è stato sciolto

View File

@ -1,4 +1,4 @@
# version 1.1.0
# version 1.3.0-dev
# author(s):
# reviewer(s):
# textdomain: parties
@ -10,11 +10,13 @@
[!] You've already invited this player!=
[!] This player is already in a party!=
Invite to @1 successfully sent=
@1 has invitied you in a party, would you like to join? (/party join)=
@1 has invitied you in a party, would you like to join? (/party join, or /party join @2)=
No answer from @1...=
[!] You have no pending invites!=
[!] You have no pending invites from this player!=
[!] The party leader has disconnected!=
@1 has joined the party=
@1 has joined another party=
You've joined @1's party=
[!] You must enter a party first!=
The party has been disbanded=

View File

@ -7,6 +7,6 @@ minetest.register_on_leaveplayer(function(player)
end
if parties.is_player_invited(p_name) then
parties.cancel_invite(p_name)
parties.cancel_invites(p_name)
end
end)