void CParty::RequestSetMemberLevel(DWORD pid, int level) { TPacketPartySetMemberLevel p; p.dwLeaderPID = GetLeaderPID(); p.dwPID = pid; p.bLevel = level; db_clientdesc->DBPacket(HEADER_GD_PARTY_SET_MEMBER_LEVEL, 0, &p, sizeof(TPacketPartySetMemberLevel)); }
void CParty::Link(LPCHARACTER pkChr) { TMemberMap::iterator it; if (pkChr->IsPC()) it = m_memberMap.find(pkChr->GetPlayerID()); else it = m_memberMap.find(pkChr->GetVID()); if (it == m_memberMap.end()) { sys_err("%s is not member of this party", pkChr->GetName()); return; } // 플레이어 파티일 경우 업데이트 이벤트 생성 if (m_bPCParty && !m_eventUpdate) { party_update_event_info* info = AllocEventInfo<party_update_event_info>(); info->pid = m_dwLeaderPID; m_eventUpdate = event_create(party_update_event, info, PASSES_PER_SEC(3)); } if (it->second.bRole == PARTY_ROLE_LEADER) m_pkChrLeader = pkChr; sys_log(2, "PARTY[%d] %s linked to party", GetLeaderPID(), pkChr->GetName()); it->second.pCharacter = pkChr; pkChr->SetParty(this); if (pkChr->IsPC()) { if (it->second.strName.empty()) { it->second.strName = pkChr->GetName(); } SendPartyJoinOneToAll(pkChr->GetPlayerID()); SendPartyJoinAllToOne(pkChr); SendPartyLinkOneToAll(pkChr); SendPartyLinkAllToOne(pkChr); SendPartyInfoAllToOne(pkChr); SendPartyInfoOneToAll(pkChr); SendParameter(pkChr); //sys_log(0, "PARTY-DUNGEON connect %p %p", this, GetDungeon()); if (GetDungeon() && GetDungeon()->GetMapIndex() == pkChr->GetMapIndex()) { pkChr->SetDungeon(GetDungeon()); } RequestSetMemberLevel(pkChr->GetPlayerID(), pkChr->GetLevel()); } }
void CParty::Quit(DWORD dwPID) { // Always PC P2PQuit(dwPID); if (m_bPCParty && dwPID != GetLeaderPID()) { //TPacketGGParty p; //p.header = HEADER_GG_PARTY; //p.subheader = PARTY_SUBHEADER_GG_QUIT; //p.pid = dwPID; //p.leaderpid = GetLeaderPID(); //P2P_MANAGER::instance().Send(&p, sizeof(p)); TPacketPartyRemove p; p.dwPID = dwPID; p.dwLeaderPID = GetLeaderPID(); db_clientdesc->DBPacket(HEADER_GD_PARTY_REMOVE, 0, &p, sizeof(p)); } }
void CParty::Join(DWORD dwPID) { P2PJoin(dwPID); if (m_bPCParty) { TPacketPartyAdd p; p.dwLeaderPID = GetLeaderPID(); p.dwPID = dwPID; p.bState = PARTY_ROLE_NORMAL; // #0000790: [M2EU] CZ 크래쉬 증가: 초기화 중요! db_clientdesc->DBPacket(HEADER_GD_PARTY_ADD, 0, &p, sizeof(p)); } }
void CParty::P2PSetMemberLevel(DWORD pid, int level) { if (!m_bPCParty) return; TMemberMap::iterator it; sys_log(0, "PARTY P2PSetMemberLevel leader %d pid %d level %d", GetLeaderPID(), pid, level); it = m_memberMap.find(pid); if (it != m_memberMap.end()) { it->second.bLevel = level; } }
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ґВ ѕшґЩ. }
LPCHARACTER CParty::GetLeaderCharacter() { return m_memberMap[GetLeaderPID()].pCharacter; }
void CParty::P2PJoin(DWORD dwPID) { TMemberMap::iterator it = m_memberMap.find(dwPID); if (it == m_memberMap.end()) { TMember Member; Member.pCharacter = NULL; Member.bNear = false; if (m_memberMap.empty()) { Member.bRole = PARTY_ROLE_LEADER; m_dwLeaderPID = dwPID; } else Member.bRole = PARTY_ROLE_NORMAL; if (m_bPCParty) { LPCHARACTER ch = CHARACTER_MANAGER::instance().FindByPID(dwPID); if (ch) { sys_log(0, "PARTY: Join %s pid %u leader %u", ch->GetName(), dwPID, m_dwLeaderPID); Member.strName = ch->GetName(); if (Member.bRole == PARTY_ROLE_LEADER) m_iLeadership = ch->GetLeadershipSkillLevel(); } else { CCI * pcci = P2P_MANAGER::instance().FindByPID(dwPID); if (!pcci); else if (pcci->bChannel == g_bChannel) Member.strName = pcci->szName; else sys_err("member is not in same channel PID: %u channel %d, this channel %d", dwPID, pcci->bChannel, g_bChannel); } } sys_log(2, "PARTY[%d] MemberCountChange %d -> %d", GetLeaderPID(), GetMemberCount(), GetMemberCount()+1); m_memberMap.insert(TMemberMap::value_type(dwPID, Member)); if (m_memberMap.size() == 1) m_itNextOwner = m_memberMap.begin(); if (m_bPCParty) { CPartyManager::instance().SetPartyMember(dwPID, this); SendPartyJoinOneToAll(dwPID); LPCHARACTER ch = CHARACTER_MANAGER::instance().FindByPID(dwPID); if (ch) SendParameter(ch); } } if (m_pkDungeon) { m_pkDungeon->QuitParty(this); } }