import { EErrorCode } from '../Config/_error_'; import { GLog } from 'cgserver'; import { CardServer } from '../Logic/CardServer'; import * as _ from "underscore"; import { ns_card } from '../Config/_ini_'; import { ExtUserModel, GExtUserSer } from '../../Common/Service/ExtUserService'; import { core } from 'cgserver'; import { CardRobot } from '../Logic/Robot/CardRobot'; import { GClubSer } from '../../Common/Service/ClubService'; import { MarqueeModel } from '../../Common/Service/MarqueeService'; import { GMongoCacheSer } from 'cgserver'; import { IServerWebSocket } from 'cgserver'; import { CardSeatInfo, PlayerInfo } from '../Logic/Table/CardSeat'; import { CardRecordTableInfo, CardTable, CardTableInfo } from '../Logic/Table/CardTable'; /* 主动和hall服连接,交换比赛信息,游戏的最核心玩法 */ export class CardClientWebSocket extends IServerWebSocket { protected _user:ExtUserModel=null get cardServer() { return this._server } protected _table:CardTable=null protected _sendTo(userid:number|number[],msg) { if(!userid) { return } let user_id_list = [] if(!_.isArray(userid)) { user_id_list = [userid] } else { user_id_list = userid } //找到正确的center let game = this.cardServer //让消息输出只输出第一条的有多条的时候 let pre_debug_msg=this._debug_msg user_id_list.forEach((user_id)=> { let robot:CardRobot = null if(this.cardServer.robotMgr) { robot = this.cardServer.robotMgr.getRobotByUserId(user_id) } if(robot) { //复制的原因是,有可能这个对象同时给其他人了,否则会相互引用 msg._user_id = user_id robot.onMessage(core.clone(msg)) } else { let ws = game.getWebSocketByUserId(user_id) if(ws) { ws.send(msg) this._debug_msg=false } } }) //还原消息设置 this._debug_msg = pre_debug_msg } getNewMsg(cmd: any, errcode?: any) { cmd = this.cardServer.name+"_"+cmd let msg = super.getNewMsg(cmd,errcode) return msg } onClose(reasonCode: number, description: string) { let ret = super.onClose(reasonCode,description) if(this._user) { this.cardServer.removeUserId(this._user.id) } return ret } async receive_login(jsonData) { let account_id = jsonData.account_id let token = jsonData.token let key = "account_login_token_"+account_id let now_token=await GMongoCacheSer.getData(key) if(!token||token!=now_token) { this.send_login(EErrorCode.Token_Failed) return } this._user = await GExtUserSer.getByAccountId(account_id) this.cardServer.addUserId(this._user.id,this.socketId) this.send_login() } send_login(errcode?) { let msg = this.getNewMsg("login",errcode) msg.user = this._user this.send(msg) } send_hall_marquee_bc(user_id:number,mq:MarqueeModel) { let msg = this.getNewMsg("hall_marquee_bc") msg._user_id = user_id msg.marquee = mq this.send(msg) } /** * 根据指定level获取roominfo * @param jsonData */ receive_get_room_info_by_level(jsonData) { let user_id = jsonData._user_id let level = jsonData.level let ri = this.cardServer.roomMgr.getRoomInfo(level) if(!ri) { this.send_get_room_info_by_level(user_id,ri,EErrorCode.No_Room_By_Level) return } this.send_get_room_info_by_level(user_id,ri) } send_get_room_info_by_level(user_id,room_info,errcode?) { let msg = this.getNewMsg("get_room_info_by_level",errcode) msg.room_info = room_info msg._user_id = user_id this.send(msg) } async receive_get_room_infos(jsonData) { let roomInfos = await this.cardServer.roomMgr.getRoomInfos(jsonData.club_id) this.send_get_room_infos(jsonData._user_id,roomInfos) } send_get_room_infos(user_id,roomInfos) { let msg = this.getNewMsg("get_room_infos") msg.room_infos = roomInfos msg._user_id = user_id this.send(msg) } send_error_cmd(cmd:string,table_id:number,errcode?) { let msg = this.getNewMsg("error_cmd", errcode) msg.error_cmd = cmd msg.table_id=table_id this.send(msg) } /** * 自动匹配该桌子 */ receive_robot_match_table(jsonData) { let table = this.cardServer.tableMgr.getTableByUserId(jsonData._user_id) if(!table)//之前在其他牌桌内,需要先离开 { this.send_robot_match_table(jsonData._user_id,EErrorCode.Not_In_Table) return } let err = table.onRobotMatch(jsonData._user_id) if(err) { this.send_robot_match_table(jsonData._user_id,EErrorCode.Not_In_Table) } } send_robot_match_table(user_id,err?) { let msg = this.getNewMsg("robot_match_table", err) this._sendTo(user_id,msg) } /** * 角色进入游戏 * @param jsonData */ async receive_enter_room(jsonData) { let room_id = jsonData.room_id if(!this._user?.is_robot) { let rig = await GMongoCacheSer.getData(this._user.id+"") if(rig) { this.send_enter_room(this._user.id,null,EErrorCode.In_Other_Table,rig) return } } let room = this.cardServer.roomMgr.getRoomById(room_id) if(!room) { this.send_enter_room(this._user.id,null,EErrorCode.Room_Not_Exist) return } if(room.roomCfg.club_id>0 &&!await GClubSer.isInClub(this._user.id,room.roomCfg.club_id)) { this.send_enter_room(this._user.id,null,EErrorCode.Not_In_Club) return } let errcode = await room.onEnter(this._user) this.send_enter_room(this._user.id,await room.getRoomInfo(),errcode) if(errcode&&!this._user.is_robot) { this.cardServer.removeUserId(this._user.id) } } send_enter_room(user_id,room_info,errcode?,rig?) { let msg = this.getNewMsg("enter_room",errcode) msg.room_info = room_info msg.rig = rig this._sendTo(user_id,msg) } receive_create_table(jsonData) { jsonData.table_type=ns_card.ETableType.Friend let rs = null if(jsonData.club_id) { rs = this.cardServer.tableMgr.createClubFriendTable(jsonData.model,jsonData._user_id,jsonData.club_id) } else { rs = this.cardServer.tableMgr.createTable(jsonData.model,jsonData._user_id) } let table_id = null if(rs.table) { table_id = rs.table.id } this.send_create_table(jsonData._user_id,table_id,rs.errcode) } /* 通知创建者,创建的成败情况 */ send_create_table(user_id,table_id,errcode) { let msg = this.getNewMsg("create_table",errcode) if(!errcode) { let table = this.cardServer.tableMgr.getTableByTableId(table_id) msg.table_info = table.getInfo() } this._sendTo(user_id,msg) if(!errcode) { let jsonData= { _user_id:user_id, table_id:table_id } this.receive_enter_table(jsonData) } } /* 申请解散牌桌 1、牌桌未开始之前直接解散 { _user_id//申请者角色id号 } */ async receive_apply_dismiss_table(jsonData) { let table = this.cardServer.tableMgr.getTableByTableId(jsonData.table_id) if(!table) { let rig = await GMongoCacheSer.getData(jsonData._user_id+"") if(!rig) { return } table = this.cardServer.tableMgr.getTableByTableId(rig.table_id) if(!table) { return } if(!table.isCreator(jsonData._user_id)) { return } } if(table.is_dismissing) { //正在申请是否解散,再次申请直接不处理 return } table.onApplyDismiss(jsonData._user_id) } /* 通知有人申请解散牌桌 */ send_apply_dismiss_table_bc(table_id:number,user_id:number,user_id_list,deadline) { let msg = this.getNewMsg("apply_dismiss_table_bc") msg.user_id = user_id//申请者id号 msg.deadline = deadline msg.table_id = table_id this._sendTo(user_id_list,msg) } /* 解散牌桌的同意与否 { user_id_list is_aggree//false:不同意true:同意 } */ receive_agree_dismiss_table(jsonData) { let table = this.cardServer.tableMgr.getTableByTableId(jsonData.table_id) if(!table) { GLog.error("no in table!userid="+jsonData._user_id) return } let ret = table.onAgreeDismiss(jsonData._user_id,jsonData.is_agree) if(ret==ns_card.EDismissResult.Error) { return } if(ret==ns_card.EDismissResult.Waiting)//还没有得出结果 { this.send_agree_dismiss_table_bc(jsonData._user_id,table.bc_user_id_list,jsonData.is_agree) return } if(ret==ns_card.EDismissResult.Dismiss)//达到了解散条件 { this.send_dismiss_table_bc(table.id,table.bc_user_id_list,true) table.onTableEnd() return } //达到了不能解散的条件 this.send_dismiss_table_bc(table.id,table.bc_user_id_list,false) } /* 已经能够判断出结果的情况下不用通知了 通知有人做出了对牌桌解散同意与否的决定 */ send_agree_dismiss_table_bc(user_id,user_id_list,is_agree) { let msg = this.getNewMsg("agree_dismiss_table_bc") msg.user_id = user_id//申请者id号 msg.is_agree = is_agree this._sendTo(user_id_list,msg) } /* 解散牌桌的结果 */ send_dismiss_table_bc(table_id,user_id_list,is_dismiss,is_start_timeout?:boolean) { let msg = this.getNewMsg("dismiss_table_bc") msg.is_start_timeout = is_start_timeout||false msg.is_dismiss = is_dismiss msg.table_id = table_id this._sendTo(user_id_list,msg) } /* 客户端请求进入table { user_id_list//申请者角色id号 table_id//桌号 } */ async receive_enter_table(jsonData) { let user_id = jsonData._user_id let table_id = jsonData.table_id if(!table_id) { return } let table = this.cardServer.tableMgr.getTableByUserId(user_id) if(table&&table.id!=table_id)//之前在其他牌桌内,需要先离开 { this.send_enter_table(user_id,null,EErrorCode.In_Other_Table) return } let user = await GExtUserSer.getById(user_id) //再检查请求桌子号 if(!table&&table_id) { table = this.cardServer.tableMgr.getTableByTableId(table_id) if(table&&table.ctdm.table_type==ns_card.ETableType.Score) { //非机器人,不能直接进入指定积分场 if(!user.is_robot) { this.send_enter_table(table_id,user_id,null,EErrorCode.Can_Not_Enter_Score_Table) return } } } if(!table) { this.send_enter_table(table_id,user_id,null,EErrorCode.Table_Not_Exist) return } if(table.club &&!await GClubSer.isInClub(user_id,table.club.id)) { this.send_enter_table(table_id,user_id,null,EErrorCode.Not_In_Club) return } let playerinfo = new PlayerInfo(user) let errcode = await table.onEnter(playerinfo) if(errcode) { this.send_enter_table(table_id,user_id,null,errcode) } } /* 告诉客户端进入是否成功 */ send_enter_table(table_id:number,user_id:number,info,errcode?) { let msg = this.getNewMsg("enter_table",errcode) msg.table_info = info msg.table_id = table_id this._sendTo(user_id,msg) } send_enter_table_bc(table_id:number,user_id_list,seat) { let msg = this.getNewMsg("enter_table_bc") msg.seat = seat msg.table_id = table_id this._sendTo(user_id_list,msg) } /* 请离牌桌 */ async receive_please_leave_table(jsonData) { let main_user_id = jsonData._user_id let leave_user_id = jsonData.user_id let table = this.cardServer.tableMgr.getTableByTableId(jsonData.table_id) if(!table) { return } //只有桌主可以踢人 if(!table.isCreator(main_user_id)) { return } let errcode = await table.onLeave(leave_user_id) if(errcode) { this.send_error_cmd(this._server.name+"_please_leave_table",jsonData.table_id,errcode) return } } /* 请求离开桌子 */ async receive_leave_table(jsonData) { let user_id = jsonData._user_id let table = this.cardServer.tableMgr.getTableByTableId(jsonData.table_id) if(!table) { this.cardServer.removeUserId(jsonData._user_id) this.send_leave_table(user_id,null,EErrorCode.Not_In_Table) return } let errcode = await table.onLeave(user_id) if(errcode) { this.send_leave_table(user_id,errcode) return } this.cardServer.removeUserId(jsonData._user_id) } send_leave_table(user_id,table_id:number,errcode?) { let msg = this.getNewMsg("leave_table",errcode) msg.table_id=table_id this._sendTo(user_id,msg) } /* 通知离开 */ send_leave_table_bc(table_id:number,user_id_list,user_id:number) { let msg = this.getNewMsg("leave_table_bc") msg.user_id = user_id msg.table_id = table_id this._sendTo(user_id_list,msg) } /* 请求坐下 */ async receive_sitdown(jsonData) { let user_id = jsonData._user_id let table_id = jsonData.table_id let table = this.cardServer.tableMgr.getTableByUserId(user_id) if(table&&table.id!=table_id) { await table.onLeave(user_id) table = null } table = this.cardServer.tableMgr.getTableByTableId(table_id) if(!table) { this.send_error_cmd(this._server.name+"_sitdown",table_id,EErrorCode.Table_Not_Exist) return } if(table.club &&!await GClubSer.isInClub(user_id,table.club.id)) { this.send_error_cmd(this._server.name+"_sitdown",table_id,EErrorCode.Not_In_Club) return } let user = await GExtUserSer.getById(user_id) let playerinfo = new PlayerInfo(user) let errcode = table.onSitdown(playerinfo) if(errcode) { this.send_error_cmd(this._server.name+"_sitdown",table_id,errcode) return } } send_sitdown_bc(user_id_list:number|number[],table_id:number,seat:CardSeatInfo) { let msg = this.getNewMsg("sitdown_bc") msg.seat = seat msg.table_id = table_id this._sendTo(user_id_list,msg) } receive_standup(jsonData) { let user_id = jsonData._user_id let table_id = jsonData.table_id let table = this.cardServer.tableMgr.getTableByTableId(table_id) if(!table) { this.send_standup(table_id,user_id,EErrorCode.Not_In_Table) return } let ret = table.onStandUp(user_id) if(!ret) { this.send_standup(table_id,user_id,EErrorCode.Standup_Failed) return } } send_standup(table_id:number,user_id:number,errcode) { let msg = this.getNewMsg("standup",errcode) msg.table_id=table_id this._sendTo(user_id,msg) } send_standup_bc(user_id_list,table_id:number,user_id:number) { let msg = this.getNewMsg("standup_bc") msg.user_id = user_id msg.table_id = table_id this._sendTo(user_id_list,msg) } /* 房主开始游戏 */ receive_start_game(jsonData) { let user_id = this._user.id let table_id = jsonData.table_id let table = this.cardServer.tableMgr.getTableByTableId(table_id) if(!table) { this.send_start_game(table_id,user_id,EErrorCode.Not_In_Table) return } //不是房主,无法开始 if(!table.isCreator(user_id)) { this.send_start_game(table_id,user_id,EErrorCode.Not_Creator) return } let err = table.onStart() if(err) { this.send_start_game(table_id,user_id,err) } } send_start_game(table_id:number,user_id:number,err) { let msg = this.getNewMsg("start_game",err) msg.table_id = table_id this._sendTo(user_id,msg) } /* 通知所有玩家游戏开始,非全扣牌的模式下进行发牌 */ send_start_game_bc(user_id_list:number|number[],table_info:CardTableInfo) { let msg = this.getNewMsg("start_game_bc") msg.table_info = table_info msg.table_id = table_info.id this._sendTo(user_id_list,msg) } send_begin_prepare_bc(deadline,user_id_list) { let msg = this.getNewMsg("begin_prepare_bc") msg.deadline = deadline this._sendTo(user_id_list,msg) } receive_prepare(jsonData) { let user_id = this._user.id let table_id = jsonData.table_id let table = this.cardServer.tableMgr.getTableByTableId(table_id) if(!table) { this.send_prepare(table_id,user_id,EErrorCode.Not_In_Table) return } let ret=table.onPrepare(user_id) if(!ret) { this.send_prepare(table_id,user_id,EErrorCode.Prepare_Failed) } } send_prepare(table_id:number,user_id:number,errcode) { let msg = this.getNewMsg("prepare",errcode) msg.table_id = table_id this._sendTo(user_id,msg) } send_prepare_bc(user_id,user_id_list) { let msg = this.getNewMsg("prepare_bc") msg.user_id = user_id this._sendTo(user_id_list,msg) } /* 牌局结束,亮开所有的牌,通知结果等 */ send_game_result_bc(user_id_list,record,timeout) { let msg = this.getNewMsg("game_result_bc") msg.record = record msg.timeout = timeout this._sendTo(user_id_list,msg) } send_game_end_bc(table_id:number,user_id_list,battlerecord) { let msg = this.getNewMsg("game_end_bc") msg.battlerecord = battlerecord msg.table_id = table_id this._sendTo(user_id_list,msg) } //接受获取上局回顾信息请求 receive_lastest_records(jsonData) { let user_id = this._user.id let table_id = jsonData.table_id let num = jsonData.num let table = this.cardServer.tableMgr.getTableByTableId(table_id) if(!table) { this.send_lastest_records(table_id,user_id,null,EErrorCode.Not_In_Table) return } let records = table.getLastestRecord(num) this.send_lastest_records(table_id,user_id,records) } //发送上局回顾信息 send_lastest_records(table_id:number,user_id:number,lastest_records:CardRecordTableInfo[],errcode?) { let msg = this.getNewMsg("lastest_records") msg.table_id = table_id msg.lastest_records = lastest_records this._sendTo(user_id,msg) } receive_auto(jsonData) { if(!this._user) { return } let user_id = this._user.id let table_id = jsonData.table_id let auto = jsonData.auto let table = this.cardServer.tableMgr.getTableByTableId(table_id) if(!table) { this.send_auto(table_id,user_id,auto,EErrorCode.Not_In_Table) return } let errcode = table.onAuto(user_id,auto) if(!errcode) { return } this.send_auto(table_id,user_id,auto,EErrorCode.Not_In_Table) } send_auto(table_id:number,user_id:number,auto:boolean,errcode) { let msg = this.getNewMsg("auto",errcode) msg.auto = auto msg.table_id = table_id this._sendTo(user_id,msg) } //通知某人被托管 send_auto_bc(table_id:number,user_id_list:number|number[],user_id:number,auto:boolean) { let msg = this.getNewMsg("auto_bc") msg.user_id = user_id msg.auto = auto msg.table_id = table_id this._sendTo(user_id_list,msg) } send_get_record(user_id,record) { let msg = this.getNewMsg("get_record") msg.record = record this._sendTo(user_id,msg) } filterMsg(jsonData) { let ret = super.filterMsg(jsonData) if(!ret) { return ret } if(jsonData.cmd!=this._server.name+"_login"&&!this._user) { this.send_error_cmd(jsonData.cmd,jsonData.table_id,EErrorCode.Login_First) ret = false } return ret } receive_other_all(jsonData) { let cmd = "receive_"+jsonData.cmd cmd = cmd.replace("_"+this._server.name+"_","_") if(this[cmd]) { this[cmd](jsonData) } } }