bool operator () (LPDESC d) { if (d->GetCharacter() && !strcmp(d->GetCharacter()->GetName(), m_name)) return true; return false; }
static void __proc_login_notice(char *login, int on_time, int off_time) { //{ check player's name LPDESC desc = DESC_MANAGER::instance().FindByLoginName(login); if (NULL==desc) return; LPCHARACTER ch = desc->GetCharacter(); if (NULL==ch) return; //} check player's name char on_time_string[64]; char off_time_string[64]; __sec_to_timestring(on_time, on_time_string, sizeof(on_time_string)); __sec_to_timestring(off_time, off_time_string, sizeof(off_time_string)); if (0==on_time) { ch->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("당신의 누적 오프라인 시간은 %s입니다."), off_time_string); ch->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("당신의 누적 온라인 시간은 0이 되었습니다. 100% 효과를 얻으실 수 있습니다.")); return; } else { ch->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("당신의 누적 오프라인 시간은 %s이며, 누적 온라인 시간은 %s입니다."), off_time_string, on_time_string); } }
void CManager::UpdateLand(TLand * pTable) { CLand * pkLand = FindLand(pTable->dwID); if (!pkLand) { sys_err("cannot find land by id %u", pTable->dwID); return; } pkLand->PutData(pTable); const DESC_MANAGER::DESC_SET & cont = DESC_MANAGER::instance().GetClientSet(); itertype(cont) it = cont.begin(); TPacketGCLandList p; p.header = HEADER_GC_LAND_LIST; p.size = sizeof(TPacketGCLandList) + sizeof(TLandPacketElement); TLandPacketElement e; e.dwID = pTable->dwID; e.x = pTable->x; e.y = pTable->y; e.width = pTable->width; e.height = pTable->height; e.dwGuildID = pTable->dwGuildID; sys_log(0, "BUILDING: UpdateLand %u pos %dx%d guild %u", e.dwID, e.x, e.y, e.dwGuildID); CGuild *guild = CGuildManager::instance().FindGuild(pTable->dwGuildID); while (it != cont.end()) { LPDESC d = *(it++); if (d->GetCharacter() && d->GetCharacter()->GetMapIndex() == pTable->lMapIndex) { // we must send the guild name first d->GetCharacter()->SendGuildName(guild); d->BufferedPacket(&p, sizeof(TPacketGCLandList)); d->Packet(&e, sizeof(TLandPacketElement)); } } }
void operator() (LPDESC d) { if (d->GetCharacter()) { ++iTotalCount; ++aiEmpireUserCount[d->GetEmpire()]; } }
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()); } }
static void __proc_teen_notice(char *login, int hour) { LPDESC desc = DESC_MANAGER::instance().FindByLoginName(login); if (NULL==desc) return; LPCHARACTER ch = desc->GetCharacter(); if (NULL==ch) return; switch (hour) { case 0: { SET_OVER_TIME(ch, OT_NONE); return; } break; case 1: case 2: { ch->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("당신의 누적 온라인 시간이 이미 %d시간이 지났습니다."), hour); SET_OVER_TIME(ch, OT_NONE); } break; case 3: { ch->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("당신의 누적 온라인 시간이 이미 %d시간이 되었습니다,"), hour); ch->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("조속히 접속을 종료하신 후 건강을 위해 휴식을 취해주시기바랍니다.")); SET_OVER_TIME(ch, OT_3HOUR); } break; case 4: { ch->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("당신은 이미 게임 피로 상태에 들어섰으며,")); ch->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("게임 내의 수익이 정상치의 50%로 하향됩니다.")); ch->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("당신의 건강을 위해 조속히 접속을 종료하시고")); ch->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("휴식 및 학업에 열중해주십시오.")); SET_OVER_TIME(ch, OT_3HOUR); } break; default: { ch->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("당신은 이미 온전하지 못한 게임 시간에 들어섰습니다.")); ch->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("건강을 위해 조속히 접속을 종료하신 후 휴식을 취해주십시오,")); ch->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("그렇지 않으면 건강 상에 피해를 입을 수 있으며 게임 내의 수치는 0이 됩니다.")); ch->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("누적 오프라인 시간이 5시간이 되면 정상으로 돌아옵니다.")); SET_OVER_TIME(ch, OT_5HOUR); } break; } }
bool CInputProcessor::Process(LPDESC lpDesc, const void * c_pvOrig, int iBytes, int & r_iBytesProceed) { const char * c_pData = (const char *) c_pvOrig; BYTE bLastHeader = 0; int iLastPacketLen = 0; int iPacketLen; if (!m_pPacketInfo) { sys_err("No packet info has been binded to"); return true; } for (m_iBufferLeft = iBytes; m_iBufferLeft > 0;) { BYTE bHeader = (BYTE) *(c_pData); const char * c_pszName; if (bHeader == 0) // 암호화 처리가 있으므로 0번 헤더는 스킵한다. iPacketLen = 1; else if (!m_pPacketInfo->Get(bHeader, &iPacketLen, &c_pszName)) { sys_err("UNKNOWN HEADER: %d, LAST HEADER: %d(%d), REMAIN BYTES: %d, fd: %d", bHeader, bLastHeader, iLastPacketLen, m_iBufferLeft, lpDesc->GetSocket()); //printdata((BYTE *) c_pvOrig, m_iBufferLeft); lpDesc->SetPhase(PHASE_CLOSE); return true; } if (m_iBufferLeft < iPacketLen) return true; if (bHeader) { if (test_server && bHeader != HEADER_CG_MOVE) sys_log(0, "Packet Analyze [Header %d][bufferLeft %d] ", bHeader, m_iBufferLeft); m_pPacketInfo->Start(); int iExtraPacketSize = Analyze(lpDesc, bHeader, c_pData); if (iExtraPacketSize < 0) return true; iPacketLen += iExtraPacketSize; lpDesc->Log("%s %d", c_pszName, iPacketLen); m_pPacketInfo->End(); } // TRAFFIC_PROFILER if (g_bTrafficProfileOn) TrafficProfiler::instance().Report(TrafficProfiler::IODIR_INPUT, bHeader, iPacketLen); // END_OF_TRAFFIC_PROFILER if (bHeader == HEADER_CG_PONG) sys_log(0, "PONG! %u %u", m_pPacketInfo->IsSequence(bHeader), *(BYTE *) (c_pData + iPacketLen - sizeof(BYTE))); if (m_pPacketInfo->IsSequence(bHeader)) { BYTE bSeq = lpDesc->GetSequence(); BYTE bSeqReceived = *(BYTE *) (c_pData + iPacketLen - sizeof(BYTE)); if (bSeq != bSeqReceived) { sys_err("SEQUENCE %x mismatch 0x%x != 0x%x header %u", get_pointer(lpDesc), bSeq, bSeqReceived, bHeader); LPCHARACTER ch = lpDesc->GetCharacter(); char buf[1024]; int offset, len; offset = snprintf(buf, sizeof(buf), "SEQUENCE_LOG [%s]-------------\n", ch ? ch->GetName() : "UNKNOWN"); if (offset < 0 || offset >= (int) sizeof(buf)) offset = sizeof(buf) - 1; for (size_t i = 0; i < lpDesc->m_seq_vector.size(); ++i) { len = snprintf(buf + offset, sizeof(buf) - offset, "\t[%03d : 0x%x]\n", lpDesc->m_seq_vector[i].hdr, lpDesc->m_seq_vector[i].seq); if (len < 0 || len >= (int) sizeof(buf) - offset) offset += (sizeof(buf) - offset) - 1; else offset += len; } snprintf(buf + offset, sizeof(buf) - offset, "\t[%03d : 0x%x]\n", bHeader, bSeq); sys_err("%s", buf); lpDesc->SetPhase(PHASE_CLOSE); return true; } else { lpDesc->push_seq(bHeader, bSeq); lpDesc->SetNextSequence(); //sys_err("SEQUENCE %x match %u next %u header %u", lpDesc, bSeq, lpDesc->GetSequence(), bHeader); } } c_pData += iPacketLen; m_iBufferLeft -= iPacketLen; r_iBytesProceed += iPacketLen; iLastPacketLen = iPacketLen; bLastHeader = bHeader; if (GetType() != lpDesc->GetInputProcessor()->GetType()) return false; } return true; }
void CPVPManager::SendList(LPDESC d) { map<DWORD, CPVP *>::iterator it = m_map_pkPVP.begin(); DWORD dwVID = d->GetCharacter()->GetVID(); TPacketGCPVP pack; pack.bHeader = HEADER_GC_PVP; while (it != m_map_pkPVP.end()) { CPVP * pkPVP = (it++)->second; if (!pkPVP->m_players[0].dwVID || !pkPVP->m_players[1].dwVID) continue; // VID가 둘다 있을 경우에만 보낸다. if (pkPVP->IsFight()) { pack.bMode = PVP_MODE_FIGHT; pack.dwVIDSrc = pkPVP->m_players[0].dwVID; pack.dwVIDDst = pkPVP->m_players[1].dwVID; } else { pack.bMode = pkPVP->m_bRevenge ? PVP_MODE_REVENGE : PVP_MODE_AGREE; if (pkPVP->m_players[0].bAgree) { pack.dwVIDSrc = pkPVP->m_players[0].dwVID; pack.dwVIDDst = pkPVP->m_players[1].dwVID; } else { pack.dwVIDSrc = pkPVP->m_players[1].dwVID; pack.dwVIDDst = pkPVP->m_players[0].dwVID; } } d->Packet(&pack, sizeof(pack)); sys_log(1, "PVPManager::SendList %d %d", pack.dwVIDSrc, pack.dwVIDDst); if (pkPVP->m_players[0].dwVID == dwVID) { LPCHARACTER ch = CHARACTER_MANAGER::instance().Find(pkPVP->m_players[1].dwVID); if (ch && ch->GetDesc()) { LPDESC d = ch->GetDesc(); d->Packet(&pack, sizeof(pack)); } } else if (pkPVP->m_players[1].dwVID == dwVID) { LPCHARACTER ch = CHARACTER_MANAGER::instance().Find(pkPVP->m_players[0].dwVID); if (ch && ch->GetDesc()) { LPDESC d = ch->GetDesc(); d->Packet(&pack, sizeof(pack)); } } } }