From 18e52dae5af1b33e6997ff98775f90acfe172011 Mon Sep 17 00:00:00 2001 From: fishyWET Date: Wed, 11 Oct 2017 18:31:03 +0800 Subject: [PATCH] Add squad chat and change the way chat was handled and some more changes. - EDIT for last commit: Documentation on how the mod stores info was also added - Remove /all - Add /p home & /p sethome -- leaders can set a party home - Add /p chat
-- change chat input - Add new squad channel - Remove some debug commands from squad.lua --- doc.txt | 2 + init.lua | 183 ++++++++++++++++++++++++++++++++++-------------------- squad.lua | 25 +------- 3 files changed, 122 insertions(+), 88 deletions(-) diff --git a/doc.txt b/doc.txt index 473abd0..9049f74 100644 --- a/doc.txt +++ b/doc.txt @@ -13,11 +13,13 @@ will support external mods. === mod_storage:_title -- chat title name === mod_storage:_leader -- 's party name === mod_storage:_lock -- join status of party +=== mod_storage:_home -- home of party ----------------------------------------------------- === attribute:partyinvite -- if invited, value is inviter's name === attribute:partypending -- for request mode parties only, if player sends request to join a party, value is party's leadername === attribute:partynoinvite -- if true all invites are ignored === attribute:partypvp -- if true, pvp between party members are enabled +=== attribute:partychat -- determines where the chat message is sent, main == global/main channel | party == party channel | squad == squad channel ===================================================== SQUAD === mod_storage:_squad -- player's squad name === mod_storage:_squad_no <1-7> -- squad position -- used for determining hud locations diff --git a/init.lua b/init.lua index ebd15e3..fa3dcf4 100644 --- a/init.lua +++ b/init.lua @@ -138,6 +138,7 @@ party.join = function(name, partyname) player:set_attribute("partypending", nil) player:set_nametag_attributes({text = "["..cparty_l.."] "..name}) party.send_notice_all(name, name.." has joined "..partyname.."'s party ["..cparty_l.."].") + player:set_attribute("partychat", "party") end party.leave = function(name) @@ -149,7 +150,10 @@ party.leave = function(name) mod_storage:set_string(name.."_officer", nil) mod_storage:set_string(name.."_leader", nil) mod_storage:set_string(name.."_lock", nil) + mod_storage:set_string(name.."_title", nil) + mod_storage:set_string(name.."_home", nil) player:set_nametag_attributes({text = name}) + player:set_attribute("partychat", "main") end @@ -175,7 +179,6 @@ minetest.register_chatcommand("p", { if param1 == "help" then party.send_notice(name, minetest.colorize("cyan", "@").." --- Send message to global chat (if you are in a party).") - party.send_notice(name, minetest.colorize("cyan", "/all ").." --- Send message to global chat (if you are in a party).") party.send_notice(name, minetest.colorize("cyan", "/p").." --- List your current party.") party.send_notice(name, minetest.colorize("cyan", "/p list").." --- List online members of your party.") party.send_notice(name, minetest.colorize("cyan", "/p list all").." --- List all members of your party.") @@ -184,33 +187,35 @@ minetest.register_chatcommand("p", { party.send_notice(name, minetest.colorize("cyan", "/p create ").." --- Create a party.") party.send_notice(name, minetest.colorize("cyan", "/p join ").." --- Join a party.") party.send_notice(name, minetest.colorize("cyan", "/p leave").." --- Leave your party.") + party.send_notice(name, minetest.colorize("cyan", "/p home").." --- Teleport to your party home (if your leader has one set).") + party.send_notice(name, minetest.colorize("cyan", "/p chat
").." --- Switch your chat input. Leave empty to get your current chat input.") party.send_notice(name, minetest.colorize("cyan", "/p invite ").." --- Accept/ reject a party invite.") party.send_notice(name, minetest.colorize("cyan", "/p noinvite").." --- Toggle noinvites, if on, reject all parties invites automatically.") party.send_notice(name, minetest.colorize("cyan", "/p pvp").." --- Toggle friendly fire, if two players have friendly fire enabled even though they are in the same party, they can fight.") party.send_notice(name, " ===== PARTY OFFICERS/ PARTY LEADER COMMANDS: ===== ") - party.send_notice(name, minetest.colorize("cyan", "/p kick ").." --- Kick a player out of your party") - party.send_notice(name, minetest.colorize("cyan", "/p invite ").." --- Invite a player to join your party") - party.send_notice(name, minetest.colorize("cyan", "/p ").." --- Accept/ reject a join request (if joining method is set to [Request Mode])") + party.send_notice(name, minetest.colorize("cyan", "/p kick ").." --- Kick a player out of your party.") + party.send_notice(name, minetest.colorize("cyan", "/p invite ").." --- Invite a player to join your party.") + party.send_notice(name, minetest.colorize("cyan", "/p ").." --- Accept/ reject a join request (if joining method is set to [Request Mode]).") party.send_notice(name, " ===== PARTY LEADER-ONLY COMMANDS: ===== ") - party.send_notice(name, minetest.colorize("cyan", "/p disband").." --- Disband your party") - party.send_notice(name, minetest.colorize("cyan", "/p rename ").." --- Rename your party") + party.send_notice(name, minetest.colorize("cyan", "/p disband").." --- Disband your party.") + party.send_notice(name, minetest.colorize("cyan", "/p rename ").." --- Rename your party.") + party.send_notice(name, minetest.colorize("cyan", "/p sethome").." --- Set your party home.") + party.send_notice(name, minetest.colorize("cyan", "/p sethome remove").." --- Remove your party home.") party.send_notice(name, minetest.colorize("cyan", "/p officer ").." --- Toogle a player's officer position. Officers can kick & invite.") - party.send_notice(name, minetest.colorize("cyan", "/p lock ").." --- Toggle joining method for your party") + party.send_notice(name, minetest.colorize("cyan", "/p lock ").." --- Toggle joining method for your party.") party.send_notice(name, minetest.colorize("cyan", "/p title ").." --- Adds a title to a player in party chat.") party.send_notice(name, " ===== ADMIN COMMANDS: ===== ") - party.send_notice(name, minetest.colorize("cyan", "/p forcedisband <partyname>").." --- Forcefully disband a party (requires 'ban' privilege)") - party.send_notice(name, minetest.colorize("cyan", "/p forcejoin <partyname>").." --- Forcefully let yourself in a party regardless of its lock mode (requires 'ban' privilege)") - party.send_notice(name, minetest.colorize("cyan", "/p forcekick <playername>").." --- Forcefully kick a player from a party (requires 'kick' privilege)") + party.send_notice(name, minetest.colorize("cyan", "/p forcedisband <partyname>").." --- Forcefully disband a party (requires 'ban' privilege).") + party.send_notice(name, minetest.colorize("cyan", "/p forcejoin <partyname>").." --- Forcefully let yourself in a party regardless of its lock mode (requires 'ban' privilege).") + party.send_notice(name, minetest.colorize("cyan", "/p forcekick <playername>").." --- Forcefully kick a player from a party (requires 'kick' privilege).") -- TODO -- formspecs equivalents -- party.send_notice(name, "/p colour <partycolour> --- Change colour of party tag") - -- party.send_notice(name, "/p chat <party/ally/global> --- Toggle between party chat, ally chat, global chat") - -- party.send_notice(name, "/p home --- Teleports to party home (set by leader)") - -- party.send_notice(name, "/p home set --- Set a party home") + -- party.send_notice(name, "/p customrank <player> <rank> --- Custom ranks -- for customizing certain party features later on.") -- party.send_notice(name, "/p ally/enemy/neutral <partyname> --- Toggle diplomacy status with another party. Allied parties will have no friendly fire and there will be ally chat.") -- party.send_notice(name, "/p ally list --- Ally list.") @@ -332,6 +337,7 @@ minetest.register_chatcommand("p", { mod_storage:set_string(name.."_party", name) mod_storage:set_string(name.."_leader", param2) player:set_attribute("partyinvite", nil) + player:set_attribute("partychat", "party") player:set_nametag_attributes({text = "["..param2.."] "..name}) party.send_notice(name, "You created "..name.."'s party ["..param2.."].") @@ -393,6 +399,41 @@ minetest.register_chatcommand("p", { else party.send_notice(name, "Party does not exist!") end + -- /p home + elseif param1 == "home" then + if party.check(name, 1) == true then + return + end + + local cparty_home = mod_storage:get_string(cparty.."_home") + if cparty_home ~= "" then + party.send_notice(name, "Teleporting to party home...") + player:set_pos(minetest.deserialize(cparty_home)) + else party.send_notice(name, "Party home is not set by leader!") + end + + elseif param1 == "chat" then + if party.check(name, 1) == true then + return + end + + if (param2 == "main" or param2 == "global") then + player:set_attribute("partychat", "main") + party.send_notice(name, "Chat input set to main chat.") + elseif param2 == "party" then + player:set_attribute("partychat", "party") + party.send_notice(name, "Chat input set to party chat.") + elseif param2 == "squad" then + if mod_storage:get_string(name.."_squad") == "" then + party.send_notice(name, "You are not in a squad!") + return + end + player:set_attribute("partychat", "squad") + party.send_notice(name, "Chat input set to squad chat.") + elseif param2 == nil then + party.send_notice(name, "Current chat input is set to "..player:get_attribute("partychat").." chat.") + end + -- /p noinvite elseif param1 == "noinvite" then if cparty == "" then @@ -497,6 +538,20 @@ minetest.register_chatcommand("p", { mod_storage:set_string(name.."_lock", nil) party.send_notice_all(name, "[Open mode] Public joining is enabled for "..name.."'s party ["..cparty_l.."].") end + + elseif param1 == "sethome" then + if party.check(name, 3) == true then + return + end + + if param2 == "remove" then + mod_storage:set_string(cparty.."_home", nil) + party.send_notice(name, "Party home removed!") + else + mod_storage:set_string(cparty.."_home", minetest.serialize(player:get_pos())) + party.send_notice(name, "Party home has been set to "..minetest.serialize(player:get_pos())) + end + -- /p officer elseif param1 == "officer" and param2 ~= nil then @@ -803,79 +858,75 @@ minetest.register_chatcommand("p", { end, }) -minetest.register_chatcommand("all", { - description = "Chat on main chat if in party.", - privs = {shout=true}, - func = function(name, param) - local player = minetest.get_player_by_name(name) - local cparty = mod_storage:get_string(name.."_party") - if cparty == "" then - party.send_notice(name, "You are not in a party! You can talk normally to main chat without commands.") - else - local cparty_l = mod_storage:get_string(cparty.."_leader") - for _,players in ipairs(minetest.get_connected_players()) do - local names = players:get_player_name() - minetest.chat_send_player(names, "<Party:"..cparty_l.." | "..name.."> "..param) - end - end - - -- chat logging - if cparty ~= "" then - minetest.log("action", "CHAT : <"..name.."> : "..param) - end - end, -}) - - minetest.register_on_chat_message(function(name, message) local player = minetest.get_player_by_name(name) local cparty = mod_storage:get_string(name.."_party") local cparty_title = mod_storage:get_string(name.."_title") + local csquad = mod_storage:get_string(name.."_squad") + local cinput = player:get_attribute("partychat") -- check if player has shout privs if not minetest.check_player_privs(name, {shout=true}) then return end - for _,players in ipairs(minetest.get_connected_players()) do - local names = players:get_player_name() - - if string.match(message, "^@(.+)") then - local cparty_l = mod_storage:get_string(cparty.."_leader") - - minetest.chat_send_player(names, "<Party:"..cparty_l.." | "..name.."> "..string.gsub(message, "^@", "")) - end - - if cparty ~= "" and cparty == mod_storage:get_string(names.."_party") and not string.match(message, "^@(.+)") then - if cparty_title ~= "" then - minetest.chat_send_player(names, minetest.colorize("limegreen", "[Party]").." <"..minetest.colorize("lightgrey", cparty_title).." "..name.."> " ..message) - party.chat_spy(names, message) - elseif cparty_title == "" then - minetest.chat_send_player(names, minetest.colorize("limegreen", "[Party]").." <"..name.."> " ..message) - party.chat_spy(names, message) - end - end - end - -- main chat - for _,players in ipairs(minetest.get_connected_players()) do - local names = players:get_player_name() - if cparty == "" then - minetest.chat_send_player(names, "<"..name.."> " ..message) - - end - end - -- chat logging if cparty == "" then minetest.log("action", "CHAT : <"..name.."> : "..message) elseif cparty ~= "" then + local cparty_l = mod_storage:get_string(cparty.."_leader") + if string.match(message, "^@(.+)") then minetest.log("action", "CHAT : <"..name.."> : "..string.gsub(message, "^@", "")) - else minetest.log("action", "CHAT [PARTY] : <"..name.."> : "..message) + elseif cinput == "main" then + minetest.log("action", "CHAT : <"..name.."> : "..string.gsub(message, "^@", "")) + else minetest.log("action", "CHAT [PARTY:"..cparty_l.."] : <"..name.."> : "..message) end end + + for _,players in ipairs(minetest.get_connected_players()) do + local names = players:get_player_name() + + -- Main chat + if cparty == "" then + minetest.chat_send_player(names, "<"..name.."> " ..message) + end + + -- Main chat (@) + if string.match(message, "^@(.+)") and cparty ~= "" then + local cparty_l = mod_storage:get_string(cparty.."_leader") + minetest.chat_send_player(names, "<Party:"..cparty_l.." | "..name.."> "..string.gsub(message, "^@", "")) + end + + -- Main chat (chat input) + if cinput == "main" and cparty ~= "" and not string.match(message, "^@(.+)") then + local cparty_l = mod_storage:get_string(cparty.."_leader") + minetest.chat_send_player(names, "<Party:"..cparty_l.." | "..name.."> "..message) + end + + -- Party Chat + if cparty == mod_storage:get_string(names.."_party") and cinput == "party" and not string.match(message, "^@(.+)") then + if cparty_title ~= "" then + minetest.chat_send_player(names, minetest.colorize("limegreen", "[Party]").." <"..minetest.colorize("lightgrey", cparty_title).." "..name.."> " ..message) + party.chat_spy(name, message) + elseif cparty_title == "" then + minetest.chat_send_player(names, minetest.colorize("limegreen", "[Party]").." <"..name.."> " ..message) + party.chat_spy(name, message) + end + -- Squad chat + elseif cparty == mod_storage:get_string(names.."_party") and csquad == mod_storage:get_string(names.."_squad") and cinput == "squad" and not string.match(message, "^@(.+)") then + if cparty_title ~= "" then + minetest.chat_send_player(names, minetest.colorize("orange", "[Squad]").." <"..minetest.colorize("lightgrey", cparty_title).." "..name.."> " ..message) + party.chat_spy(name, message) + elseif cparty_title == "" then + minetest.chat_send_player(names, minetest.colorize("orange", "[Squad]").." <"..name.."> " ..message) + party.chat_spy(name, message) + end + end + end + return true end) diff --git a/squad.lua b/squad.lua index e301ae0..4852348 100644 --- a/squad.lua +++ b/squad.lua @@ -168,6 +168,7 @@ squad.join = function(name, tag) squad.send_notice_all(name, name.." has joined the ["..tag.."] squad") player:set_nametag_attributes({text = "["..cparty_l.."-"..tag.."] "..name}) + player:set_attribute("partychat", "squad") end squad.replace_hud = function(name, oldno, newno) @@ -202,6 +203,7 @@ squad.leave = function(name, tag) local player = minetest.get_player_by_name(name) local csquad = mod_storage:get_string(name.."_squad") local csquad_no = tonumber(mod_storage:get_string(name.."_squad_no")) + player:set_attribute("partychat", "party") if csquad == "" then return @@ -291,28 +293,7 @@ minetest.register_chatcommand("sq", { return end - if param1 == "debug" then - if csquad == "" then - squad.send_notice(name, "You are not in a squad!") - return - end - - local listnames = "" - for _,players in ipairs(minetest.get_connected_players()) do - local playernames = players:get_player_name() - if cparty == mod_storage:get_string(playernames.."_party") and csquad == mod_storage:get_string(playernames.."_squad") then - local msquad_n = mod_storage:get_string(playernames.."_squad_no") - listnames = listnames .. msquad_n .. ", " - end - end - squad.send_notice(name, listnames) - elseif param1 == "id" then - squad.send_notice(name, "BG: "..minetest.serialize(ids_bg)) - squad.send_notice(name, "HP: "..minetest.serialize(ids_hp)) - squad.send_notice(name, "TAG: "..minetest.serialize(ids_tag)) - squad.send_notice(name, "HPTAG: "..minetest.serialize(ids_hptag)) - - elseif param1 == "help" then + if param1 == "help" then squad.send_notice(name, "NOTE: Unlike parties, squads do not last permanently, you automatically leave if you leave the game and if the squad leader does so, the squad is automatically disbanded.") squad.send_notice(name, minetest.colorize("cyan", "/sq join <squadname>").. " --- Join a squad.") squad.send_notice(name, minetest.colorize("cyan", "/sq leave").. " --- Leave your squad.")