Players can now choose which party they want to join, if they have multiple invites
parent
5316c27be4
commit
a76760d6d1
5
DOCS.md
5
DOCS.md
|
@ -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
|
||||
|
||||
|
|
|
@ -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
104
api.lua
|
@ -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
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
2
init.lua
2
init.lua
|
@ -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")
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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=
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue