From b8884d65722703d123ba4fbcba1a9e5ba28eb0a6 Mon Sep 17 00:00:00 2001 From: Bemvaras <169070864+Barathos@users.noreply.github.com> Date: Thu, 10 Jul 2025 13:09:04 -0600 Subject: [PATCH] [Quest API] Add GetMemberRole() to Perl/Lua (#4963) * Add group member role retrieval * Expose group member role to Lua * Cleanup * Cleanup --------- Co-authored-by: Kinglykrab --- zone/groups.cpp | 58 ++++++++++++++++++++++++++++++++++++++------ zone/groups.h | 9 ++++++- zone/lua_group.cpp | 12 +++++++++ zone/lua_group.h | 2 ++ zone/perl_groups.cpp | 12 +++++++++ 5 files changed, 85 insertions(+), 8 deletions(-) diff --git a/zone/groups.cpp b/zone/groups.cpp index 821546e7e..b70f44f18 100644 --- a/zone/groups.cpp +++ b/zone/groups.cpp @@ -2472,19 +2472,63 @@ bool Group::AmIPuller(const char *mob_name) return !((bool)PullerName.compare(mob_name)); } -bool Group::HasRole(Mob *m, uint8 Role) +bool Group::HasRole(Mob* m, uint8 Role) { - if(!m) + if (!m) { return false; - - for(uint32 i = 0; i < MAX_GROUP_MEMBERS; ++i) - { - if((m == members[i]) && (MemberRoles[i] & Role)) - return true; } + + 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*/) { if (sender && sender->IsClient()) { for (uint32 i = 0; i < MAX_GROUP_MEMBERS; i++) { diff --git a/zone/groups.h b/zone/groups.h index a07ecc61c..8c312f6ef 100644 --- a/zone/groups.h +++ b/zone/groups.h @@ -30,7 +30,12 @@ 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 +124,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/lua_group.cpp b/zone/lua_group.cpp index a427ef3d3..4bb1f4c4f 100644 --- a/zone/lua_group.cpp +++ b/zone/lua_group.cpp @@ -122,6 +122,16 @@ Lua_Mob Lua_Group::GetMember(int member_index) { return self->members[member_index]; } +uint8 Lua_Group::GetMemberRole(Lua_Mob member) { + Lua_Safe_Call_Int(); + return self->GetMemberRole(member); +} + +uint8 Lua_Group::GetMemberRole(const char* name) { + Lua_Safe_Call_Int(); + return self->GetMemberRole(name); +} + bool Lua_Group::DoesAnyMemberHaveExpeditionLockout(std::string expedition_name, std::string event_name) { Lua_Safe_Call_Bool(); @@ -155,6 +165,8 @@ luabind::scope lua_register_group() { .def("GetLeaderName", (const char*(Lua_Group::*)(void))&Lua_Group::GetLeaderName) .def("GetLowestLevel", (uint32(Lua_Group::*)(void))&Lua_Group::GetLowestLevel) .def("GetMember", (Lua_Mob(Lua_Group::*)(int))&Lua_Group::GetMember) + .def("GetMemberRole", (uint8(Lua_Group::*)(Lua_Mob))&Lua_Group::GetMemberRole) + .def("GetMemberRole", (uint8(Lua_Group::*)(const char*))&Lua_Group::GetMemberRole) .def("GetTotalGroupDamage", (uint32(Lua_Group::*)(Lua_Mob))&Lua_Group::GetTotalGroupDamage) .def("GroupCount", (int(Lua_Group::*)(void))&Lua_Group::GroupCount) .def("GroupMessage", (void(Lua_Group::*)(Lua_Mob,const char*))&Lua_Group::GroupMessage) diff --git a/zone/lua_group.h b/zone/lua_group.h index 949740d66..ee4e353bc 100644 --- a/zone/lua_group.h +++ b/zone/lua_group.h @@ -49,6 +49,8 @@ public: void TeleportGroup(Lua_Mob sender, uint32 zone_id, uint32 instance_id, float x, float y, float z, float h); int GetID(); Lua_Mob GetMember(int member_index); + uint8 GetMemberRole(Lua_Mob member); + uint8 GetMemberRole(const char* name); bool DoesAnyMemberHaveExpeditionLockout(std::string expedition_name, std::string event_name); bool DoesAnyMemberHaveExpeditionLockout(std::string expedition_name, std::string event_name, int max_check_count); }; diff --git a/zone/perl_groups.cpp b/zone/perl_groups.cpp index f93e31db8..a97716a28 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); @@ -163,6 +173,8 @@ void perl_register_group() package.add("GetLeaderName", &Perl_Group_GetLeaderName); 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);