LPCHARACTER CParty::GetNextOwnership(LPCHARACTER ch, long x, long y) { if (m_itNextOwner == m_memberMap.end()) return ch; int size = m_memberMap.size(); while (size-- > 0) { LPCHARACTER pkMember = m_itNextOwner->second.pCharacter; if (pkMember && DISTANCE_APPROX(pkMember->GetX() - x, pkMember->GetY() - y) < 3000) { IncreaseOwnership(); return pkMember; } IncreaseOwnership(); } return ch; }
void CParty::P2PQuit(DWORD dwPID) { TMemberMap::iterator it = m_memberMap.find(dwPID); if (it == m_memberMap.end()) return; if (m_bPCParty) SendPartyRemoveOneToAll(dwPID); if (it == m_itNextOwner) IncreaseOwnership(); if (m_bPCParty) RemoveBonusForOne(dwPID); LPCHARACTER ch = it->second.pCharacter; BYTE bRole = it->second.bRole; m_memberMap.erase(it); sys_log(2, "PARTY[%d] MemberCountChange %d -> %d", GetLeaderPID(), GetMemberCount(), GetMemberCount() - 1); if (bRole < PARTY_ROLE_MAX_NUM) { --m_anRoleCount[bRole]; } else { sys_err("ROLE_COUNT_QUIT_ERROR: INDEX(%d) > MAX(%d)", bRole, PARTY_ROLE_MAX_NUM); } if (ch) { ch->SetParty(NULL); ComputeRolePoint(ch, bRole, false); } if (m_bPCParty) CPartyManager::instance().SetPartyMember(dwPID, NULL); // 리더가 나가면 파티는 해산되어야 한다. if (bRole == PARTY_ROLE_LEADER) CPartyManager::instance().DeleteParty(this); // 이 아래는 코드를 추가하지 말 것!!! 위 DeleteParty 하면 this는 없다. }
void CParty::P2PQuit(DWORD dwPID) { TMemberMap::iterator it = m_memberMap.find(dwPID); if (it == m_memberMap.end()) return; if (m_bPCParty) SendPartyRemoveOneToAll(dwPID); if (it == m_itNextOwner) IncreaseOwnership(); if (m_bPCParty) RemoveBonusForOne(dwPID); LPCHARACTER ch = it->second.pCharacter; BYTE bRole = it->second.bRole; m_memberMap.erase(it); sys_log(2, "PARTY[%d] MemberCountChange %d -> %d", GetLeaderPID(), GetMemberCount(), GetMemberCount() - 1); if (bRole < PARTY_ROLE_MAX_NUM) { --m_anRoleCount[bRole]; } else { sys_err("ROLE_COUNT_QUIT_ERROR: INDEX(%d) > MAX(%d)", bRole, PARTY_ROLE_MAX_NUM); } if (ch) { ch->SetParty(NULL); ComputeRolePoint(ch, bRole, false); } if (m_bPCParty) CPartyManager::instance().SetPartyMember(dwPID, NULL); // ё®ґх°Ў іЄ°Ўёй ЖДЖјґВ ЗШ»кµЗѕоѕЯ ЗСґЩ. if (bRole == PARTY_ROLE_LEADER) CPartyManager::instance().DeleteParty(this); // АМ ѕЖ·ЎґВ ДЪµеё¦ ГЯ°ЎЗПБц ё» °Н!!! А§ DeleteParty ЗПёй thisґВ ѕшґЩ. }