void CPVPManager::Insert(LPCHARACTER pkChr, LPCHARACTER pkVictim) { if (pkChr->IsDead() || pkVictim->IsDead()) return; CPVP kPVP(pkChr->GetPlayerID(), pkVictim->GetPlayerID()); CPVP * pkPVP; if ((pkPVP = Find(kPVP.m_dwCRC))) { // 복수할 수 있으면 바로 싸움! if (pkPVP->Agree(pkChr->GetPlayerID())) { pkVictim->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s님과의 대결 시작!"), pkChr->GetName()); pkChr->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s님과의 대결 시작!"), pkVictim->GetName()); } return; } pkPVP = M2_NEW CPVP(kPVP); pkPVP->SetVID(pkChr->GetPlayerID(), pkChr->GetVID()); pkPVP->SetVID(pkVictim->GetPlayerID(), pkVictim->GetVID()); m_map_pkPVP.insert(map<DWORD, CPVP *>::value_type(pkPVP->m_dwCRC, pkPVP)); m_map_pkPVPSetByID[pkChr->GetPlayerID()].insert(pkPVP); m_map_pkPVPSetByID[pkVictim->GetPlayerID()].insert(pkPVP); pkPVP->Packet(); char msg[CHAT_MAX_LEN + 1]; snprintf(msg, sizeof(msg), LC_TEXT("%s님이 대결신청을 했습니다. 승낙하려면 대결동의를 하세요."), pkChr->GetName()); pkVictim->ChatPacket(CHAT_TYPE_INFO, msg); pkChr->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s에게 대결신청을 했습니다."), pkVictim->GetName()); // NOTIFY_PVP_MESSAGE LPDESC pkVictimDesc = pkVictim->GetDesc(); if (pkVictimDesc) { TPacketGCWhisper pack; int len = MIN(CHAT_MAX_LEN, strlen(msg) + 1); pack.bHeader = HEADER_GC_WHISPER; pack.wSize = sizeof(TPacketGCWhisper) + len; pack.bType = WHISPER_TYPE_SYSTEM; strlcpy(pack.szNameFrom, pkChr->GetName(), sizeof(pack.szNameFrom)); TEMP_BUFFER buf; buf.write(&pack, sizeof(TPacketGCWhisper)); buf.write(msg, len); pkVictimDesc->Packet(buf.read_peek(), buf.size()); } // END_OF_NOTIFY_PVP_MESSAGE }
void CWarMap::SendScorePacket(BYTE bIdx, LPDESC d) { TPacketGCGuild p; p.header = HEADER_GC_GUILD; p.subheader = GUILD_SUBHEADER_GC_WAR_SCORE; p.size = sizeof(p) + sizeof(DWORD) + sizeof(DWORD) + sizeof(long); TEMP_BUFFER buf; buf.write(&p, sizeof(p)); buf.write(&m_TeamData[bIdx].dwID, sizeof(DWORD)); buf.write(&m_TeamData[bIdx ? 0 : 1].dwID, sizeof(DWORD)); buf.write(&m_TeamData[bIdx].iScore, sizeof(long)); if (d) d->Packet(buf.read_peek(), buf.size()); else Packet(buf.read_peek(), buf.size()); }
void CManager::SendLandList(LPDESC d, long lMapIndex) { TLandPacketElement e; TEMP_BUFFER buf; WORD wCount = 0; itertype(m_map_pkLand) it = m_map_pkLand.begin(); while (it != m_map_pkLand.end()) { CLand * pkLand = (it++)->second; const TLand & r = pkLand->GetData(); if (r.lMapIndex != lMapIndex) continue; // LPCHARACTER ch = d->GetCharacter(); if (ch) { CGuild *guild = CGuildManager::instance().FindGuild(r.dwGuildID); ch->SendGuildName(guild); } // e.dwID = r.dwID; e.x = r.x; e.y = r.y; e.width = r.width; e.height = r.height; e.dwGuildID = r.dwGuildID; buf.write(&e, sizeof(TLandPacketElement)); ++wCount; } sys_log(0, "SendLandList map %d count %u elem_size: %d", lMapIndex, wCount, buf.size()); if (wCount != 0) { TPacketGCLandList p; p.header = HEADER_GC_LAND_LIST; p.size = sizeof(TPacketGCLandList) + buf.size(); d->BufferedPacket(&p, sizeof(TPacketGCLandList)); d->Packet(buf.read_peek(), buf.size()); } }
void PC::SendQuestInfoPakcet() { assert(m_iSendToClient); assert(m_RunningQuestState); packet_quest_info qi; qi.header = HEADER_GC_QUEST_INFO; qi.size = sizeof(struct packet_quest_info); qi.index = m_RunningQuestState->iIndex; qi.flag = m_iSendToClient; TEMP_BUFFER buf; buf.write(&qi, sizeof(qi)); if (m_iSendToClient & QUEST_SEND_ISBEGIN) { BYTE temp = m_RunningQuestState->bStart?1:0; buf.write(&temp,1); qi.size+=1; sys_log(1, "QUEST BeginFlag %d", (int)temp); } if (m_iSendToClient & QUEST_SEND_TITLE) { m_RunningQuestState->_title.reserve(30+1); buf.write(m_RunningQuestState->_title.c_str(), 30+1); qi.size+=30+1; sys_log(1, "QUEST Title %s", m_RunningQuestState->_title.c_str()); } if (m_iSendToClient & QUEST_SEND_CLOCK_NAME) { m_RunningQuestState->_clock_name.reserve(16+1); buf.write(m_RunningQuestState->_clock_name.c_str(), 16+1); qi.size+=16+1; sys_log(1, "QUEST Clock Name %s", m_RunningQuestState->_clock_name.c_str()); } if (m_iSendToClient & QUEST_SEND_CLOCK_VALUE) { buf.write(&m_RunningQuestState->_clock_value, sizeof(int)); qi.size+=4; sys_log(1, "QUEST Clock Value %d", m_RunningQuestState->_clock_value); } if (m_iSendToClient & QUEST_SEND_COUNTER_NAME) { m_RunningQuestState->_counter_name.reserve(16+1); buf.write(m_RunningQuestState->_counter_name.c_str(), 16+1); qi.size+=16+1; sys_log(1, "QUEST Counter Name %s", m_RunningQuestState->_counter_name.c_str()); } if (m_iSendToClient & QUEST_SEND_COUNTER_VALUE) { buf.write(&m_RunningQuestState->_counter_value, sizeof(int)); qi.size+=4; sys_log(1, "QUEST Counter Value %d", m_RunningQuestState->_counter_value); } if (m_iSendToClient & QUEST_SEND_ICON_FILE) { m_RunningQuestState->_icon_file.reserve(24+1); buf.write(m_RunningQuestState->_icon_file.c_str(), 24+1); qi.size+=24+1; sys_log(1, "QUEST Icon File %s", m_RunningQuestState->_icon_file.c_str()); } CQuestManager::instance().GetCurrentCharacterPtr()->GetDesc()->Packet(buf.read_peek(),buf.size()); m_iSendToClient = 0; }
void CLIENT_DESC::SetPhase(int iPhase) { switch (iPhase) { case PHASE_CLIENT_CONNECTING: sys_log(1, "PHASE_CLIENT_DESC::CONNECTING"); m_pInputProcessor = NULL; break; case PHASE_DBCLIENT: { sys_log(1, "PHASE_DBCLIENT"); if (!g_bAuthServer) { static bool bSentBoot = false; if (!bSentBoot) { bSentBoot = true; TPacketGDBoot p; p.dwItemIDRange[0] = 0; p.dwItemIDRange[1] = 0; memcpy(p.szIP, g_szPublicIP, 16); DBPacket(HEADER_GD_BOOT, 0, &p, sizeof(p)); } } TEMP_BUFFER buf; TPacketGDSetup p; memset(&p, 0, sizeof(p)); strlcpy(p.szPublicIP, g_szPublicIP, sizeof(p.szPublicIP)); if (!g_bAuthServer) { p.bChannel = g_bChannel; p.wListenPort = mother_port; p.wP2PPort = p2p_port; p.bAuthServer = false; map_allow_copy(p.alMaps, 32); const DESC_MANAGER::DESC_SET & c_set = DESC_MANAGER::instance().GetClientSet(); DESC_MANAGER::DESC_SET::const_iterator it; for (it = c_set.begin(); it != c_set.end(); ++it) { LPDESC d = *it; if (d->GetAccountTable().id != 0) ++p.dwLoginCount; } buf.write(&p, sizeof(p)); if (p.dwLoginCount) { TPacketLoginOnSetup pck; for (it = c_set.begin(); it != c_set.end(); ++it) { LPDESC d = *it; TAccountTable & r = d->GetAccountTable(); if (r.id != 0) { pck.dwID = r.id; strlcpy(pck.szLogin, r.login, sizeof(pck.szLogin)); strlcpy(pck.szSocialID, r.social_id, sizeof(pck.szSocialID)); strlcpy(pck.szHost, d->GetHostName(), sizeof(pck.szHost)); pck.dwLoginKey = d->GetLoginKey(); #ifndef _IMPROVED_PACKET_ENCRYPTION_ thecore_memcpy(pck.adwClientKey, d->GetDecryptionKey(), 16); #endif buf.write(&pck, sizeof(TPacketLoginOnSetup)); } } } sys_log(0, "DB_SETUP current user %d size %d", p.dwLoginCount, buf.size()); // 파티를 처리할 수 있게 됨. CPartyManager::instance().EnablePCParty(); //CPartyManager::instance().SendPartyToDB(); } else { p.bAuthServer = true; buf.write(&p, sizeof(p)); } DBPacket(HEADER_GD_SETUP, 0, buf.read_peek(), buf.size()); m_pInputProcessor = &m_inputDB; } break; case PHASE_P2P: sys_log(1, "PHASE_P2P"); if (m_lpInputBuffer) buffer_reset(m_lpInputBuffer); if (m_lpOutputBuffer) buffer_reset(m_lpOutputBuffer); m_pInputProcessor = &m_inputP2P; break; case PHASE_CLOSE: m_pInputProcessor = NULL; break; case PHASE_TEEN: m_inputTeen.SetStep(0); m_pInputProcessor = &m_inputTeen; break; } m_iPhase = iPhase; }