diff --git a/DOCS.md b/DOCS.md index 09ed6ae..5d5fe28 100644 --- a/DOCS.md +++ b/DOCS.md @@ -16,9 +16,19 @@ Because it's always good to understand the API without surfing the code, init? : * `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 + ## 2 Customisation -### 2.1 Chat +### 2.1 Callbacks + +* `parties.register_on_pre_party_invite(sender, p_name)`: use it to run additional checks. Returning true keeps executing the invite, returning false/nil cancels it +* `parties.register_on_party_invite(sender, p_name)`: called when an invite has been succesfully sent +* `parties.register_on_pre_party_join(party_leader, p_name)`: use it to run additional checks.Returning true keeps executing the join function, returning false/nil cancels it +* `parties.register_on_party_join(party_leader, p_name)`: called when a player succesfully joined a party +* `parties.register_on_party_leave(party_leader, p_name)`: called when a player leaves a party +* `parties.register_on_party_disband(p_name)`: called when a party gets disbanded (by `p_name`, who is the party leader) + +### 2.2 Chat Chat is light blue by default and it adds the `[Party] ` prefix at the beginning of every message. It then follows the format of the chat set by the owner. By default is: `[Party] message` diff --git a/api.lua b/api.lua index f243643..a710c15 100644 --- a/api.lua +++ b/api.lua @@ -9,6 +9,8 @@ local players_invited = {} -- KEY p_name; VALUE: inviter + + function parties.invite(sender, p_name) -- se si è in un gruppo ma non si è il capo gruppo @@ -36,12 +38,22 @@ function parties.invite(sender, p_name) minetest.chat_send_player(sender, minetest.colorize("#e6482e", S("[!] This player is already in a party!"))) return 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 + end + -- TODO: riproduzione suono invito 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 + -- eventuali callback + for _, callback in ipairs(parties.registered_on_party_invite) do + callback(sender, p_name) + end + -- se non ha accettato dopo 15 secondi, annullo l'invito minetest.after(15, function() if minetest.get_player_by_name(sender) and minetest.get_player_by_name(p_name) and players_invited[p_name] and players_invited[p_name] == sender then @@ -62,6 +74,11 @@ function parties.join(p_name) local party_leader = players_invited[p_name] + -- 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 + if players_in_parties[party_leader] == nil then current_parties[party_leader] = {party_leader} players_in_parties[party_leader] = party_leader @@ -75,6 +92,11 @@ function parties.join(p_name) table.insert(current_parties[party_leader], p_name) minetest.chat_send_player(p_name, format_party_message(S("You've joined @1's party", party_leader))) + -- eventuali callback + for _, callback in ipairs(parties.registered_on_party_join) do + callback(party_leader, p_name) + end + end @@ -99,6 +121,11 @@ function parties.leave(p_name) players_in_parties[p_name] = nil minetest.chat_send_player(p_name, format_party_message(S("You've left the party")), true) + -- eventuali callback + for _, callback in ipairs(parties.registered_on_party_leave) do + callback(party_leader, p_name) + end + -- se ad abbandonare è stato il capo gruppo, lo cambio if p_name == party_leader then @@ -138,6 +165,11 @@ function parties.disband(p_name) parties.chat_send_party(p_name, S("The party has been disbanded"), true) + -- eventuali callback + for _, callback in ipairs(parties.registered_on_party_disband) do + callback(p_name) + end + for _, pl_name in pairs(current_parties[p_name]) do players_in_parties[pl_name] = nil end diff --git a/callbacks.lua b/callbacks.lua new file mode 100644 index 0000000..93eb7b7 --- /dev/null +++ b/callbacks.lua @@ -0,0 +1,15 @@ +-- I had no idea how to do it, so, uhm... this is how Minetest handles callbacks +local function make_registration() + local t = {} + local registerfunc = function(func) + t[#t+1] = func + end + return t, registerfunc +end + +parties.registered_on_pre_party_invite, parties.register_on_pre_party_invite = make_registration() +parties.registered_on_party_invite, parties.register_on_party_invite = make_registration() +parties.registered_on_pre_party_join, parties.register_on_pre_party_join = make_registration() +parties.registered_on_party_join, parties.register_on_party_join = make_registration() +parties.registered_on_party_leave, parties.register_on_party_leave = make_registration() +parties.registered_on_party_disband, parties.register_on_party_disband = make_registration() diff --git a/init.lua b/init.lua index 31cffac..5266d26 100644 --- a/init.lua +++ b/init.lua @@ -1,4 +1,5 @@ dofile(minetest.get_modpath("parties") .. "/api.lua") +dofile(minetest.get_modpath("parties") .. "/callbacks.lua") dofile(minetest.get_modpath("parties") .. "/chatcmdbuilder.lua") dofile(minetest.get_modpath("parties") .. "/commands.lua") dofile(minetest.get_modpath("parties") .. "/player_manager.lua")