📄 m_gameserver.cc
字号:
#include <map>#include <string>#include <stdio.h>#include <stdarg.h>#include <unistd.h>#include <time.h>#include <listener.h>#include <socket.h>#include "m_GameServer.h"void send_cmd_msg(char *buf,char p_level,char p_msg1,char p_msg2,char *p_data) { sprintf(buf,"%c%c%c%c%c%c%s",p_level,1,p_msg1,p_msg2,1,1,p_data);}BaseGamePlayer::BaseGamePlayer(void) { m_pos_x=0; m_pos_y=0; x1=0;x2=0;y1=0;y2=0;}void BaseGamePlayer::AddSocketBuf(char *data) { if( m_status!=GamePlayerStatus::Empty || m_fd>0 ) { if( !m_SocketBuf.empty() ) { m_SocketBuf.append("\r\n"); } m_SocketBuf.append(data); }}int BaseGamePlayer::SetXY(int u_x,int u_y) { if(u_x>0 && u_y>0) { int max_width,max_height,s_width,s_height; m_pos_x=u_x; m_pos_y=u_y; max_width=1050; max_height=1050; s_width=380+120; s_height=300+120; x2=u_x+s_width/2; x1=u_x-s_width/2; y2=u_y+s_height/2; y1=u_y-s_height/2; if(x1<0) { x2+=-x1; x1=0; } if(x2>max_width) { x1-=s_width/2-(max_width-u_x); x2=max_width; } if(y1<0) { y2+=-y1; y1=0; } if(y2>max_height) { y1-=s_height/2-(max_height-u_y); y2=max_height; } return 1; } else { return 0; }}int BaseGamePlayer::test_XY( int d_x,int d_y) { if( d_x>=x1 && d_x<=x2 && d_y>=y1 && d_y<=y2 ) { return 1; } else { return 0; }}GamePlayer::GamePlayer(void) { m_status=GamePlayerStatus::Empty; m_ReadyFlag=false;}void GamePlayer::init(unsigned int id,char *p_name) { m_user_id=id; m_status=GamePlayerStatus::Free; m_ReadyFlag=false; m_SocketBuf.clear(); strncpy(m_name,p_name,19);}void GamePlayer::clear() { m_user_id=NONE; m_status=GamePlayerStatus::Empty; m_name[0]=0; m_fd=0; m_ReadyFlag=false; m_SocketBuf.clear();}void GamePlayer::GetPlayerStatus(char *buf) { sprintf(buf,"%s|%d|%d|%d|%d|%d|%d",m_name,m_pos_x,m_pos_y,m_sex,m_face_id,m_body_id,m_player_status);}void GamePlayer::SetData(unsigned int fd,char *ext) { m_fd=fd; sscanf(ext,"%d|%d|%d|%d|",&m_pos_x,&m_pos_y,&m_sex,&m_face_id);}//--------------------------------------------------------------------------//GameServer 程序段GameServer::GameServer(void) { m_status=GameServerStatus::Empty; m_TimeFlag=false;}void GameServer::GetStatus(char *buf) { buf[0]=0; if( m_status!=GameServerStatus::Empty ) { int m_s; if(m_status==GameServerStatus::Waiting) { m_s=1; } else { m_s=2; } sprintf(buf,"%d|%d|%s|%s|%d|%d|%s",m_room_id,m_s,room_name,m_GamePlayer[Players[0]]->m_name,max_player,cur_player,room_passwd); }}void GameServer::PlayerReady(int player_id) { int i,count; if( m_status==GameServerStatus::Waiting ) { count=0; for(i=0;i<max_player;i++) { if( Players[i]!=NONE ) { if( Players[i]==player_id ) { m_GamePlayer[player_id]->m_ReadyFlag=true; } if( m_GamePlayer[ Players[i] ]->m_ReadyFlag==true ) count++; } } if( count==max_player ) m_CanPlayFlag=true; }}int GameServer::GetPlayerSlot(int player_id) { int i; for(i=0;i<max_player;i++) { if( Players[i]!=NONE ) { if( Players[i]==player_id ) { return i; } } } return NONE;}void GameServer::time_process(void) {}void GameServer::Game_init(int room_id,int max) { char subject[128],passwd[128]; int i,m; m_room_id=room_id; min_player=0; max_player=max; m_status=GameServerStatus::Waiting; m_CanPlayFlag=false; for(i=0;i<max_player;i++) { Players[i]=NONE; }// strncpy(room_name,subject,30);// strncpy(room_passwd,passwd,30);}void GameServer::Game_exit(void) { m_room_id=NONE; m_status=GameServerStatus::Empty; for(int i=0;i<max_player;i++) { if(Players[i]!=NONE) { m_GamePlayer[Players[i]]->m_room_id=NONE; m_GamePlayer[Players[i]]->m_status=GamePlayerStatus::Free; m_GamePlayer[Players[i]]->m_ReadyFlag=false; Players[i]=NONE; } } cur_player=0;}int GameServer::join(int player_id) { int i; if(cur_player<max_player) { for(i=0;i<max_player;i++) { if(Players[i]==NONE) { Players[i]=player_id; m_GamePlayer[player_id]->m_room_id=m_room_id; m_GamePlayer[player_id]->m_status=GamePlayerStatus::Room; cur_player++; break; } } return i; } else { return -1; }}int GameServer::leave(int player_id) { char buf[1024],buf1[128]; int i; for(i=0;i<max_player;i++) { if(Players[i]==player_id) { // m_GamePlayer[i]->clear(); Players[i]=NONE; cur_player--; sprintf(buf1,"%s",m_GamePlayer[player_id]->m_name); printf("-------玩家 --%s-- 离开了\n", m_GamePlayer[player_id]->m_name); send_cmd_msg(buf,V_MSG_USERLEVEL,MSG_USERLOG,SUB_MSG_USER_QUIT,buf1); send_all(buf,player_id); break; } } return 0;}void GameServer::send_all(char *data,int filter_id) { int i,c; for(i=0,c=0;c<cur_player && i<max_player;i++) { if(Players[i]!=NONE) { c++; if( Players[i]!=filter_id ) { m_GamePlayer[Players[i]]->AddSocketBuf(data); } } }}void GameServer::send_all2(char *data,int player_id) { int i,c; for(i=0,c=0;c<cur_player && i<max_player;i++) { if(Players[i]!=NONE) { c++; if( m_GamePlayer[player_id]->test_XY(m_GamePlayer[Players[i]]->m_pos_x,m_GamePlayer[Players[i]]->m_pos_y) ) { m_GamePlayer[Players[i]]->AddSocketBuf(data); } } }}void GameServer::send_playerlist(void) { char buf[1024],buf1[1024]; buf1[0]=0; for(int i=0;i<max_player;i++) { if(Players[i]!=NONE) { strcat(buf1,m_GamePlayer[Players[i]]->m_name); if(m_GamePlayer[Players[i]]->m_ReadyFlag==true) { strcat(buf1,",1"); } else { strcat(buf1,",0"); } } strcat(buf1,"|"); } buf1[strlen(buf1)-1]=0; send_cmd_msg(buf,V_MSG_USERLEVEL,MSG_ROOM,MSG_ROOM_USER_CHANGE,buf1);// send_all(buf);}void GameServer::Round_init(void) { for(int i=0;i<max_player;i++) { if(Players[i]!=NONE) { m_GamePlayer[Players[i]]->m_status = GamePlayerStatus::Playing; } } m_status=GameServerStatus::Playing;}void GameServer::Round_exit(void) { for(int i=0;i<max_player;i++) { if(Players[i]!=NONE) { m_GamePlayer[Players[i]]->m_status = GamePlayerStatus::Free; } }}void GameServer::play_change_slot(int player_id,int new_slot) { int old_slot; old_slot=GetPlayerSlot(player_id); if( old_slot!=NONE && old_slot!=new_slot && new_slot!=0 ) { if( Players[new_slot]==NONE ) { Players[new_slot]=player_id; Players[old_slot]=NONE; send_playerlist(); } }}void GameServer::GetAllPlayer(char *buf) { int i,c; char buf1[256]; for(i=0,c=0;c<cur_player && i<max_player;i++) { if(Players[i]!=NONE) { c++; m_GamePlayer[Players[i]]->GetPlayerStatus(buf1); strcat(buf1,","); strcat(buf,buf1); } } if(c) { buf[strlen(buf)-1]=0; }}void GameServer::process(int player_id,char p_msg2,char p_msg3,char *data) { //printf("nothing\n");}//GameRoomServer 程序段GameRoomServer::GameRoomServer(void) { OnlinePlayer=0; time(&up_time); My_version[0]=0;/* int Max_GameServer=100; int Max_GamePlayer=400; for(i=0;i<Max_GameServer;i++) { m_GameServer[i]=new GameServer; } for(i=0;i<Max_GamePlayer;i++) {// m_GamePlayer[i]=new GamePlayer; }*/}int GameRoomServer::CreateGameServer(int player_id,char *param) { int room_id; room_id=FindGameServer(GameServerStatus::Empty); if(room_id!=NONE) {// m_GameServer[room_id]->Game_init(room_id,player_id,param); } return room_id;}int GameRoomServer::JoinGameServer(int room_id,int player_id) { if(room_id>=0 && room_id<Max_GameServer) { if( m_GameServer[room_id]->m_status==GameServerStatus::Waiting) { return m_GameServer[room_id]->join(player_id); } } return ERROR;}int GameRoomServer::LeaveGameServer(int room_id,int player_id) { if( room_id>=0 && room_id<Max_GameServer && m_GameServer[room_id]->leave(player_id)!=NONE) { return 0; } return NONE;}int GameRoomServer::DeleteGameServer(int id) { if(id>=0 && id<Max_GameServer && m_GameServer[id]->m_status!=GameServerStatus::Empty) { m_GameServer[id]->m_status=GameServerStatus::Empty; return 0; } else { return NONE; }}int GameRoomServer::FindGameServer(GameServerStatus::Status status) { int i; for(i=0;i<Max_GameServer;i++) { if(m_GameServer[i]->m_status==status ) { break; } } if(i==Max_GameServer) i=NONE; return i;}int GameRoomServer::GetNewGamePlayer(void) { int i; for(i=0;i<Max_GamePlayer;i++) { if(m_GamePlayer[i]->m_status==GamePlayerStatus::Empty) break; } if( i==Max_GamePlayer ) i=NONE; return i;}int GameRoomServer::PlayerJoin(char *name,char *passwd) { int n; n=CheckPlayerExist(name); if(n==NONE) { n=GetNewGamePlayer(); if(n!=NONE) { m_GamePlayer[n]->init(0,name); OnlinePlayer++; } } return n;}int GameRoomServer::PlayerExit(char *name) { int n; n=CheckPlayerExist(name); if(n!=NONE) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -