void MMatchServer::OnAdminRequestBlockPlayer(const MUID& uidAdmin, const char* szPlayer, const int nPenaltyHour) { MMatchObject* pObj = GetObject(uidAdmin); if (pObj == NULL) return; if (!IsAdminGrade(pObj)) return; if ((strlen(szPlayer)) < 2) return; int nRet = MOK; MMatchObject* pTargetObj = GetPlayerByName(szPlayer); if (pTargetObj != NULL) { pTargetObj->GetAccountPenaltyInfo()->SetPenaltyInfo(MPC_CONNECT_BLOCK, nPenaltyHour); const MPenaltyInfo* pPenaltyInfo = pTargetObj->GetAccountPenaltyInfo()->GetPenaltyInfo(MPC_CONNECT_BLOCK); if( m_MatchDBMgr.InsertAccountPenaltyInfo(pTargetObj->GetAccountInfo()->m_nAID , pPenaltyInfo->nPenaltyCode, nPenaltyHour, pObj->GetAccountName()) == false ) { pTargetObj->GetAccountPenaltyInfo()->ClearPenaltyInfo(MPC_CONNECT_BLOCK); nRet = MERR_ADNIN_CANNOT_PENALTY_ON_DB; } } else { nRet = MERR_ADMIN_NO_TARGET; } MCommand* pNew = CreateCommand(MC_ADMIN_RESPONSE_BLOCK_PLAYER, MUID(0,0)); pNew->AddParameter(new MCmdParamInt(nRet)); if( nRet == MOK ) { Disconnect(pTargetObj->GetUID()); } RouteToListener(pObj, pNew); }
void MMatchServer::OnAdminRequestKickPlayer(const MUID& uidAdmin, const char* szPlayer) { MMatchObject* pObj = GetObject(uidAdmin); if (pObj == NULL) return; if (!IsAdminGrade(pObj)) return; if ((strlen(szPlayer)) < 2) return; int nRet = MOK; MMatchObject* pTargetObj = GetPlayerByName(szPlayer); if (pTargetObj != NULL) { #ifdef LOCALE_KOREA pTargetObj->DisconnectHacker( MMHT_COMMAND_BLOCK_BY_ADMIN ); #else // Notify Message 필요 -> 관리자 전용 - 해결(특별한 메세지 필요 없음) Disconnect(pTargetObj->GetUID()); #endif } else { nRet = MERR_ADMIN_NO_TARGET; } MCommand* pNew = CreateCommand(MC_ADMIN_RESPONSE_KICK_PLAYER, MUID(0,0)); pNew->AddParameter(new MCmdParamInt(nRet)); RouteToListener(pObj, pNew); }
void MMatchServer::OnAdminRequestUpdateAccountUGrade(const MUID& uidAdmin, const char* szPlayer) { MMatchObject* pObj = GetObject(uidAdmin); if (pObj == NULL) return; // 관리자 권한을 가진 사람이 아니면 연결을 끊는다. if (!IsAdminGrade(pObj)) { // DisconnectObject(uidAdmin); return; } int nRet = MOK; if ((strlen(szPlayer)) < 2) return; MMatchObject* pTargetObj = GetPlayerByName(szPlayer); if (pTargetObj == NULL) return; /* MCommand* pNew = CreateCommand(MC_ADMIN_REQUEST_UPDATE_ACCOUNT_UGRADE, MUID(0,0)); pNew->AddParameter(new MCmdParamUInt(nRet)); RouteToListener(pObj, pNew); */ }
void MMatchServer::OnAsyncExpelClanMember(MAsyncJob* pJobResult) { MAsyncDBJob_ExpelClanMember* pJob = (MAsyncDBJob_ExpelClanMember*)pJobResult; MMatchObject* pAdminObject = GetObject(pJob->GetAdminUID()); if (pJobResult->GetResult() != MASYNC_RESULT_SUCCEED) { if (IsEnabledObject(pAdminObject)) { RouteResponseToListener(pAdminObject, MC_MATCH_CLAN_ADMIN_RESPONSE_EXPEL_MEMBER, MERR_CLAN_CANNOT_EXPEL_FOR_NO_MEMBER); } return; } int nDBRet = pJob->GetDBResult(); switch (nDBRet) { case MMatchDBMgr::ER_NO_MEMBER: { if (IsEnabledObject(pAdminObject)) { RouteResponseToListener(pAdminObject, MC_MATCH_CLAN_ADMIN_RESPONSE_EXPEL_MEMBER, MERR_CLAN_CANNOT_EXPEL_FOR_NO_MEMBER); } return; } break; case MMatchDBMgr::ER_WRONG_GRADE: { if (IsEnabledObject(pAdminObject)) { RouteResponseToListener(pAdminObject, MC_MATCH_CLAN_ADMIN_RESPONSE_EXPEL_MEMBER, MERR_CLAN_CANNOT_CHANGE_GRADE); } return; } break; } // 만약 당사자가 접속해있으면 클랜탈퇴되었다고 알려줘야한다. MMatchObject* pMemberObject = GetPlayerByName(pJob->GetTarMember()); if (IsEnabledObject(pMemberObject)) { UpdateCharClanInfo(pMemberObject, 0, "", MCG_NONE); // 임시코드... 잘못된 MMatchObject*가 온다면 체크하여 잡기위함...20090224 by kammir if(pMemberObject->GetCharInfo()->m_ClanInfo.GetClanID() >= 9000000) LOG(LOG_FILE, "[OnAsyncExpelClanMember()] %s's ClanID:%d.", pMemberObject->GetAccountName(), pMemberObject->GetCharInfo()->m_ClanInfo.GetClanID()); } if (IsEnabledObject(pAdminObject)) { RouteResponseToListener(pAdminObject, MC_MATCH_CLAN_ADMIN_RESPONSE_EXPEL_MEMBER, MOK); } }
void CPlayerMgr::KickOffLine( std::string strName ) { CPlayer *pPlayer = GetPlayerByName(strName); if(pPlayer) { UINT32 uConnID = pPlayer->GetConnID(); CProtocolLogic * pProtocol = CProtocolLogic::GetProtocolLogic(); pProtocol->SetDisconnectClientID(uConnID); //CNetProcessor::Instance()->Close(uConnID); } }
void MMatchServer::OnChatBan(const MUID& uidSender, const char* pName, const char* pReason) { MMatchObject* pObj = GetObject(uidSender); if (pObj && IsAdminGrade(pObj)) { MMatchObject* pTarget = GetPlayerByName(pName); if (pTarget) { m_MatchDBMgr.EventJjangUpdate(pTarget->GetAccountInfo()->m_nAID, false, MMUG_CHAT_LIMITED); Disconnect(pTarget->GetUID()); } LogCommand("cban", pObj->GetCharInfo()->m_szName, pReason); } }
void MMatchServer::OnStop(const MUID& uidSender, const char* pName) { MMatchObject* pObj = GetObject(uidSender); if (pObj && IsAdminGrade(pObj)) { MMatchObject* pTarget = GetPlayerByName(pName); if (pTarget) { MCommand* pCmd = CreateCommand(MC_ADMIN_STOP, MUID(0,0)); pCmd->AddParameter(new MCmdParamStr(pName)); RouteToListener(pTarget, pCmd); } LogCommand("stop", pObj->GetCharInfo()->m_szName, ""); } }
void MMatchServer::OnHwBan(const MUID& uidSender, const char* pName, const char* pReason) { MMatchObject* pObj = GetObject(uidSender); if (pObj && IsAdminGrade(pObj)) { char message[512]; char razon[500]; if (strstr(pName, "%") || strstr(pReason, "%")) return; if(strlen(pReason) > 500) strcpy_s(razon, 500, pReason); else strcpy(razon, pReason); MMatchObject* pTarget = GetPlayerByName(pName); if(pTarget) { m_MatchDBMgr.spBanPC(pTarget->GetAccountInfo()->m_nAID, razon); Disconnect(pTarget->GetUID()); sprintf(message, "%s - %s", pTarget->GetAccountName(), pReason); LogCommand("banpc", pObj->GetCharInfo()->m_szName, message); } } }
void CExchangeGoods::RecvRemoteExchangeOperationMsg( struct SQAQuestRemoteExchangeMsg *pMsg ) { if (!pMsg) { rfalse(4, 1, "ExchangeGoods.cpp - RecvRemoteExchangeOperationMsg() - !pMsg"); return; } // 远程交易思路,为每一个角色添加一个商贸信息表,map<DWORD, DWORD>( itemIdx, time ) // 只要是发布过交易信息的,就会在这个表里边添加一条信息(同时清除已经过期的信息) // 交易中的操作(确认、取消) CPlayer *src = static_cast<CPlayer *>(this); if (src == NULL) return; // 这个逻辑是客户端发起远程交易请求 if ( pMsg->dnidClient == 0 ) { CPlayer *dst = ( CPlayer* )GetPlayerByName( pMsg->name )->DynamicCast( IID_PLAYER ); if ( dst == NULL || dst->m_ClientIndex == 0 || dst == src ) { TalkToDnid( src->m_ClientIndex, "远程交易目标玩家不在线!" ); return; } //正在游戏大厅 if ( src->IsBetting() || dst->IsBetting() ) { TalkToDnid( src->m_ClientIndex, src->IsBetting() ? "游戏大厅中你不能进行交易……" : "对方正在游戏大厅中,没办法和阁下交易……" ); return; } if ( src->m_ParentRegion == NULL || dst->m_ParentRegion == NULL || src->m_ParentRegion->DynamicCast( IID_DYNAMICREGION ) || dst->m_ParentRegion->DynamicCast( IID_DYNAMICREGION ) ) { TalkToDnid( src->m_ClientIndex, "当角色位于动态场景时,不能使用远程交易" ); return; } if ( src->InExchange() || dst->InExchange() ) { TalkToDnid( src->m_ClientIndex, src->InExchange() ? "当前状态限制你不能进行交易……" : "对方正在交易中,没办法和阁下交易……" ); return; } // if ( src->GetSaleState() != 0 || dst->GetSaleState() ) // { // TalkToDnid( src->m_ClientIndex, ( src->GetSaleState() != 0 ) ? // "阁下正在摆摊中,不能进行交易……" : "对方正在摆摊中,没办法和阁下交易……" ); // return; // } std::map< DWORD, time_t >::iterator it = dst->excInfoMap.find( pMsg->item ); if ( it == dst->excInfoMap.end() || abs( ( int )( time( NULL ) - it->second ) ) > 5*60 ) { TalkToDnid( src->m_ClientIndex, "你请求的信息已经过期!" ); return; } SQAQuestRemoteExchangeMsg msg; msg.dnidClient = src->m_ClientIndex; msg.dwSrcGID = src->GetGID(); msg.dwDestGID = dst->GetGID(); msg.item = pMsg->item; dwt::strcpy( msg.name, src->GetName(), sizeof( msg.name ) ); if ( g_StoreMessage( dst->m_ClientIndex, &msg, sizeof( msg ) ) ) TalkToDnid( src->m_ClientIndex, "已经向目标转达了你的交易请求!" ); else TalkToDnid( src->m_ClientIndex, "向目标转达交易请求的过程中出现错误!" ); } else { CPlayer *dst = ( CPlayer* )GetPlayerByDnid( pMsg->dnidClient )->DynamicCast( IID_PLAYER ); if ( dst == NULL || dst->m_ClientIndex == 0 || dst == src ) { TalkToDnid( src->m_ClientIndex, "远程交易目标玩家不在线!" ); return; } if ( pMsg->item == 0 || pMsg->dwSrcGID != src->GetGID() || pMsg->dwDestGID != dst->GetGID() ) TalkToDnid( src->m_ClientIndex, FormatString( "%s拒绝了你的交易请求!", dst->GetName() ) ); else { if ( src->m_ParentRegion == NULL || dst->m_ParentRegion == NULL || src->m_ParentRegion->DynamicCast( IID_DYNAMICREGION ) || dst->m_ParentRegion->DynamicCast( IID_DYNAMICREGION ) ) { TalkToDnid( src->m_ClientIndex, "当角色位于动态场景时,不能使用远程交易" ); return; } std::map< DWORD, time_t >::iterator it = src->excInfoMap.find( pMsg->item ); if ( it == src->excInfoMap.end() || abs( ( int )( time( NULL ) - it->second ) ) > 5*60 ) TalkToDnid( src->m_ClientIndex, "你响应的远程交易请求已经过期!" ); else StartExchange( dst ); // 尝试启动交易 } } }