Script/Commands: Implement command to list the members of a group/party.

This commit is contained in:
w1sht0l1v3
2013-01-26 00:41:46 +02:00
parent f3d0ea66be
commit 6acfa49065
3 changed files with 86 additions and 1 deletions

View File

@@ -0,0 +1,8 @@
DELETE FROM `trinity_string` WHERE `entry` IN (1149,1150);
INSERT INTO `trinity_string` (`entry`,`content_default`,`content_loc1`,`content_loc2`,`content_loc3`,`content_loc4`,`content_loc5`,`content_loc6`,`content_loc7`,`content_loc8`) VALUES
(1149,'Group type: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(1150,'Name: %s (%s), GUID: %u, Flags: %s, Roles: %s',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
DELETE FROM `command` WHERE `name`='group list';
INSERT INTO `command` (`name`,`security`,`help`) VALUES
('group list',3,'Syntax: .group list [$CharacterName] \r\nLists all the members of the group/party the player is in.');

View File

@@ -851,7 +851,9 @@ enum TrinityStrings
LANG_GROUP_PLAYER_JOINED = 1146,
LANG_GROUP_NOT_IN_GROUP = 1147,
LANG_GROUP_FULL = 1148,
// Room for more level 3 1149-1199 not used
LANG_GROUP_TYPE = 1149,
LANG_GROUP_PLAYER_NAME_GUID = 1150,
// Room for more level 3 1151-1199 not used
// Debug commands
LANG_CINEMATIC_NOT_EXIST = 1200,

View File

@@ -33,6 +33,8 @@
#include "ace/INET_Addr.h"
#include "Player.h"
#include "Pet.h"
#include "LFG.h"
#include "GroupMGR.h"
class misc_commandscript : public CommandScript
{
@@ -47,6 +49,7 @@ public:
{ "disband", SEC_ADMINISTRATOR, false, &HandleGroupDisbandCommand, "", NULL },
{ "remove", SEC_ADMINISTRATOR, false, &HandleGroupRemoveCommand, "", NULL },
{ "join", SEC_ADMINISTRATOR, false, &HandleGroupJoinCommand, "", NULL },
{ "list", SEC_ADMINISTRATOR, false, &HandleGroupListCommand, "", NULL },
{ NULL, 0, false, NULL, "", NULL }
};
static ChatCommand petCommandTable[] =
@@ -2781,6 +2784,78 @@ public:
return true;
}
static bool HandleGroupListCommand(ChatHandler* handler, char const* args)
{
Player* playerTarget;
uint64 guidTarget;
std::string nameTarget;
uint32 parseGUID = MAKE_NEW_GUID(atol((char*)args), 0, HIGHGUID_PLAYER);
if (sObjectMgr->GetPlayerNameByGUID(parseGUID, nameTarget))
{
playerTarget = sObjectMgr->GetPlayerByLowGUID(parseGUID);
guidTarget = parseGUID;
}
else if (!handler->extractPlayerTarget((char*)args, &playerTarget, &guidTarget, &nameTarget))
return false;
Group* groupTarget = NULL;
if (playerTarget)
groupTarget = playerTarget->GetGroup();
if (!groupTarget)
{
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GROUP_MEMBER);
stmt->setUInt32(0, guidTarget);
PreparedQueryResult resultGroup = CharacterDatabase.Query(stmt);
if (resultGroup)
groupTarget = sGroupMgr->GetGroupByDbStoreId((*resultGroup)[0].GetUInt32());
}
if (groupTarget)
{
handler->PSendSysMessage(LANG_GROUP_TYPE, (groupTarget->isRaidGroup() ? "raid" : "party"));
Group::MemberSlotList const& members = groupTarget->GetMemberSlots();
Group::MemberSlotList::const_iterator itr;
for (itr = members.begin(); itr != members.end(); ++itr)
{
std::ostringstream flags, roles;
if ((*itr).flags & MEMBER_FLAG_ASSISTANT)
flags << "Assistant ";
if ((*itr).flags & MEMBER_FLAG_MAINTANK)
flags << "MainTank ";
if ((*itr).flags & MEMBER_FLAG_MAINASSIST)
flags << "MainAssist ";
if ((*itr).roles & PLAYER_ROLE_LEADER)
roles << "Leader ";
if ((*itr).roles & PLAYER_ROLE_TANK)
roles << "Tank ";
if ((*itr).roles & PLAYER_ROLE_HEALER)
roles << "Healer ";
if ((*itr).roles & PLAYER_ROLE_DAMAGE)
roles << "Damage ";
Player* p = ObjectAccessor::FindPlayer((*itr).guid);
const char* onlineState = (p && p->IsInWorld()) ? "online" : "offline";
std::string flagsStr = (flags.str().empty()) ? "None" : flags.str();
std::string rolesStr = (roles.str().empty()) ? "None" : roles.str();
handler->PSendSysMessage(LANG_GROUP_PLAYER_NAME_GUID, (*itr).name.c_str(), onlineState, GUID_LOPART((*itr).guid), flagsStr.c_str(), rolesStr.c_str());
}
return true;
}
else
{
handler->PSendSysMessage(LANG_GROUP_NOT_IN_GROUP, nameTarget.c_str());
return true;
}
return true;
}
static bool HandlePlayAllCommand(ChatHandler* handler, char const* args)
{
if (!*args)