/////////////////////////////////////////////////// ////////// cls_youle_room_room: 房间 ////////// /////////////////////////////////////////////////// var cls_youle_room_room = cls_youle_room_room || { //构造函数 new: function(o_game, roomcode, roomtype, needroomcard, asetcount){ var room = {}; //基本信息 room.o_game = o_game; //游戏 room.roomcode = roomcode; //房号 room.roomtype = roomtype; //房间类型 room.needroomcard = needroomcard; //开房需要的房卡数量 room.asetcount = asetcount; //总局数 room.createtime = min_now(); //开房时间 room.seatlist = []; //座位列表 var makewarplayercount = youle_room.import.makewar_playercount(o_game, roomtype); if (makewarplayercount){ room.seatlist.length = makewarplayercount; } else { room.seatlist.length = o_game.seatcount; } room.battlestate = 0; //游戏状态 0:未开战 1:已开战 room.makewartime = null; //开战时间 room.owner = null; //房主 room.applyfreetime = null; //申请解散的时间 room.freetimer = null; //默认同意解散房间的定时器 room.wasdeduct = false; //是否扣除了房主的房卡 //24小时后如果没有玩家在房间内则解散房间的定时器 var do_freeroom24 = function(){ for (var i = 0; i < room.seatlist.length; i++) { if (room.seatlist[i]){ return; } } min_closetime(room.freetimer24); room.freetimer24 = null; youle_room.export.save_grade(room, null, null, 1); } room.freetimer24 = min_ontime(do_freeroom24, 24 * 60 * 60 * 1000); //方法 room.method = {}; //查找玩家 room.method.find_player = function(playerid){ return cls_youle_room_room.find_player(room, playerid); } //获取玩家人数 room.method.get_playercount = function(){ return cls_youle_room_room.get_playercount(room); } //获取已准备的玩家人数 room.method.get_playercount_prepare = function(){ return cls_youle_room_room.get_playercount_prepare(room); } //获取房间内所有玩家的基本信息 room.method.get_playerlist = function(){ return cls_youle_room_room.get_playerlist(room); } //房间是否满桌 room.method.get_isfull = function(){ return cls_youle_room_room.get_isfull(room); } //获取房间内所有玩家的申请解散房间状态 room.method.get_agreefree = function(){ return cls_youle_room_room.get_agreefree(room); } //给房间内某个位置的玩家发包 room.method.sendpack_toseat = function(msg, seat){ cls_youle_room_room.sendpack_toseat(room, msg, seat); } //给房间内的其他玩家发包 room.method.sendpack_toother = function(msg, selfseat){ cls_youle_room_room.sendpack_toother(room, msg, selfseat); } //默认同意解散倒计时 room.method.get_freeroom_countdown = function(){ return cls_youle_room_room.get_freeroom_countdown(room); } //打开默认同意解散的定时器 room.method.open_free_timer = function(free_now_flag){ cls_youle_room_room.open_free_timer(room,free_now_flag); } //关闭默认同意解散的定时器 room.method.close_free_timer = function(){ cls_youle_room_room.close_free_timer(room); } //获取房间信息 room.method.get_roominfo = function(){ return cls_youle_room_room.get_roominfo(room); } return room; }, //查找玩家 find_player: function(o_room, playerid){ var o_player = null; for (var i = 0; i < o_room.seatlist.length; i++){ if (o_room.seatlist[i]){ if (o_room.seatlist[i].playerid == playerid){ o_player = o_room.seatlist[i]; break; } } } return o_player; }, //获取玩家人数 get_playercount: function(o_room){ var count = 0; for (var i = 0; i < o_room.seatlist.length; i++){ if (o_room.seatlist[i]){ count++; } } return count; }, //获取已准备的玩家人数 get_playercount_prepare: function(o_room){ var count = 0; for (var i = 0; i < o_room.seatlist.length; i++){ if (o_room.seatlist[i] && o_room.seatlist[i].gameinfo.isprepare){ count++; } } return count; }, //获取房间内所有玩家的基本信息 get_playerlist: function(o_room){ var playerlist = []; for (var i = 0; i < o_room.seatlist.length; i++) { if (o_room.seatlist[i]){ var player = o_room.seatlist[i].method.get_info(); playerlist.push(player); } else { playerlist.push(null); } } return playerlist; }, //房间是否满桌 get_isfull: function(o_room){ for (var i = 0; i < o_room.seatlist.length; i++) { if (!o_room.seatlist[i] || !o_room.seatlist[i].gameinfo.isprepare){ return false; } } return true; }, //获取房间内所有玩家的申请解散房间状态 get_agreefree: function(o_room){ if (!o_room.applyfreetime){ return null; } var info = {}; //默认同意解散倒计时 info.countdown = o_room.method.get_freeroom_countdown(); var list = []; for (var i = 0; i < o_room.seatlist.length; i++) { if (o_room.seatlist[i]){ list.push(o_room.seatlist[i].gameinfo.agree); } else { list.push(null); } }; info.state = list; return info; }, //给房间内某个位置的玩家发包 sendpack_toseat: function(o_room, msg, seat){ if (seat < o_room.seatlist.length){ if (o_room.seatlist[seat]) { msg.conmode = o_room.seatlist[seat].conmode; msg.fromid = o_room.seatlist[seat].fromid; youle_room.app.SendPack(msg); } } }, //给房间内的其他玩家发包 sendpack_toother: function(o_room, msg, selfseat){ // for (var i = 0; i < o_room.seatlist.length; i++) { // if (o_room.seatlist[i] && (i != selfseat)) { // msg.conmode = o_room.seatlist[i].conmode; // msg.fromid = o_room.seatlist[i].fromid; // youle_room.app.SendPack(msg); // } // } var _toids_tcp = []; for (var i = 0; i < o_room.seatlist.length; i++) { if (o_room.seatlist[i] && (i != selfseat)) { if (o_room.seatlist[i].conmode && o_room.seatlist[i].fromid){ if (o_room.seatlist[i].conmode == "tcp"){ _toids_tcp.push(o_room.seatlist[i].fromid); } else { msg.conmode = o_room.seatlist[i].conmode; msg.fromid = o_room.seatlist[i].fromid; youle_room.app.SendPack(msg); } } } } if (_toids_tcp.length > 0){ msg.conmode = "tcp"; youle_room.app.SendPack(msg, _toids_tcp); } }, //默认同意解散房间的倒计时时间 get_freeroom_countdown: function(o_room){ var apply = new Date(o_room.applyfreetime); var now = new Date(); return o_room.o_game.o_agent.freeroom - parseInt((now.getTime() - apply.getTime()) / 1000); }, //打开默认同意解散的定时器 open_free_timer: function(o_room,free_now_flag){ var do_freeroom = function(){ o_room.freetimer = null; for (var i = 0; i < o_room.seatlist.length; i++){ if (o_room.seatlist[i]){ if (o_room.seatlist[i].gameinfo.agree == -1){ o_room.seatlist[i].gameinfo.agree = 1; } } } //通知代理商服务器解散房间 var o_game = o_room.o_game; var o_agent = o_game.o_agent; var msg1 = {}; msg1.app = youle_room.app.appname; msg1.route = youle_room.app.youle_agent.routename; msg1.rpc = "free_room"; msg1.data = {}; msg1.data.agentid = o_agent.agentid; msg1.data.gameid = o_game.gameid; msg1.data.roomcode = o_room.roomcode; //玩家列表 msg1.data.playeridlist = []; for (var i = 0; i < o_room.seatlist.length; i++) { if (o_room.seatlist[i]){ msg1.data.playeridlist.push(o_room.seatlist[i].playerid); } } if (o_agent.server == o_game.roomserver){ //房间服务器与代理商服务器是同一地址 youle_room.app.youle_agent[msg1.rpc](msg1); //通知前端房间内的所有人解散房间 var msg2 = {}; msg2.app = youle_room.app.appname; msg2.route = youle_room.routename; msg2.rpc = "free_room"; msg2.data = {}; //获取房间内各玩家的解散房间状态 if(!free_now_flag){ msg2.data.seats = o_room.method.get_agreefree().state; }else{ msg2.data.freeNow = 1; msg2.data.tips = "房间玩家存在恶意行为,房间已由房主强制解散"; } //获取游戏的解散包 // if (o_room.battlestate == 1){ // msg2.data.deskfree = youle_room.import.get_disbandRoom(o_room); // } // o_room.method.sendpack_toother(msg2, -1); if (o_room.battlestate == 1){ var _deskfree = youle_room.import.get_disbandRoom(o_room); if (_deskfree){ if (_deskfree.sendtype && _deskfree.sendtype == 1 && _deskfree.seatlist){ //子游戏返回的解散json数据如果有sendtype属性且值等于1则表示需要向不同的玩家各自发包,且根据seatlist数组对应给各位置的玩家发游戏解散包 for (var n = 0; n < _deskfree.seatlist.length; n++) { if (_deskfree.seatlist){ msg2.data.deskfree = _deskfree.seatlist[n]; o_room.method.sendpack_toseat(msg2, n); } } } else { msg2.data.deskfree = _deskfree; o_room.method.sendpack_toother(msg2, -1); } } else { o_room.method.sendpack_toother(msg2, -1); } } else { o_room.method.sendpack_toother(msg2, -1); } //释放房间 o_game.method.free_room(o_room); } else { //房间服务器与代理商服务器不是同一地址 var cfg = {}; cfg.url = "http://" + o_agent.server + ":" + o_agent.httpport + "/index.html"; cfg.type = "POST"; cfg.data = JSON.stringify(msg1); cfg.success = function(str){ var _info = {}; //获取房间内各玩家的解散房间状态 _info.seats = o_room.method.get_agreefree().state; //获取游戏的解散包 // if (o_room.battlestate == 1){ // _info.deskfree = youle_room.import.get_disbandRoom(o_room); // } var _deskfree = null; if (o_room.battlestate == 1){ _deskfree = youle_room.import.get_disbandRoom(o_room); } //通知前端房间内的所有人需要断开房间服务器,连接代理服务器 for (var i = 0; i < o_room.seatlist.length; i++) { if (o_room.seatlist[i]) { var msg2 = {}; msg2.app = youle_room.app.appname; msg2.route = youle_room.routename; msg2.rpc = "connect_agentserver"; msg2.data = {}; msg2.data.agentserver = o_agent.server + ":" + o_agent.tcpport; msg2.data.data = {}; msg2.data.data.opt = "free_room"; msg2.data.data.playerid = o_room.seatlist[i].playerid; msg2.data.data.agentid = o_agent.agentid; msg2.data.data.gameid = o_game.gameid; if (_deskfree){ if (_deskfree.sendtype && _deskfree.sendtype == 1 && _deskfree.seatlist){ //子游戏返回的解散json数据如果有sendtype属性且值等于1则表示需要向不同的玩家各自发包,且根据seatlist数组对应给各位置的玩家发游戏解散包 _info.deskfree = _deskfree.seatlist[i]; } else { _info.deskfree = _deskfree; } } msg2.data.data.info = _info; msg2.conmode = o_room.seatlist[i].conmode; msg2.fromid = o_room.seatlist[i].fromid; //此处conmode = null是为了避免触发玩家离线通知其他玩家事件 o_room.seatlist[i].conmode = null; o_room.seatlist[i].fromid = null; youle_room.app.SendPack(msg2); } } //释放房间 o_game.method.free_room(o_room); }; cfg.error = function(str){}; min_http(cfg); } } if (!free_now_flag){ o_room.freetimer = min_ontimeout(do_freeroom, o_room.o_game.o_agent.freeroom * 1000); } else { do_freeroom(); } }, //关闭默认同意解散的定时器 close_free_timer: function(o_room){ min_closetime(o_room.freetimer); o_room.freetimer = null; }, //获取房间信息 get_roominfo: function(o_room){ var info = {}; info.roomtype = o_room.roomtype; //房间类型 info.needroomcard = o_room.needroomcard; //开房需要的房卡数量 info.asetcount = o_room.asetcount; //总局数 info.createtime = o_room.createtime; //开房时间 info.makewartime = o_room.makewartime; //开战时间 info.battlestate = o_room.battlestate; //游戏状态 0:未开战 1:已开战 info.wasdeduct = o_room.wasdeduct; //是否扣除了房主的房卡 info.roommode = o_room.roommode; //是否是星星场 info.beanfloor = o_room.beanfloor; //星星下限 info.beanmult = o_room.beanmult; //星星场倍数 info.needprepare = o_room.needprepare; //是否需要准备 info.advanced_type = o_room.advanced_type; //是否高级房间 info.advanced_teabean = o_room.advanced_teabean; //茶水费 info.infinite = o_room.infinite; //是否无限场 //房主id if (o_room.owner){ info.ownerid = o_room.owner.playerid; } else { info.ownerid = null; } //玩家列表 info.seatlist = []; for (var i = 0; i < o_room.seatlist.length; i++) { if (!o_room.seatlist[i]){ info.seatlist.push(null); } else { var p = {}; p.playerid = o_room.seatlist[i].playerid; p.nickname = o_room.seatlist[i].nickname; p.onstate = o_room.seatlist[i].onstate; //在线状态 null未连接 0在线 1离线 2电话中 p.needroomcard = o_room.seatlist[i].needroomcard; p.wasdeduct = o_room.seatlist[i].wasdeduct; p.bean = o_room.seatlist[i].bean; p.isowner = o_room.seatlist[i].gameinfo.isowner; p.isbet = o_room.seatlist[i].gameinfo.isbet; p.grade = o_room.seatlist[i].gameinfo.grade; p.isprepare = o_room.seatlist[i].gameinfo.isprepare; var _agentsvr_agent = youle_agent.agents.method.find_agent(o_room.o_game.o_agent.agentid); var _agentsvr_player = _agentsvr_agent.method.find_player(o_room.seatlist[i].playerid); p.unionid = _agentsvr_player.unionid; info.seatlist.push(p); } } return info; } }