diff --git a/zone/groups.cpp b/zone/groups.cpp index a66e7a4bd..24904c5bc 100644 --- a/zone/groups.cpp +++ b/zone/groups.cpp @@ -2474,15 +2474,53 @@ bool Group::AmIPuller(const char *mob_name) bool Group::HasRole(Mob *m, uint8 Role) { - if(!m) - return false; + if(!m) + return false; - for(uint32 i = 0; i < MAX_GROUP_MEMBERS; ++i) - { - if((m == members[i]) && (MemberRoles[i] & Role)) - return true; - } - return false; + for(uint32 i = 0; i < MAX_GROUP_MEMBERS; ++i) + { + if((m == members[i]) && (MemberRoles[i] & Role)) + return true; + } + return false; +} + +uint8 Group::GetMemberRole(Mob *m) +{ + if(!m) + return 0; + + for(uint32 i = 0; i < MAX_GROUP_MEMBERS; ++i) + { + if(m == members[i]) + { + uint8 role = MemberRoles[i]; + if(m == leader) + role |= RoleLeader; + return role; + } + } + + return 0; +} + +uint8 Group::GetMemberRole(const char *name) +{ + if(!name) + return 0; + + for(uint32 i = 0; i < MAX_GROUP_MEMBERS; ++i) + { + if(!strcasecmp(membername[i], name)) + { + uint8 role = MemberRoles[i]; + if(leader && !strcasecmp(leader->GetName(), name)) + role |= RoleLeader; + return role; + } + } + + return 0; } void Group::QueueClients(Mob *sender, const EQApplicationPacket *app, bool ack_required /*= true*/, bool ignore_sender /*= true*/, float distance /*= 0*/) { diff --git a/zone/groups.h b/zone/groups.h index a07ecc61c..35f909ea6 100644 --- a/zone/groups.h +++ b/zone/groups.h @@ -30,7 +30,7 @@ class Mob; #define MAX_MARKED_NPCS 3 -enum { RoleAssist = 1, RoleTank = 2, RolePuller = 4 }; +enum { RoleAssist = 1, RoleTank = 2, RolePuller = 4, RoleLeader = 8 }; class GroupIDConsumer { public: @@ -119,6 +119,8 @@ public: void SetGroupTankTarget(Mob *m); void SetGroupPullerTarget(Mob *m); bool HasRole(Mob *m, uint8 Role); + uint8 GetMemberRole(Mob *m); + uint8 GetMemberRole(const char *name); void NotifyAssistTarget(Client *c); void NotifyTankTarget(Client *c); void NotifyPullerTarget(Client *c); diff --git a/zone/perl_groups.cpp b/zone/perl_groups.cpp index f93e31db8..b93e8ce70 100644 --- a/zone/perl_groups.cpp +++ b/zone/perl_groups.cpp @@ -127,6 +127,16 @@ Client* Perl_Group_GetMember(Group* self, int member_index) // @categories Accou return member ? member->CastToClient() : nullptr; } +uint8_t Perl_Group_GetMemberRole(Group* self, Mob* member) // @categories Account and Character, Script Utility, Group +{ + return self->GetMemberRole(member); +} + +uint8_t Perl_Group_GetMemberRole(Group* self, const char* name) // @categories Account and Character, Script Utility, Group +{ + return self->GetMemberRole(name); +} + bool Perl_Group_DoesAnyMemberHaveExpeditionLockout(Group* self, std::string expedition_name, std::string event_name) { return self->AnyMemberHasDzLockout(expedition_name, event_name); @@ -161,9 +171,11 @@ void perl_register_group() package.add("GetID", &Perl_Group_GetID); package.add("GetLeader", &Perl_Group_GetLeader); package.add("GetLeaderName", &Perl_Group_GetLeaderName); - package.add("GetLowestLevel", &Perl_Group_GetLowestLevel); - package.add("GetMember", &Perl_Group_GetMember); - package.add("GetTotalGroupDamage", &Perl_Group_GetTotalGroupDamage); + package.add("GetLowestLevel", &Perl_Group_GetLowestLevel); + package.add("GetMember", &Perl_Group_GetMember); + package.add("GetMemberRole", (uint8_t(*)(Group*, Mob*))&Perl_Group_GetMemberRole); + package.add("GetMemberRole", (uint8_t(*)(Group*, const char*))&Perl_Group_GetMemberRole); + package.add("GetTotalGroupDamage", &Perl_Group_GetTotalGroupDamage); package.add("GroupCount", &Perl_Group_GroupCount); package.add("GroupMessage", (void(*)(Group*, Mob*, const char*))&Perl_Group_GroupMessage); package.add("GroupMessage", (void(*)(Group*, Mob*, uint8_t, const char*))&Perl_Group_GroupMessage);