⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 msgchatroom.cpp

📁 魔域源代码需要的可以学习一下真么这么麻烦啊
💻 CPP
字号:
// MsgChatRoom.cpp: implementation of the CMsgChatRoom class.
//
//////////////////////////////////////////////////////////////////////
#include "AllMsg.h"
#include "UserList.h"
#include "logfile.h"
using namespace world_kernel;
#include "WorldKernel.h"

#include "ChatRoom.h"
#include "ChatRoomManager.h"

#include "MsgChatRoom.h"


//extern CChatRoomManager g_objChatRoomManager;

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CMsgChatRoom::CMsgChatRoom()
{
	Init();
	m_pInfo	=(MSG_Info *)m_bufMsg;
	m_sString.SetBuf(m_pInfo->szBuf, _MAX_MSGSIZE-sizeof(MSG_Info)+1);
}

CMsgChatRoom::~CMsgChatRoom()
{

}

//////////////////////////////////////////////////////////////////////
void CMsgChatRoom::Process(void* pSocket)
{
	CPlayer* pUser = UserList()->GetPlayerBySocket(GetSocketID());
	CHECK(pUser);
	char szString[_MAX_WORDSSIZE];
	m_sString.GetString(0, szString, sizeof(szString));
	
	switch( m_pInfo->usAction )
	{
	case ACTION_ENTERROOM_APPLY:	//玩家请求进入聊天室,客户端发送到服务器进行请求。
		{
			CChatRoom * pChatRoom = g_objChatRoomManager.GetRoom(szString);
			CHECK(pChatRoom);
			if(pChatRoom->IsExist(pUser))
				return;
			if(pChatRoom->IsFull())
			{
				pChatRoom->SendSysMsg(pUser,STR_CHATROOM_MEMBERFULL);
				return;
			}			
			int  nMoney = pChatRoom->GetFee();//得到收费金钱		
			
			CHECK(Create(ACTION_ENTERROOM_CHECKMONEY,nMoney,szString));

			GameWorld()->SendMapGroupMsgForChatRoom(pUser->idProcess,pUser->idSocket,this);
		}
		break;
	case ACTION_LEAVEROOM:	//离开聊天室
		{
			CChatRoom * pChatRoom = g_objChatRoomManager.GetRoomByPlayer(pUser);
			CHECK(pChatRoom);
			if(!pChatRoom->IsExist(pUser))
				return;
			
			IF_NOT(this->Create(ACTION_LEAVEROOM,0,pUser->szName)) //通知客户端玩家离开的消息
				return;
			
			if(pChatRoom->IsManager(pUser))
				pChatRoom->ResetManager();

			pChatRoom->SendMsgToAllPlayer(this);//通知聊天室所有玩家
			pChatRoom->LeaveRoom(pUser);			
			
			char szBuff[128];
			sprintf(szBuff,STR_CHATROOM_LEAVE,pUser->szName,pChatRoom->GetRoomName());
			CMsgTalk msgTalk;
			if (msgTalk.Create(SYSTEM_NAME,ALLUSERS_NAME, szBuff, NULL, 0xff0000, _TXTATR_SYSTEM))
			{
				pChatRoom->SendMsgToAllPlayer(&msgTalk);
			}
		}
		break;
	case ACTION_ENTERROOM_CHECKMONEY: //从mapgroup返回的,允许进入
		{
			CChatRoom * pChatRoom = g_objChatRoomManager.GetRoom(szString);
			CHECK(pChatRoom);
			if(pChatRoom->IsExist(pUser))
				return ;
			pChatRoom->EnterRoom(pUser);
		}
		break;
	case ACTION_APPLYMANAGER:	//申请聊天室管理员
		{
			CChatRoom * pChatRoom = g_objChatRoomManager.GetRoomByPlayer(pUser);
			CHECK(pChatRoom);
			if(!pChatRoom->IsExist(pUser))
				return;
			if(pChatRoom->IsCanApplyManager())
				pChatRoom->ApplyManager(pUser);
		}
		break;
	case ACTION_QUITMANAGER: //放弃聊天室管理员
		{
			CChatRoom * pChatRoom = g_objChatRoomManager.GetRoomByPlayer(pUser);
			CHECK(pChatRoom);
			if(!pChatRoom->IsExist(pUser))
				return;
			if(pChatRoom->IsManager(pUser))
			{
				pChatRoom->ResetManager();				
				if(Create(ACTION_QUITMANAGER,0,pUser->szName))
				{
					pChatRoom->SendMsgToAllPlayer(this);
					pChatRoom->LeaveRoom(pUser);
				}
			}
		}
		break;
	case ACTION_OFFLINE:
		{
			CChatRoom * pChatRoom = g_objChatRoomManager.GetRoomByPlayer(pUser);
			if(pChatRoom)
			{
				ULONG ulUserID =(ULONG)pUser->GetID();
				IF_NOT(this->Create(ACTION_LEAVEROOM,0,pUser->szName)) //通知客户端玩家离开的消息
					return;
				pChatRoom->SendMsgToAllExcSelf(this,pUser);//通知聊天室所有玩家
				pChatRoom->LeaveRoom(pUser);			
				
				char szBuff[128];
				sprintf(szBuff,STR_CHATROOM_LEAVE,pUser->szName,pChatRoom->GetRoomName());
				CMsgTalk msgTalk;
				if (msgTalk.Create(SYSTEM_NAME, ALLUSERS_NAME, szBuff, NULL, 0xff0000, _TXTATR_SYSTEM))
				{
					pChatRoom->SendMsgToAllPlayer(&msgTalk);
				}				
				//若是管理员,启动记时
				if(pChatRoom->IsManager(pUser))
					pChatRoom->StartupManagerOfflineTimer();
			}
		}		
		break;
	case ACTION_SETFEE:	//设置聊天费用
		{
			CChatRoom * pChatRoom = g_objChatRoomManager.GetRoomByPlayer(pUser);
			if(pChatRoom && pChatRoom->IsManager(pUser))
			{
				ULONG ulFee = m_pInfo->ulData;
				pChatRoom->SetFee(ulFee);
				pChatRoom->SendMsgToAllPlayer(this);//同步
			}
		}
		break;
	case ACTION_SETROOMNAME://设置聊天室名字
		{
			CChatRoom * pChatRoom = g_objChatRoomManager.GetRoomByPlayer(pUser);
			if(pChatRoom && pChatRoom->IsManager(pUser))
			{
				pChatRoom->SetName(szString);
				pChatRoom->SendMsgToAllPlayer(this);//同步
			}
		}
		break;
	case ACTION_KICKMEMBER: //踢
		{
			CChatRoom * pChatRoom = g_objChatRoomManager.GetRoomByPlayer(pUser);
			if(pChatRoom && pChatRoom->IsManager(pUser))
			{
				CPlayer * pPlayer = UserList()->GetPlayer(szString);
				if(pPlayer)
				{
					if(pChatRoom->IsExist(pPlayer))
					{
						pChatRoom->DrawinFee(pPlayer);
						IF_NOT(this->Create(ACTION_LEAVEROOM,0,szString)) //通知客户端玩家离线的消息
							return;
						pChatRoom->SendMsgToAllPlayer(this);//通知聊天室所有玩家
						pChatRoom->LeaveRoom(pUser);			
						
						char szBuff[128];
						sprintf(szBuff,STR_CHATROOM_LEAVE,pUser->szName,pChatRoom->GetRoomName());
						CMsgTalk msgTalk;
						if (msgTalk.Create(SYSTEM_NAME,ALLUSERS_NAME, szBuff, NULL, 0xff0000, _TXTATR_SYSTEM))
						{
							pChatRoom->SendMsgToAllPlayer(&msgTalk);
						}
					}
				}
			}
		}
		break;

	case ACTION_TALK: //谈话
		{
			CChatRoom * pChatRoom = g_objChatRoomManager.GetRoomByPlayer(pUser);
			if(pChatRoom)
			{
				pChatRoom->SendMsgToAllExcSelf(this,pUser);
			}
		}
		break;

	default:
		break;
	}
}

bool CMsgChatRoom::Create(unsigned short usAction, ULONG ulData, const char *pString)
{
	// check param
	if(usAction<0) //  || idTarget == ID_NONE
	{
		ASSERT(!"CMsgSyndicate::Create()");
		return false;
	}

	// init
	this->Init();

	m_pInfo->usAction	=usAction;	
	m_pInfo->ulData	=ulData;
	if(pString)
		m_sString.AddString(pString);
	// fill info now	
	m_unMsgType	=_MSG_CHATROOM;
	if(pString)
		m_unMsgSize	=sizeof(MSG_Info)-1+m_sString.GetSize();
	else
		m_unMsgSize	=sizeof(MSG_Info)-1;


	return true;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -