// NPC Shout to the current map bool CWorldServer::NPCShout( CMonster* thismon, char* msg, char* npc,int mapid) { BEGINPACKET(pak, 0x0785); ADDSTRING ( pak, npc ); ADDBYTE ( pak, 0 ); ADDSTRING ( pak, msg ); ADDBYTE ( pak, 0 ); if(mapid!=0) SendToMap ( &pak, mapid ); else SendToMap ( &pak, thismon->Position->Map ); return true; }
void CenterServer::OnRecv_LoginResult( PacketHeader* packet ) { assert( packet->m_Length == sizeof(Packet_CS2C_Inner_LoginResult) ); if( packet->m_Length != sizeof(Packet_CS2C_Inner_LoginResult) ) return; Packet_CS2C_Inner_LoginResult* packetLoginResult = (Packet_CS2C_Inner_LoginResult*)packet; /// 如果登录成功 if( packetLoginResult->m_Result == Packet_CS2C_Inner_LoginResult::LoginResult_OK ) { LoginPlayer* loginPlayer = 0; /// 先判断该账号是否已经在登录列表中 map<uint32, LoginPlayer*>::iterator i = m_LoginPlayers.find( packetLoginResult->m_AccountId ); if( i != m_LoginPlayers.end() ) { /// 什么情况下,会到这里??? loginPlayer = i->second; loginPlayer->m_Id = packetLoginResult->m_PlayerID; loginPlayer->m_AccountId = packetLoginResult->m_AccountId; loginPlayer->m_AccountName = packetLoginResult->m_AccountName; loginPlayer->m_LoginTime = ::timeGetTime(); /// 记录登录时间 loginPlayer->m_GateId = packetLoginResult->m_GateId; LogInfo( "Exist LoginPlayer AccountName=%s", loginPlayer->m_AccountName.c_str() ); } else { loginPlayer = new LoginPlayer(); loginPlayer->m_Id = packetLoginResult->m_PlayerID; loginPlayer->m_AccountId = packetLoginResult->m_AccountId; loginPlayer->m_AccountName = packetLoginResult->m_AccountName; loginPlayer->m_LoginTime = ::timeGetTime(); /// 记录登录时间 loginPlayer->m_GateId = packetLoginResult->m_GateId; ::memset( loginPlayer->m_RoleIds, 0, sizeof(loginPlayer->m_RoleIds) ); m_LoginPlayers[loginPlayer->m_AccountId] = loginPlayer; } /// 判断该账号是否在游戏中 CenterPlayer* centerPlayer = GetCenterPlayerByAccountId( packetLoginResult->m_AccountId ); if( centerPlayer != 0 ) { /// 断线重连 LogInfo( "断线重连 AccountName=%s RoleName=%s", loginPlayer->m_AccountName.c_str(), centerPlayer->m_RoleName.c_str() ); packetLoginResult->m_Result = Packet_CS2C_Inner_LoginResult::LoginResult_OKAndReconnect; centerPlayer->m_GateId = packetLoginResult->m_GateId; centerPlayer->m_IsWaitReconnect = true; /// 标记断线重连 /// 如果该角色正在游戏中,向该地图服务器发送断线重连的消息 if( centerPlayer->m_PlayerStatus == CenterPlayerStatus_InMap ) { Packet_CS2M_Inner_PlayerReconnect packetPlayerReconnect; packetPlayerReconnect.m_RoleId = centerPlayer->m_RoleId; SendToMap( centerPlayer->m_MapId, &packetPlayerReconnect ); } SendToGate( packetLoginResult->m_GateId, packet ); /// 从登陆列表中移除 delete loginPlayer; m_LoginPlayers.erase( i ); return; } } /// 返回给客户端 SendToGate( packetLoginResult->m_GateId, packet ); }
bool CWorldServer::NPCShout2( CMonster* thismon, char* msg, char* npc ) { BEGINPACKET(pak, 0x0785); ADDSTRING ( pak, npc ); ADDBYTE ( pak, 0 ); ADDSTRING ( pak, msg ); ADDBYTE ( pak, 0 ); SendToMap ( &pak, thismon->Position->Map ); return true; }
void CenterServer::OnRecv_ChooseRoleResult( PacketHeader* packet ) { Packet_CS2C_Inner_ChooseRoleResult* packetChooseRoleResult = (Packet_CS2C_Inner_ChooseRoleResult*)packet; SRoleInfo_Header* roleInfo = (SRoleInfo_Header*)packetChooseRoleResult->m_RoleData; CenterPlayer* centerPlayer = GetCenterPlayerById( roleInfo->m_RoleId ); if( centerPlayer == 0 ) { /// 帐号登录时,就判断了断线重连,所以不应该到这里!!!!!! LogInfo( "OnRecv_ChooseRoleResult Not find CenterPlayer=%s", roleInfo->m_RoleName ); return; } if( packetChooseRoleResult->m_Length != sizeof(Packet_CS2C_Inner_ChooseRoleResult)-MAX_ROLE_DATA_SIZE+sizeof(SRoleInfo_DB) ) { LogInfo( "OnRecv_ChooseRoleResult Error Length CenterPlayer=%s", roleInfo->m_RoleName ); return; } /// 判断地图是否存在 if( roleInfo->m_MapId == 0 || roleInfo->m_MapId > m_MapArraySize ) { /// 是否在这里设置为默认地图 LogInfo( "OnRecv_ChooseRoleResult Error MapId=%d", roleInfo->m_MapId ); return; } if( m_Maps[roleInfo->m_MapId-1] == 0 ) { LogInfo( "OnRecv_ChooseRoleResult Not find MapId=%d", roleInfo->m_MapId ); return; } /// 发送角色信息给地图服务器,等待地图服务器上创建玩家对象,然后返回相关数据 /// 收到返回数据后,从登陆列表中移到游戏列表中,再发给客户端 Packet_CS2M_Inner_PlayerEnterMap packetPlayerEnterMap; packetPlayerEnterMap.m_AccountId = centerPlayer->m_AccountId; ::strcpy_s( packetPlayerEnterMap.m_AccountName, sizeof(packetPlayerEnterMap.m_AccountName), centerPlayer->m_AccountName.c_str() ); ::memcpy( packetPlayerEnterMap.m_RoleData, packetChooseRoleResult->m_RoleData, sizeof(SRoleInfo_DB) ); if( SendToMap( roleInfo->m_MapId, &packetPlayerEnterMap ) ) { centerPlayer->m_PlayerStatus = CenterPlayerStatus_EnterWorldWait; /// 缓存一下角色数据 ::memcpy( &(centerPlayer->m_Cache), packetChooseRoleResult->m_RoleData, sizeof(SRoleInfo_DB) ); } else { /// 返回一个错误消息给客户端 return; } SendToGate( centerPlayer->m_GateId, packet ); }
// NPC Announce to the server bool CWorldServer::NPCAnnounce( char* msg, char* npc, int mapid) { //LMA: We only announce in the NPC's map //Log(MSG_INFO,"%s announces: %s",npc,msg); BEGINPACKET( pak, 0x702 ); ADDSTRING( pak, npc ); ADDSTRING( pak, "> " ); ADDSTRING( pak, msg); ADDBYTE( pak, 0x00); if(mapid!=0) { SendToMap ( &pak, mapid ); } else { SendToAll( &pak ); } return true; }
void SendData(SendTarget sndRoute, int sndIndex, std::string sndData, bool IsDenounce) { /* '************************************************************** */ /* 'Author: Juan Martín Sotuyo Dodero (Maraxus) - Rewrite of original */ /* 'Last Modify Date: 14/11/2010 */ /* 'Last modified by: ZaMa */ /* '14/11/2010: ZaMa - Now denounces can be desactivated. */ /* '************************************************************** */ int LoopC; switch (sndRoute) { case SendTarget_ToPCArea: SendToUserArea(sndIndex, sndData); return; break; case SendTarget_ToAdmins: for (LoopC = (1); LoopC <= (LastUser); LoopC++) { if (UserList[LoopC].ConnID != -1) { if (UserTieneAlgunPrivilegios(LoopC, PlayerType_Admin, PlayerType_Dios, PlayerType_SemiDios, PlayerType_Consejero)) { /* ' Denounces can be desactivated */ if (IsDenounce) { if (UserList[LoopC].flags.SendDenounces) { EnviarDatosASlot(LoopC, sndData); } } else { EnviarDatosASlot(LoopC, sndData); } } } } return; break; case SendTarget_ToAll: for (LoopC = (1); LoopC <= (LastUser); LoopC++) { if (UserList[LoopC].ConnID != -1) { /* 'Esta logeado como usuario? */ if (UserList[LoopC].flags.UserLogged) { EnviarDatosASlot(LoopC, sndData); } } } return; break; case SendTarget_ToAllButIndex: for (LoopC = (1); LoopC <= (LastUser); LoopC++) { if ((UserList[LoopC].ConnID != -1) && (LoopC != sndIndex)) { /* 'Esta logeado como usuario? */ if (UserList[LoopC].flags.UserLogged) { EnviarDatosASlot(LoopC, sndData); } } } return; break; case SendTarget_toMap: SendToMap(sndIndex, sndData); return; break; case SendTarget_ToMapButIndex: SendToMapButIndex(sndIndex, sndData); return; break; case SendTarget_ToGuildMembers: // LoopC = m_Iterador_ProximoUserIndex(sndIndex); // while (LoopC>0) { // if ((UserList[LoopC].ConnID != -1)) { // EnviarDatosASlot(LoopC, sndData); // } // LoopC = m_Iterador_ProximoUserIndex(sndIndex); for (auto LoopC : guild_Iterador_ProximoUserIndex(sndIndex)) { if ((UserList[LoopC].ConnID != -1)) { EnviarDatosASlot(LoopC, sndData); } } break; return; break; case SendTarget_ToDeadArea: SendToDeadUserArea(sndIndex, sndData); return; break; case SendTarget_ToPCAreaButIndex: SendToUserAreaButindex(sndIndex, sndData); return; break; case SendTarget_ToClanArea: SendToUserGuildArea(sndIndex, sndData); return; break; case SendTarget_ToPartyArea: SendToUserPartyArea(sndIndex, sndData); return; break; case SendTarget_ToAdminsAreaButConsejeros: SendToAdminsButConsejerosArea(sndIndex, sndData); return; break; case SendTarget_ToNPCArea: SendToNpcArea(sndIndex, sndData); return; break; case SendTarget_ToDiosesYclan: // LoopC = m_Iterador_ProximoUserIndex(sndIndex); // while (LoopC > 0) { // if ((UserList[LoopC].ConnID != -1)) { // EnviarDatosASlot(LoopC, sndData); // } // LoopC = m_Iterador_ProximoUserIndex(sndIndex); // } for (auto LoopC : guild_Iterador_ProximoUserIndex(sndIndex)) { if ((UserList[LoopC].ConnID != -1)) { EnviarDatosASlot(LoopC, sndData); } } // LoopC = Iterador_ProximoGM(sndIndex); // while (LoopC > 0) { // if ((UserList[LoopC].ConnID != -1)) { // EnviarDatosASlot(LoopC, sndData); // } // LoopC = Iterador_ProximoGM(sndIndex); // } for (auto LoopC : guild_Iterador_ProximoGM(sndIndex)) { if ((UserList[LoopC].ConnID != -1)) { EnviarDatosASlot(LoopC, sndData); } } return; break; case SendTarget_ToConsejo: for (LoopC = (1); LoopC <= (LastUser); LoopC++) { if ((UserList[LoopC].ConnID != -1)) { if (UserTienePrivilegio(LoopC, PlayerType_RoyalCouncil)) { EnviarDatosASlot(LoopC, sndData); } } } return; break; case SendTarget_ToConsejoCaos: for (LoopC = (1); LoopC <= (LastUser); LoopC++) { if ((UserList[LoopC].ConnID != -1)) { if (UserTienePrivilegio(LoopC, PlayerType_ChaosCouncil)) { EnviarDatosASlot(LoopC, sndData); } } } return; break; case SendTarget_ToRolesMasters: for (LoopC = (1); LoopC <= (LastUser); LoopC++) { if ((UserList[LoopC].ConnID != -1)) { if (UserTienePrivilegio(LoopC, PlayerType_RoleMaster)) { EnviarDatosASlot(LoopC, sndData); } } } return; break; case SendTarget_ToCiudadanos: for (LoopC = (1); LoopC <= (LastUser); LoopC++) { if ((UserList[LoopC].ConnID != -1)) { if (!criminal(LoopC)) { EnviarDatosASlot(LoopC, sndData); } } } return; break; case SendTarget_ToCriminales: for (LoopC = (1); LoopC <= (LastUser); LoopC++) { if ((UserList[LoopC].ConnID != -1)) { if (criminal(LoopC)) { EnviarDatosASlot(LoopC, sndData); } } } return; break; case SendTarget_ToReal: for (LoopC = (1); LoopC <= (LastUser); LoopC++) { if ((UserList[LoopC].ConnID != -1)) { if (UserList[LoopC].Faccion.ArmadaReal == 1) { EnviarDatosASlot(LoopC, sndData); } } } return; break; case SendTarget_ToCaos: for (LoopC = (1); LoopC <= (LastUser); LoopC++) { if ((UserList[LoopC].ConnID != -1)) { if (UserList[LoopC].Faccion.FuerzasCaos == 1) { EnviarDatosASlot(LoopC, sndData); } } } return; break; case SendTarget_ToCiudadanosYRMs: for (LoopC = (1); LoopC <= (LastUser); LoopC++) { if ((UserList[LoopC].ConnID != -1)) { if (!criminal(LoopC) || UserTienePrivilegio(LoopC, PlayerType_RoleMaster)) { EnviarDatosASlot(LoopC, sndData); } } } return; break; case SendTarget_ToCriminalesYRMs: for (LoopC = (1); LoopC <= (LastUser); LoopC++) { if ((UserList[LoopC].ConnID != -1)) { if (criminal(LoopC) || UserTienePrivilegio(LoopC, PlayerType_RoleMaster)) { EnviarDatosASlot(LoopC, sndData); } } } return; break; case SendTarget_ToRealYRMs: for (LoopC = (1); LoopC <= (LastUser); LoopC++) { if ((UserList[LoopC].ConnID != -1)) { if (UserList[LoopC].Faccion.ArmadaReal == 1 || UserTienePrivilegio(LoopC, PlayerType_RoleMaster)) { EnviarDatosASlot(LoopC, sndData); } } } return; break; case SendTarget_ToCaosYRMs: for (LoopC = (1); LoopC <= (LastUser); LoopC++) { if ((UserList[LoopC].ConnID != -1)) { if (UserList[LoopC].Faccion.FuerzasCaos == 1 || UserTienePrivilegio(LoopC, PlayerType_RoleMaster)) { EnviarDatosASlot(LoopC, sndData); } } } return; break; case SendTarget_ToHigherAdmins: for (LoopC = (1); LoopC <= (LastUser); LoopC++) { if (UserList[LoopC].ConnID != -1) { if (UserTieneAlgunPrivilegios(LoopC, PlayerType_Admin, PlayerType_Dios)) { EnviarDatosASlot(LoopC, sndData); } } } return; break; case SendTarget_ToGMsAreaButRmsOrCounselors: SendToGMsAreaButRmsOrCounselors(sndIndex, sndData); return; break; case SendTarget_ToUsersAreaButGMs: SendToUsersAreaButGMs(sndIndex, sndData); return; break; case SendTarget_ToUsersAndRmsAndCounselorsAreaButGMs: SendToUsersAndRmsAndCounselorsAreaButGMs(sndIndex, sndData); return; break; case SendTarget_ToAdminsButCounselors: for (LoopC = (1); LoopC <= (LastUser); LoopC++) { if (UserList[LoopC].ConnID != -1) { if (UserTieneAlgunPrivilegios(LoopC, PlayerType_Admin, PlayerType_Dios, PlayerType_SemiDios, PlayerType_RoleMaster) && !UserTieneAlgunPrivilegios(LoopC, PlayerType_Consejero)) { EnviarDatosASlot(LoopC, sndData); } } } return; break; case SendTarget_ToAdminsButCounselorsAndRms: for (LoopC = (1); LoopC <= (LastUser); LoopC++) { if (UserList[LoopC].ConnID != -1) { if (UserTieneAlgunPrivilegios(LoopC, PlayerType_Admin, PlayerType_Dios, PlayerType_SemiDios) && !UserTieneAlgunPrivilegios(LoopC, PlayerType_Consejero, PlayerType_RoleMaster)) { EnviarDatosASlot(LoopC, sndData); } } } return; break; case SendTarget_ToHigherAdminsButRMs: for (LoopC = (1); LoopC <= (LastUser); LoopC++) { if (UserList[LoopC].ConnID != -1) { if (UserTieneAlgunPrivilegios(LoopC, PlayerType_Admin, PlayerType_Dios) && !UserTieneAlgunPrivilegios(LoopC, PlayerType_RoleMaster)) { EnviarDatosASlot(LoopC, sndData); } } } return; break; case SendTarget_ToRMsAndHigherAdmins: for (LoopC = (1); LoopC <= (LastUser); LoopC++) { if ((UserList[LoopC].ConnID != -1)) { if (UserTieneAlgunPrivilegios(LoopC, PlayerType_RoleMaster, PlayerType_Admin, PlayerType_Dios)) { EnviarDatosASlot(LoopC, sndData); } } } return; break; case SendTarget_ToGM: throw std::runtime_error("SendData unhandled target: SendTarget_ToGM"); break; } }