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

📄 m_gameserver.cc

📁 多人走路RPG服务器 c++ socket
💻 CC
📖 第 1 页 / 共 2 页
字号:
		LeaveGameServer(m_GamePlayer[n]->m_room_id,n);		m_GamePlayer[n]->clear();		OnlinePlayer--;	}	return n;}int GameRoomServer::CheckPlayerExist(char *name) {	int i;	for(i=0;i<Max_GamePlayer;i++) {				if(m_GamePlayer[i]->m_status!=GamePlayerStatus::Empty && strcmp(m_GamePlayer[i]->m_name,name)==0 ) 				break;	}	if( i==Max_GamePlayer ) i=NONE;	return i;	}void GameRoomServer::ShowAllGame(void) {	int i;	for(int j=0;j<Max_GamePlayer;j++) {		if( m_GamePlayer[j]->m_status!=GamePlayerStatus::Empty ) {			//printf("p=%s,%d\n",m_GamePlayer[j]->m_name,m_GamePlayer[j]->m_fd);		}	}}int GameRoomServer::FindPlayer_BySocket(unsigned int fd) {	int i;	for(i=0;i<Max_GamePlayer;i++) {				if(m_GamePlayer[i]->m_status!=GamePlayerStatus::Empty && m_GamePlayer[i]->m_fd==fd ) 				break;	}	if( i==Max_GamePlayer ) i=NONE;	return i;	}void GameRoomServer::GetAllPlayer(char *buf) {	int i;	char buf1[1024];	buf[0]=0;buf1[0]=0;	for(i=0;i<Max_GamePlayer;i++) {				if(m_GamePlayer[i]->m_status!=GamePlayerStatus::Empty) {			m_GamePlayer[i]->GetPlayerStatus(buf1);			strcat(buf1,",");			strcat(buf,buf1);		}	}}//--------------------------------------------------------------------------------------void GameRoomServer::send_cmd_all(char p_level,char p_msg1,char p_msg2,char *msg,unsigned int filter_socket) {	char buf[1024];	int i;	send_cmd_msg(buf,p_level,p_msg1,p_msg2,msg);		for ( int i=0;i<Max_GamePlayer;i++ ){		if(m_GamePlayer[i]->m_status==GamePlayerStatus::Free ||		   m_GamePlayer[i]->m_status==GamePlayerStatus::Room ) {			if( filter_socket && filter_socket == m_GamePlayer[i]->m_fd ) {			} else {				m_GamePlayer[i]->AddSocketBuf(buf);			}		}	}}int GameRoomServer::SendAll(void){	int i;	for ( int i=0;i<Max_GamePlayer;i++ ){		if(m_GamePlayer[i]->m_status!=GamePlayerStatus::Empty && m_GamePlayer[i]->m_SocketBuf.length() ) {			//printf("buf %d,%s ",m_GamePlayer[i]->m_fd,m_GamePlayer[i]->m_SocketBuf.c_str());			write( m_GamePlayer[i]->m_fd,m_GamePlayer[i]->m_SocketBuf.c_str(),m_GamePlayer[i]->m_SocketBuf.length()+1 );			//printf(" [end]\n");			m_GamePlayer[i]->m_SocketBuf.clear();		}	}	return 0;}void GameRoomServer::time_process(void) {	int i,c;//	static int save_time=0;	time_t t;	time(&t);	if( difftime(t,up_time) ) {		time(&up_time);		for(i=0;i<Max_GameServer;i++) {			if(m_GameServer[i]->m_TimeFlag==true) {				m_GameServer[i]->time_process();			}		}/*		if( ++save_time==5 ) {			save_time=0;			//printf("\t\t\t auto save %d\n",OnlinePlayer);			for ( i=0,c=0;c<OnlinePlayer && i<Max_GamePlayer;i++ ){				if(m_GamePlayer[i]->m_status!=GamePlayerStatus::Empty) {					c++;					SavePlayerInfo(i,m_GamePlayer[i]->m_name);				}			}		}*/	}}void GameRoomServer::process(Socket *socket, const char *data) {	int player_id,server_n,player_slot,i,j,k;	char buf[4096],buf1[4096],buf2[4096],buf3[4096],buf_tmp[4096];	p_level=data[0];	p_msg1=data[2];	p_msg2=data[3];	p_msg3=data[4];	strncpy(p_data,data+6,128);	if( strcmp( data,"count" ) ==0 ) {		sprintf(buf,"%d",OnlinePlayer);				write(socket->fd(),buf,strlen(buf));		socket->setStatus(Socket::Close);		return;	}	//printf("%d,%d,%d %s\n", p_level,p_msg1,p_msg2, data);	if(p_level==V_MSG_USERLEVEL) {		player_id=FindPlayer_BySocket(socket->fd());		if(player_id!=NONE) {			server_n=m_GamePlayer[player_id]->m_room_id;		} else {			server_n=NONE;		}		switch (p_msg1)		{						case MSG_USERLOG: //登陆消息				  switch (p_msg2)				  {					case SUB_MSG_USER_ALL:														if( player_id!=NONE ) {								buf_tmp[0]=0;								GetAllPlayer(buf_tmp);																send_cmd_msg(buf,V_MSG_USERLEVEL,MSG_USERLOG,SUB_MSG_USER_ALL,buf_tmp);								m_GamePlayer[player_id]->AddSocketBuf(buf);							}													break;					case SUB_MSG_LOGIN_ASK:							char u_name[20],u_pass[20],u_ext[1024];							sscanf(p_data,"%[^|]|%[^|]|%s",u_name,u_pass,u_ext);							if( CheckPlayerExist(u_name)!=NONE ) {								send_cmd_msg(buf,V_MSG_USERLEVEL,MSG_USERLOG,SUB_MSG_LOGIN_NO,"名字重复,请换别的名字进入.");								write(socket->fd(),buf,strlen(buf)+1);							 } else {							if( CheckPlayerLogin(u_name,u_pass,u_ext) ) {								send_cmd_msg(buf,V_MSG_USERLEVEL,MSG_USERLOG,SUB_MSG_LOGIN_NO,"没有该帐号,或密码错误.");								write(socket->fd(),buf,strlen(buf)+1);							} else {								//新用户登陆								player_id=PlayerJoin(u_name,u_pass);								if(player_id != NONE ) {									m_GamePlayer[player_id]->SetData(socket->fd(),u_ext); //设置玩家状态									//printf("new here\n");									send_cmd_msg(buf,V_MSG_USERLEVEL,MSG_USERLOG,SUB_MSG_LOGIN_PASS,"");									m_GamePlayer[player_id]->AddSocketBuf(buf);																		//									m_GamePlayer[player_id]->GetPlayerStatus(buf); //返回玩家状态//									send_cmd_all(V_MSG_USERLEVEL,MSG_USERLOG,SUB_MSG_USER_LOGIN,buf,socket->fd());								} 							}							}							break;				  }				  break;			case MSG_ROOM: //大厅消息处理				 if( player_id!=NONE ) {				  switch (p_msg2)				  {					case MSG_ROOM_ALL:    //读取所有玩家状态							buf_tmp[0]=0;							if(server_n!=NONE) {								m_GameServer[server_n]->GetAllPlayer(buf_tmp);														send_cmd_msg(buf,V_MSG_USERLEVEL,MSG_ROOM,MSG_ROOM_ALL,buf_tmp);								m_GamePlayer[player_id]->AddSocketBuf(buf);							}							break;					case MSG_ROOM_JOIN:   //加入							if(1 || m_GamePlayer[player_id]->m_status==GamePlayerStatus::Free) {								int u_x,u_y;								sscanf(p_data,"%d|%d|%d",&server_n,&u_x,&u_y);								printf("-------%s-------玩家加入 %d\n",m_GamePlayer[player_id]->m_name, server_n);								player_slot=JoinGameServer(server_n,player_id);								//printf("join here %d\n",server_n);								if( player_slot!=ERROR ) {									//成功加入处理									m_GamePlayer[player_id]->SetXY(u_x,u_y);									sprintf(buf1,"%d",server_n);									send_cmd_msg(buf,V_MSG_USERLEVEL,MSG_ROOM,MSG_ROOM_JOIN_OK,buf1);									m_GamePlayer[player_id]->AddSocketBuf(buf);//									m_GameServer[server_n]->send_playerlist();									m_GamePlayer[player_id]->GetPlayerStatus(buf1); //返回玩家状态									send_cmd_msg(buf,V_MSG_USERLEVEL,MSG_USERLOG,SUB_MSG_USER_LOGIN,buf1);									m_GameServer[server_n]->send_all(buf,player_id);//									sprintf(buf1,"[系统消息]: %s 进入.",m_GamePlayer[player_id]->m_name);//									send_cmd_msg(buf,V_MSG_USERLEVEL,MSG_SAY,V_MSG_NONE,buf1);//									m_GameServer[server_n]->send_all(buf);								} else {									//失败处理									send_cmd_msg(buf,V_MSG_USERLEVEL,MSG_ROOM,MSG_ROOM_JOIN_FAIL,"加入失败.");									m_GamePlayer[player_id]->AddSocketBuf(buf);								}							}							break;					case MSG_ROOM_PLAYER_LEAVE:														if( server_n != NONE) {								m_GameServer[server_n]->leave(player_id);								printf("-------%s------玩家离开 %d\n",m_GamePlayer[player_id]->m_name, server_n);							}							break;				  }				 }				  break;			case MSG_SAY:												 if( player_id!=NONE && server_n!=NONE) {					if( p_msg2==SUB_MSG_SAYALL ) {						sprintf(buf1, "%s|%s",m_GamePlayer[player_id]->m_name,p_data);						send_cmd_msg(buf,V_MSG_USERLEVEL,MSG_SAY,SUB_MSG_SAYALL,buf1);						m_GameServer[server_n]->send_all2(buf,player_id);					}else if( p_msg2==SUB_MSG_SAYONE) {						sprintf(buf1, "%s|%s",m_GamePlayer[player_id]->m_name,p_data);						send_cmd_msg(buf,V_MSG_USERLEVEL,MSG_SAY,SUB_MSG_SAYONE,buf1);						m_GameServer[server_n]->send_all2(buf,player_id);					}				/*					if(p_msg2==SUB_MSG_SAYALL || p_data[0]=='|') {						if( p_data[0]=='|' ) {							sprintf(buf1,"%s 说: %s",m_GamePlayer[player_id]->m_name,p_data+1);							//printf("\t\tsay1\n");							send_cmd_msg(buf,V_MSG_USERLEVEL,MSG_SAY,V_MSG_NONE,buf1);							m_GameServer[server_n]->send_all2(buf,player_id);													} else {							sscanf(p_data,"%[^|]|%s",buf1,buf2);													int p_id=CheckPlayerExist(buf1);							if(p_id!=NONE) {								//printf("\t\tsay2  p_data=%s,%s,%s\n",p_data,buf1,buf2);								sprintf(buf3,"%s 对 %s 说: %s",m_GamePlayer[player_id]->m_name,buf1,buf2);								send_cmd_msg(buf,V_MSG_USERLEVEL,MSG_SAY,V_MSG_NONE,buf3);								m_GameServer[server_n]->send_all2(buf,player_id);							}						}					} else {						sscanf(p_data,"%[^|]|%s",buf1,buf2);						int p_id=CheckPlayerExist(buf1);						//printf("\t\tsay3\n");						if(p_id!=NONE) {							sprintf(buf3,"%s 俏俏地对 %s 说: %s",m_GamePlayer[player_id]->m_name,buf1,buf2);							send_cmd_msg(buf,V_MSG_USERLEVEL,MSG_SAY,V_MSG_NONE,buf3);							m_GamePlayer[p_id]->AddSocketBuf(buf);							m_GamePlayer[player_id]->AddSocketBuf(buf);						}					}				*/				 }				 break;			case MSG_MOVE:				if( player_id!=NONE ) {					unsigned int u_x,u_y;					sscanf(p_data,"%d|%d",&u_x,&u_y);					BaseGamePlayer *u;					if(m_GamePlayer[player_id]->SetXY(u_x,u_y))	{						u=m_GamePlayer[player_id];						sprintf(buf1,"%s|%d|%d",u->m_name,u_x,u_y);						send_cmd_msg(buf,V_MSG_USERLEVEL,MSG_MOVE,SUB_MSG_MOVE_OTHER,buf1);						m_GameServer[server_n]->send_all(buf,NONE);					}				}				break;		}		if(player_id!=NONE) {			my_process(p_msg1,p_msg2,p_msg3,p_data,player_id,server_n);		}	}}void GameRoomServer::my_process(char p_msg1,char p_msg2,char p_msg3,char *p_data,int player_id,int server_n) {}/*int GameRoomServer::SavePlayerInfo(int player_id,const char *name) { 	return 0; }*/DataSQL::DataSQL(void) {	//mysql=NULL;	num_rows=0;	error_no=0;}int DataSQL::ConnectDB(const char *host,const char *user,const char *pass,const char *db) {	if( mysql_init(&mysql)==NULL ) {		strcpy(error_str,"can't init");		return -1;	}	mysql_options(&mysql,MYSQL_OPT_COMPRESS,0);	mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"odbc");	if (!mysql_real_connect(&mysql,host,user,pass,db,0,NULL,0))	{		strcpy(error_str,mysql_error(&mysql));		return -1;	}	return 0;}int DataSQL::GetData(void) {		if( row = mysql_fetch_row(result) ) {		return 1;	} else {		return 0;	}}int DataSQL::DoQuery(const char *sql) {	//printf("SQL %s\n",sql);	if (!mysql_query(&mysql,sql))	{		return 0;	} else {		return -1;	}}int DataSQL::Query(const char *sql) {	if (!mysql_query(&mysql,sql))	{		result = mysql_store_result(&mysql);		num_rows=mysql_num_rows(result);	} else {		//sql 语法错		num_rows=-1;	}	//printf("SQL %s\n",sql);	return num_rows;}void DataSQL::FreeResult(void) {	mysql_free_result(result);}int DataSQL::CheckConnect(void) {	/*CR_COMMANDS_OUT_OF_SYNC Commands were executed in an improper order. CR_SERVER_GONE_ERROR The MySQL server has gone away. CR_UNKNOWN_ERROR An unknown error occurred. */	return mysql_ping(&mysql);}

⌨️ 快捷键说明

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