Example #1
0
// 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;
}
Example #2
0
	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 );
	}
Example #3
0
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;
}
Example #4
0
	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 );
	}
Example #5
0
// 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;
}
Example #6
0
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;
	}
}