bool Group::Process() { if(disbandcheck && !GroupCount()) return false; else if(disbandcheck && GroupCount()) disbandcheck = false; return true; }
bool Group::DelMemberOOZ(const char *Name, bool checkleader) { if(!Name) return false; bool removed = false; // If a member out of zone has disbanded, clear out their name. for(unsigned int i = 0; i < MAX_GROUP_MEMBERS; i++) { if(!strcasecmp(Name, membername[i])) { // This shouldn't be called if the member is in this zone. if(!members[i]) { memset(membername[i], 0, 64); MemberRoles[i] = 0; removed = true; Log.Out(Logs::Detail, Logs::Group, "DelMemberOOZ: Removed Member: %s", Name); break; } } } if(GroupCount() < 2) { DisbandGroup(); return true; } if(checkleader) { Log.Out(Logs::Detail, Logs::Group, "DelMemberOOZ: Checking leader..."); if (strcmp(GetOldLeaderName(),Name) == 0 && GroupCount() >= 2) { for(uint32 nl = 0; nl < MAX_GROUP_MEMBERS; nl++) { if(members[nl]) { if (members[nl]->IsClient()) { ChangeLeader(members[nl]); break; } } } } } return removed; }
void ON_3dmObjectAttributes::Dump( ON_TextLog& dump ) const { const wchar_t* wsName = m_name; if ( !wsName ) wsName = L""; dump.Print("object name = \"%ls\"\n",wsName); dump.Print("object uuid = "); dump.Print(m_uuid); dump.Print("\n"); const char* sMode = "unknown"; switch( Mode() ) { case ON::normal_object: sMode = "normal"; break; case ON::hidden_object: sMode = "hidden"; break; case ON::locked_object: sMode = "locked"; break; default: sMode = "unknown"; break; } dump.Print("object mode = %s\n",sMode); // sSMode is const char* dump.Print("object layer index = %d\n",m_layer_index); dump.Print("object material index = %d\n",m_material_index); const char* sMaterialSource = "unknown"; switch(MaterialSource()) { case ON::material_from_layer: sMaterialSource = "layer material"; break; case ON::material_from_object: sMaterialSource = "object material"; break; case ON::material_from_parent: sMaterialSource = "parent material"; break; } dump.Print("material source = %s\n",sMaterialSource); // sMaterialSource is const char* const int group_count = GroupCount(); if ( group_count > 0 ) { const int* group = GroupList(); dump.Print("groups: "); int i; for ( i = 0; i < group_count; i++ ) { if ( i ) dump.Print(",%d",group[i]); else dump.Print("%d",group[i]); } dump.Print("\n"); } }
ON_BOOL32 ON_3dmObjectAttributes::IsInGroups( int group_count, const int* group_list ) const { // returns true if object is in any of the groups in the list ON_BOOL32 rc = false; if ( group_count > 0 && group_list ) { const int obj_group_count = GroupCount(); const int* obj_group_list = GroupList(); // in practice these arrays will be very short and this search will be fast int i, j; for ( i = 0; i < obj_group_count; i++ ) for ( j = 0; j < group_count; j++ ) { if ( obj_group_list[i] == group_list[j] ) return true; } } return rc; }
bool Group::DelMember(Mob* oldmember,bool ignoresender) { if (oldmember == nullptr){ return false; } for (uint32 i = 0; i < MAX_GROUP_MEMBERS; i++) { if (members[i] == oldmember) { members[i] = nullptr; membername[i][0] = '\0'; memset(membername[i],0,64); MemberRoles[i] = 0; break; } } //handle leader quitting group gracefully if (oldmember == GetLeader() && GroupCount() >= 2) { for(uint32 nl = 0; nl < MAX_GROUP_MEMBERS; nl++) { if(members[nl]) { ChangeLeader(members[nl]); break; } } } ServerPacket* pack = new ServerPacket(ServerOP_GroupLeave, sizeof(ServerGroupLeave_Struct)); ServerGroupLeave_Struct* gl = (ServerGroupLeave_Struct*)pack->pBuffer; gl->gid = GetID(); gl->zoneid = zone->GetZoneID(); gl->instance_id = zone->GetInstanceID(); strcpy(gl->member_name, oldmember->GetName()); worldserver.SendPacket(pack); safe_delete(pack); EQApplicationPacket* outapp = new EQApplicationPacket(OP_GroupUpdate,sizeof(GroupLeader_Struct)); GroupLeader_Struct* gu = (GroupLeader_Struct*) outapp->pBuffer; gu->action = groupActLeave; strcpy(gu->membername, oldmember->GetCleanName()); strcpy(gu->yourname, oldmember->GetCleanName()); for (uint32 i = 0; i < MAX_GROUP_MEMBERS; i++) { if (members[i] == nullptr) { //if (DEBUG>=5) LogFile->write(EQEMuLog::Debug, "Group::DelMember() null member at slot %i", i); continue; } if (members[i] != oldmember) { strcpy(gu->yourname, members[i]->GetCleanName()); if(members[i]->IsClient()) members[i]->CastToClient()->QueuePacket(outapp); } } if (!ignoresender) { strcpy(gu->yourname,oldmember->GetCleanName()); strcpy(gu->membername,oldmember->GetCleanName()); gu->action = groupActLeave; if(oldmember->IsClient()) oldmember->CastToClient()->QueuePacket(outapp); } if(oldmember->IsClient()) database.SetGroupID(oldmember->GetCleanName(), 0, oldmember->CastToClient()->CharacterID()); oldmember->SetGrouped(false); disbandcheck = true; safe_delete(outapp); return true; }
bool Group::AddMember(Mob* newmember, const char *NewMemberName, uint32 CharacterID) { bool InZone = true; // 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; 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(); } uint32 i = 0; // See if they are already in the group // 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) { if (membername[i][0] == '\0') { if(InZone) members[i] = newmember; break; } } if (i == MAX_GROUP_MEMBERS) return false; strcpy(membername[i], NewMemberName); MemberRoles[i] = 0; int x=1; //build the template join packet EQApplicationPacket* outapp = new EQApplicationPacket(OP_GroupUpdate,sizeof(GroupJoin_Struct)); GroupJoin_Struct* gj = (GroupJoin_Struct*) outapp->pBuffer; strcpy(gj->membername, NewMemberName); gj->action = groupActJoin; for (i = 0;i < MAX_GROUP_MEMBERS; i++) { if (members[i] != nullptr && members[i] != newmember) { //fill in group join & send it strcpy(gj->yourname, members[i]->GetCleanName()); if(members[i]->IsClient()) { members[i]->CastToClient()->QueuePacket(outapp); //put new member into existing person's list strcpy(members[i]->CastToClient()->GetPP().groupMembers[this->GroupCount()-1], NewMemberName); } //put this existing person into the new member's list if(InZone && newmember->IsClient()) { if(IsLeader(members[i])) strcpy(newmember->CastToClient()->GetPP().groupMembers[0], members[i]->GetCleanName()); else { strcpy(newmember->CastToClient()->GetPP().groupMembers[x], members[i]->GetCleanName()); x++; } } } } if(InZone) { //put new member in his own list. newmember->SetGrouped(true); if(newmember->IsClient()) { strcpy(newmember->CastToClient()->GetPP().groupMembers[x], NewMemberName); newmember->CastToClient()->Save(); database.SetGroupID(NewMemberName, GetID(), newmember->CastToClient()->CharacterID()); } } else database.SetGroupID(NewMemberName, GetID(), CharacterID); safe_delete(outapp); return true; }
bool Group::DelMember(Mob* oldmember,bool ignoresender) { if (oldmember == nullptr) { return false; } for (uint32 i = 0; i < MAX_GROUP_MEMBERS; i++) { if (members[i] == oldmember) { members[i] = nullptr; membername[i][0] = '\0'; memset(membername[i],0,64); MemberRoles[i] = 0; Log.Out(Logs::Detail, Logs::Group, "DelMember: Removed Member: %s", oldmember->GetCleanName()); break; } } if(GroupCount() < 2) { DisbandGroup(); return true; } // If the leader has quit and we have 2 or more players left in group, we want to first check the zone the old leader was in for a new leader. // If a suitable replacement cannot be found, we need to go out of zone. If checkleader remains true after this method completes, another // loop will be run in DelMemberOOZ. bool checkleader = true; if (strcmp(GetOldLeaderName(),oldmember->GetCleanName()) == 0 && GroupCount() >= 2) { for(uint32 nl = 0; nl < MAX_GROUP_MEMBERS; nl++) { if(members[nl]) { if (members[nl]->IsClient()) { ChangeLeader(members[nl]); checkleader = false; break; } } } } ServerPacket* pack = new ServerPacket(ServerOP_GroupLeave, sizeof(ServerGroupLeave_Struct)); ServerGroupLeave_Struct* gl = (ServerGroupLeave_Struct*)pack->pBuffer; gl->gid = GetID(); gl->zoneid = zone->GetZoneID(); gl->instance_id = zone->GetInstanceID(); strcpy(gl->member_name, oldmember->GetName()); gl->checkleader = checkleader; worldserver.SendPacket(pack); safe_delete(pack); EQApplicationPacket* outapp = new EQApplicationPacket(OP_GroupUpdate, sizeof(GroupJoin_Struct)); GroupJoin_Struct* gu = (GroupJoin_Struct*)outapp->pBuffer; gu->action = groupActLeave; strcpy(gu->membername, oldmember->GetCleanName()); strcpy(gu->yourname, oldmember->GetCleanName()); for (uint32 i = 0; i < MAX_GROUP_MEMBERS; i++) { if (members[i] == nullptr) { //if (DEBUG>=5) Log.Out(Logs::Detail, Logs::Group, "Group::DelMember() null member at slot %i", i); continue; } if (members[i] != oldmember) { strcpy(gu->yourname, members[i]->GetCleanName()); if(members[i]->IsClient()) members[i]->CastToClient()->QueuePacket(outapp); } } if (!ignoresender) { strcpy(gu->yourname,oldmember->GetCleanName()); strcpy(gu->membername,oldmember->GetCleanName()); gu->action = groupActLeave; if(oldmember->IsClient()) oldmember->CastToClient()->QueuePacket(outapp); } if(oldmember->IsClient()) { database.SetGroupID(oldmember->GetCleanName(), 0, oldmember->CastToClient()->CharacterID()); } oldmember->SetGrouped(false); disbandcheck = true; safe_delete(outapp); return true; }