mirror of
https://github.com/EQEmu/Server.git
synced 2026-06-11 11:48:37 +00:00
Grouping with Mercenaries is considerably less buggy.
This commit is contained in:
+114
-32
@@ -203,28 +203,34 @@ void Group::SplitMoney(uint32 copper, uint32 silver, uint32 gold, uint32 platinu
|
||||
}
|
||||
}
|
||||
|
||||
bool Group::AddMember(Mob* newmember, const char *NewMemberName, uint32 CharacterID)
|
||||
bool Group::AddMember(Mob* newmember, const char *NewMemberName, uint32 CharacterID, bool ismerc)
|
||||
{
|
||||
bool InZone = true;
|
||||
bool ismerc = false;
|
||||
|
||||
// This method should either be passed a Mob*, if the new member is in this zone, or a nullptr Mob*
|
||||
// and the name and CharacterID of the new member, if they are out of zone.
|
||||
//
|
||||
if(!newmember && !NewMemberName)
|
||||
return false;
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if(GroupCount() >= MAX_GROUP_MEMBERS) //Sanity check for merging groups together.
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if(!newmember)
|
||||
{
|
||||
InZone = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
NewMemberName = newmember->GetCleanName();
|
||||
|
||||
if(newmember->IsClient())
|
||||
{
|
||||
CharacterID = newmember->CastToClient()->CharacterID();
|
||||
}
|
||||
if(newmember->IsMerc())
|
||||
{
|
||||
Client* owner = newmember->CastToMerc()->GetMercOwner();
|
||||
@@ -232,18 +238,20 @@ bool Group::AddMember(Mob* newmember, const char *NewMemberName, uint32 Characte
|
||||
{
|
||||
CharacterID = owner->CastToClient()->CharacterID();
|
||||
NewMemberName = newmember->GetName();
|
||||
ismerc = true;
|
||||
}
|
||||
ismerc = true;
|
||||
}
|
||||
}
|
||||
|
||||
uint32 i = 0;
|
||||
|
||||
// See if they are already in the group
|
||||
//
|
||||
uint32 i = 0;
|
||||
for (i = 0; i < MAX_GROUP_MEMBERS; ++i)
|
||||
{
|
||||
if(!strcasecmp(membername[i], NewMemberName))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Put them in the group
|
||||
for (i = 0; i < MAX_GROUP_MEMBERS; ++i)
|
||||
@@ -251,17 +259,20 @@ bool Group::AddMember(Mob* newmember, const char *NewMemberName, uint32 Characte
|
||||
if (membername[i][0] == '\0')
|
||||
{
|
||||
if(InZone)
|
||||
{
|
||||
members[i] = newmember;
|
||||
|
||||
}
|
||||
strcpy(membername[i], NewMemberName);
|
||||
MemberRoles[i] = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Is this even possible based on the above loops? Remove?
|
||||
if (i == MAX_GROUP_MEMBERS)
|
||||
{
|
||||
return false;
|
||||
|
||||
strcpy(membername[i], NewMemberName);
|
||||
MemberRoles[i] = 0;
|
||||
}
|
||||
|
||||
int x=1;
|
||||
|
||||
@@ -270,11 +281,12 @@ bool Group::AddMember(Mob* newmember, const char *NewMemberName, uint32 Characte
|
||||
GroupJoin_Struct* gj = (GroupJoin_Struct*) outapp->pBuffer;
|
||||
strcpy(gj->membername, NewMemberName);
|
||||
gj->action = groupActJoin;
|
||||
|
||||
gj->leader_aas = LeaderAbilities;
|
||||
|
||||
for (i = 0;i < MAX_GROUP_MEMBERS; i++) {
|
||||
if (members[i] != nullptr && members[i] != newmember) {
|
||||
for (i = 0;i < MAX_GROUP_MEMBERS; i++)
|
||||
{
|
||||
if (members[i] != nullptr && members[i] != newmember)
|
||||
{
|
||||
//fill in group join & send it
|
||||
if(members[i]->IsMerc())
|
||||
{
|
||||
@@ -284,18 +296,23 @@ bool Group::AddMember(Mob* newmember, const char *NewMemberName, uint32 Characte
|
||||
{
|
||||
strcpy(gj->yourname, members[i]->GetCleanName());
|
||||
}
|
||||
if(members[i]->IsClient()) {
|
||||
if(members[i]->IsClient())
|
||||
{
|
||||
members[i]->CastToClient()->QueuePacket(outapp);
|
||||
|
||||
//put new member into existing person's list
|
||||
//put new member into existing group members' list(s)
|
||||
strcpy(members[i]->CastToClient()->GetPP().groupMembers[this->GroupCount()-1], NewMemberName);
|
||||
}
|
||||
|
||||
//put this existing person into the new member's list
|
||||
if(InZone && newmember->IsClient()) {
|
||||
//put existing group member(s) into the new member's list
|
||||
if(InZone && newmember->IsClient())
|
||||
{
|
||||
if(IsLeader(members[i]))
|
||||
{
|
||||
strcpy(newmember->CastToClient()->GetPP().groupMembers[0], members[i]->GetCleanName());
|
||||
else {
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy(newmember->CastToClient()->GetPP().groupMembers[x], members[i]->GetCleanName());
|
||||
x++;
|
||||
}
|
||||
@@ -337,7 +354,9 @@ bool Group::AddMember(Mob* newmember, const char *NewMemberName, uint32 Characte
|
||||
#endif //BOTS
|
||||
}
|
||||
else
|
||||
{
|
||||
database.SetGroupID(NewMemberName, GetID(), CharacterID, ismerc);
|
||||
}
|
||||
|
||||
safe_delete(outapp);
|
||||
|
||||
@@ -512,6 +531,30 @@ void Group::MemberZoned(Mob* removemob) {
|
||||
mentoree = nullptr;
|
||||
}
|
||||
|
||||
void Group::SendGroupJoinOOZ(Mob* NewMember) {
|
||||
|
||||
if (NewMember == nullptr)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (!NewMember->HasGroup())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//send updates to clients out of zone...
|
||||
ServerPacket* pack = new ServerPacket(ServerOP_GroupJoin, sizeof(ServerGroupJoin_Struct));
|
||||
ServerGroupJoin_Struct* gj = (ServerGroupJoin_Struct*)pack->pBuffer;
|
||||
gj->gid = GetID();
|
||||
gj->zoneid = zone->GetZoneID();
|
||||
gj->instance_id = zone->GetInstanceID();
|
||||
strcpy(gj->member_name, NewMember->GetName());
|
||||
worldserver.SendPacket(pack);
|
||||
safe_delete(pack);
|
||||
|
||||
}
|
||||
|
||||
bool Group::DelMemberOOZ(const char *Name) {
|
||||
|
||||
if(!Name) return false;
|
||||
@@ -619,7 +662,8 @@ bool Group::DelMember(Mob* oldmember,bool ignoresender)
|
||||
#endif //BOTS
|
||||
}
|
||||
|
||||
if (!ignoresender) {
|
||||
if (!ignoresender)
|
||||
{
|
||||
strcpy(gu->yourname,oldmember->GetCleanName());
|
||||
strcpy(gu->membername,oldmember->GetCleanName());
|
||||
gu->action = groupActLeave;
|
||||
@@ -629,7 +673,18 @@ bool Group::DelMember(Mob* oldmember,bool ignoresender)
|
||||
}
|
||||
|
||||
if(oldmember->IsClient())
|
||||
database.SetGroupID(oldmember->GetCleanName(), 0, oldmember->CastToClient()->CharacterID());
|
||||
{
|
||||
database.SetGroupID(oldmember->GetCleanName(), 0, oldmember->CastToClient()->CharacterID(), false);
|
||||
}
|
||||
|
||||
if(oldmember->IsMerc())
|
||||
{
|
||||
Client* owner = oldmember->CastToMerc()->GetMercOwner();
|
||||
if(owner)
|
||||
{
|
||||
database.SetGroupID(oldmember->GetName(), 0, owner->CharacterID(), true);
|
||||
}
|
||||
}
|
||||
|
||||
oldmember->SetGrouped(false);
|
||||
disbandcheck = true;
|
||||
@@ -819,20 +874,33 @@ void Group::DisbandGroup() {
|
||||
Client *Leader = nullptr;
|
||||
|
||||
uint32 i;
|
||||
for (i = 0; i < MAX_GROUP_MEMBERS; i++) {
|
||||
if (members[i] == nullptr) {
|
||||
for (i = 0; i < MAX_GROUP_MEMBERS; i++)
|
||||
{
|
||||
if (members[i] == nullptr)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (members[i]->IsClient()) {
|
||||
if (members[i]->IsClient())
|
||||
{
|
||||
if(IsLeader(members[i]))
|
||||
{
|
||||
Leader = members[i]->CastToClient();
|
||||
}
|
||||
|
||||
strcpy(gu->yourname, members[i]->GetName());
|
||||
database.SetGroupID(members[i]->GetName(), 0, members[i]->CastToClient()->CharacterID());
|
||||
database.SetGroupID(members[i]->GetName(), 0, members[i]->CastToClient()->CharacterID(), false);
|
||||
members[i]->CastToClient()->QueuePacket(outapp);
|
||||
SendMarkedNPCsToMember(members[i]->CastToClient(), true);
|
||||
|
||||
}
|
||||
|
||||
if (members[i]->IsMerc())
|
||||
{
|
||||
Client* owner = members[i]->CastToMerc()->GetMercOwner();
|
||||
if(owner)
|
||||
{
|
||||
database.SetGroupID(members[i]->GetName(), 0, owner->CharacterID(), true);
|
||||
}
|
||||
}
|
||||
|
||||
members[i]->SetGrouped(false);
|
||||
@@ -852,9 +920,12 @@ void Group::DisbandGroup() {
|
||||
|
||||
entity_list.RemoveGroup(GetID());
|
||||
if(GetID() != 0)
|
||||
{
|
||||
database.ClearGroup(GetID());
|
||||
}
|
||||
|
||||
if(Leader && (Leader->IsLFP())) {
|
||||
if(Leader && (Leader->IsLFP()))
|
||||
{
|
||||
Leader->UpdateLFP();
|
||||
}
|
||||
|
||||
@@ -936,8 +1007,12 @@ uint8 Group::GroupCount() {
|
||||
uint8 MemberCount = 0;
|
||||
|
||||
for(uint8 i = 0; i < MAX_GROUP_MEMBERS; ++i)
|
||||
{
|
||||
if(membername[i][0])
|
||||
{
|
||||
++MemberCount;
|
||||
}
|
||||
}
|
||||
|
||||
return MemberCount;
|
||||
}
|
||||
@@ -1071,7 +1146,14 @@ void Client::LeaveGroup() {
|
||||
|
||||
if(g)
|
||||
{
|
||||
if(g->GroupCount() < 3)
|
||||
int32 MemberCount = g->GroupCount();
|
||||
// Account for both client and merc leaving the group
|
||||
if (GetMerc() && GetMerc()->HasGroup() && GetMerc()->GetGroup() == g)
|
||||
{
|
||||
MemberCount -= 1;
|
||||
}
|
||||
|
||||
if(MemberCount < 3)
|
||||
{
|
||||
g->DisbandGroup();
|
||||
}
|
||||
@@ -1080,17 +1162,17 @@ void Client::LeaveGroup() {
|
||||
g->DelMember(this);
|
||||
if (GetMerc() && GetMerc()->HasGroup() && GetMerc()->GetGroup() == g)
|
||||
{
|
||||
g->DelMember(GetMerc());
|
||||
GetMerc()->RemoveMercFromGroup(GetMerc(), GetMerc()->GetGroup());
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//force things a little
|
||||
database.SetGroupID(GetName(), 0, CharacterID());
|
||||
database.SetGroupID(GetName(), 0, CharacterID(), false);
|
||||
if (GetMerc())
|
||||
{
|
||||
database.SetGroupID(GetMerc()->GetName(), 0, CharacterID());
|
||||
database.SetGroupID(GetMerc()->GetName(), 0, CharacterID(), true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user