unity3d广东麻将算法

欢迎一起学习交流
QQ:51267195
电话:18816791911 微信同号

package com.linyun.xgame.service.impl;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import org.apache.log4j.Logger;
import com.linyun.base.constant.ErrorCodeConstant;
import com.linyun.base.constant.GameConstant;
import com.linyun.base.constant.LogConstant;
import com.linyun.base.domain.CardDown;
import com.linyun.base.domain.NormalGameRecord;
import com.linyun.base.domain.Player;
import com.linyun.base.domain.SystemConfigPara;
import com.linyun.base.domain.VipGameRecord;
import com.linyun.base.domain.VipRoomRecord;
import com.linyun.base.msg.friend.BeInvitedEnterVipRoomMsg;
import com.linyun.base.msg.friend.InviteFriendEnterVipRoomMsg;
import com.linyun.base.networkbase.NetMsgBase;
import com.linyun.xgame.common.DateService;
import com.linyun.xgame.common.SpringService;
import com.linyun.xgame.common.SystemConfig;
import com.linyun.xgame.common.UUIDGenerator;
import com.linyun.xgame.constant.GameConfigConstant;
import com.linyun.xgame.domain.GameRoom;
import com.linyun.xgame.domain.GameTable;
import com.linyun.xgame.domain.ItemBase;
import com.linyun.xgame.domain.MahjongCheckResult;
import com.linyun.xgame.machine.IMachineService;
import com.linyun.xgame.machine.impl.MachineService;
import com.linyun.xgame.msg.EnterVipRoomMsg;
import com.linyun.xgame.msg.GameStartMsg;
import com.linyun.xgame.msg.PlayerGameOpertaionAckMsg;
import com.linyun.xgame.msg.PlayerGameOverMsgAck;
import com.linyun.xgame.msg.PlayerOperationNotifyMsg;
import com.linyun.xgame.msg.PlayerTableOperationMsg;
import com.linyun.xgame.msg.RequestStartGameMsgAck;
import com.linyun.xgame.msg.SearchVipRoomMsgAck;
import com.linyun.xgame.msg.TalkingInGameMsg;
import com.linyun.xgame.msg.VipRoomCloseMsg;
import com.linyun.xgame.service.ISystemConfigService;
public class GameLogicProcess {
 private static Logger logger = Logger.getLogger(GameLogicProcess.class);
 private List<GameRoom> gameRoomList = new ArrayList<GameRoom>();
 private Map<Integer, GameRoom> gameRoomMap = new HashMap<Integer, GameRoom>();
 private DBServerPlayerService playerService = null;
 private ISystemConfigService cfgService = null;
 // 麻将逻辑处理
 private MahjongProcess mjProc = new MahjongProcess();
 private IMachineService machineService = new MachineService();
 //
 private boolean showCardLog = true;
 //
 public GameLogicProcess(DBServerPlayerService ps) {
  playerService = ps;
  SystemConfig.gameLogic = this;
 }
 //
 public void init() {
 }
 // 房间配置规则在t_global表中,字段PARA_ID 2001到2050,VALUE_INT是底注,PRO_2是最小携带,PRO_3是最大携带
 // PRO_1房间类型
 //
 public void load_room_settings() {
  if (cfgService == null)
   cfgService = (ISystemConfigService) SpringService
     .getBean("sysConfigService");
  //
  for (int i = GameConfigConstant.CONF_ROOM_OF_PRIMARY; i < 2050; i++) {
   SystemConfigPara cfg = cfgService.getPara(i);
   if (cfg == null)
    continue;
   //
   GameRoom gr = new GameRoom();
   gr.price = cfg.getValueInt();// 底注
   gr.cfgId = cfg.getParaID();
   gr.maxGold = cfg.getPro_3();
   gr.minGold = cfg.getPro_2();
   gr.roomType = cfg.getPro_1();
   gr.roomID = i;
   gr.serviceFee = cfg.getPro_4();// 台费
   //
   if (gr.roomType == GameConstant.ROOM_TYPE_VIP) {
    gr.fixedGold = cfg.getPro_5(); // VIP房间固定带入金币数
   }
   //
   gameRoomList.add(gr);
   gameRoomMap.put(i, gr);
  }
 }
 // 重连回来没有色的提示
 // 不能碰自己的清楚色
 public void updateRoom(SystemConfigPara cfg) {
  if (cfg.getParaID() >= GameConfigConstant.CONF_ROOM_OF_PRIMARY
    && cfg.getParaID() < 2050) {
   boolean found = false;
   for (int i = 0; i < gameRoomList.size(); i++) {
    GameRoom gr = gameRoomList.get(i);
    //
    if (gr.cfgId == cfg.getParaID()) {
     //
     found = true;
     //
     gr.price = cfg.getValueInt();// 底注
     gr.maxGold = cfg.getPro_3();
     gr.minGold = cfg.getPro_2();
     gr.roomType = cfg.getPro_1();
     gr.serviceFee = cfg.getPro_4();// 台费
     if (gr.roomType == GameConstant.ROOM_TYPE_VIP) {
      gr.fixedGold = cfg.getPro_5(); // VIP房间固定带入金币数
     }
     //
     if (gr.price == 0)// 0的意思是把这个房间关闭
     {
      gameRoomList.remove(i);
     }
     //
     break;
    }
   }
   //
   //
   if (found == false) {
    GameRoom gr = new GameRoom();
    gr.price = cfg.getValueInt();// 底注
    gr.maxGold = cfg.getPro_3();
    gr.minGold = cfg.getPro_2();
    gr.roomType = cfg.getPro_1();
    gr.serviceFee = cfg.getPro_4();// 台费
    if (gr.roomType == GameConstant.ROOM_TYPE_VIP) {
     gr.fixedGold = cfg.getPro_5(); // VIP房间固定带入金币数
    }
    //
    if (gr.price > 0)// 0的意思是把这个房间关闭
    {
     gameRoomList.add(gr);
    }
   }
  }
 }
 //
 public GameTable popFreeTable() {
  GameTable gt = new GameTable();
  //
  return gt;
 }
 //
 //
 public GameRoom getRoom(int roomID) {
  return gameRoomMap.get(roomID);
 }
 public int getRoomPlayerNum(int roomID) {
  GameRoom gr = gameRoomMap.get(roomID);
  if (gr != null)
   return gr.getPlayerNum();
  return 0;
 }
 //
 public int getRoomPlayerNumByType(int type) {
  return 0;
 }
 public int getPlayerVipTableID(Player pl) {
  int roomID = pl.getRoomID();
  GameRoom gr = getRoom(roomID);
  if (gr == null)
   return 0;
  GameTable gt = gr.getTable(pl.getTableID(), false);
  if (gt == null) {
   return 0;
  }
  if (gt.isVipTable()) {
   return gt.getVipTableID();
  }
  return 0;
 }
 /** 客户端通知服务器,游戏结束,玩家继续游戏* */
 public void game_continue(Player pl) {
  // 返回给玩家,
  RequestStartGameMsgAck ack = new RequestStartGameMsgAck();
  ack.gold = pl.getGold();
  int roomID = pl.getRoomID();
  GameRoom gr = getRoom(roomID);
  if (gr == null)
   return;
  if (GameConstant.ROOM_TYPE_VIP != gr.roomType) {
   // 校验金币
   if (pl.getGold() < gr.minGold) {
    // 返回给玩家,
    RequestStartGameMsgAck Error_ack = new RequestStartGameMsgAck();
    Error_ack.gold = pl.getGold();
    Error_ack.result = ErrorCodeConstant.GOLD_LOW_THAN_MIN_LIMIT;
    // 进入桌子失败
    Error_ack.sessionID = pl.getPlayerLobbySessionID();
    SystemConfig.gameSocketServer.sendMsg(pl.getSession(),
      Error_ack);
    return;
   } else if (pl.getGold() > gr.maxGold) {
    // 返回给玩家,
    RequestStartGameMsgAck Error_ack = new RequestStartGameMsgAck();
    Error_ack.gold = pl.getGold();
    Error_ack.result = ErrorCodeConstant.GOLD_HIGH_THAN_MAX_LIMIT;
    // 进入桌子失败
    Error_ack.sessionID = pl.getPlayerLobbySessionID();
    SystemConfig.gameSocketServer.sendMsg(pl.getSession(),
      Error_ack);
    return;
   }
  }
  //
  GameTable gt = gr.getTable(pl.getTableID(), false);
  if (gt == null) {
   // 重新进新桌吧,老桌子没了
   // System.out.println("继续游戏:"+pl.getPlayerName()+"重新进新桌吧,老桌子没了");
   this.enter_room(pl, roomID);
   return;
  }
  ack.createPlayerID = gt.getCreatorPlayerID();
  // 玩家的状态必须是在等待继续状态
  if (pl.getGameState() != GameConstant.PALYER_GAME_STATE_IN_TABLE_GAME_OVER_WAITING_TO_CONTINUE)
   return;
  // 如果VIP房间的圈数用完了,就不能继续了
  if ((GameConstant.ROOM_TYPE_VIP == gr.roomType)
    && (gt.isVipTableTimeOver())) {
   ack.result = ErrorCodeConstant.VIP_TABLE_IS_GAME_OVER; // VIP桌子已经结束
   ack.sessionID = pl.getPlayerLobbySessionID();
   SystemConfig.gameSocketServer.sendMsg(pl.getSession(), ack);
   return;
  }
  //
  pl.setGameState(GameConstant.PALYER_GAME_STATE_IN_TABLE_READY);
  //
  ack.result = ErrorCodeConstant.CMD_EXE_OK;
  //
  ack.init_players(gt.getPlayers(), gt.isVipTable());
  //
  ack.gold = pl.getGold();
  //
  if (gt.isVipTable()) {
   ack.totalHand = gt.getHandsTotal();
   ack.vipTableID = gt.getVipTableID();
   ack.createPlayerID = gt.getCreatorPlayerID();
   ack.currentHand = gt.getHandNum();
  } else
   ack.vipTableID = 0;
  //
  ack.roomID = roomID;
  // ack.tablePos=pl.getTablePos();
  ack.tablePos = pl.getTablePos() | (gt.getMaxPlayer() << 16);
  //
  ack.newPlayWay = gt.getVip_rule();
  //
  // 进入桌子,返回消息给玩家
  ack.sessionID = pl.getPlayerLobbySessionID();
  SystemConfig.gameSocketServer.sendMsg(pl.getSession(), ack);
  //
  // 给桌子上的其他玩家发个进入新玩家的消息
  PlayerGameOpertaionAckMsg axk = new PlayerGameOpertaionAckMsg();
  axk.opertaionID = GameConstant.GAME_OPERTAION_TABLE_ADD_NEW_PLAYER;
  axk.playerName = pl.getPlayerName();
  axk.targetPlayerName = pl.getHeadImageUrl();
  //
  if (gt.isVipTable())
   axk.gold = pl.getVipTableGold();
  else
   axk.gold = pl.getGold();
  //
  axk.headImg = pl.getHeadImg();
  axk.sex = pl.getSex();
  axk.tablePos = pl.getTablePos();
  axk.playerID = pl.getPlayerID();
  axk.playerIndex = pl.getPlayerIndex();
  axk.canFriend = pl.getCanFriend();
  axk.ip = pl.getClientIP();
  axk.sessionID = pl.getPlayerLobbySessionID();
  axk.opValue = gt.getMaxPlayer();
  this.sendMsgToTableExceptMe(gt, axk, pl.getPlayerID());
  
  try_Closevip(gt,pl);
 }
 
 private void try_Closevip(GameTable gt,Player pl){
  if(gt.isVipTable()){
   if(gt.getClearCloseVipRoomMapSize() > 0 && gt.getClearCloseVipRoomMapSize() < gt.getMaxPlayer()){
    for(Player gp: gt.getPlayers()){
     if(!gt.containVipRoomCloseRequester(gp.getPlayerID())){
      PlayerGameOpertaionAckMsg msgx = new PlayerGameOpertaionAckMsg();
      msgx.playerName = pl.getPlayerName();
      msgx.opertaionID = GameConstant.MAHJONG_OPERTAION_WAITING_OR_CLOSE_VIP;
      msgx.playerIndex = pl.getPlayerIndex();
    
      msgx.sessionID = pl.getPlayerLobbySessionID();
      SystemConfig.gameSocketServer.sendMsg(gp.getSession(), msgx);
     }
    }
   }
  }
 }
 //
 private void player_recover(GameTable gt, Player pl) {
  // 如果没有手牌,游戏还没开始,不能发GameStartMsg消息,否则游戏界面没有手牌
  if (0 == pl.getCardNumInHand()) {
   return;
  }
  // 把牌发给玩家
  GameStartMsg msg = new GameStartMsg();
  msg.myTablePos = pl.getTablePos();
  msg.myCards = pl.getCardsInHand();
  msg.newPlayWay = gt.getVip_rule();
  //
  Player pl0 = gt.getPlayerAtIndex(0);
  if (pl0 != null) {
   msg.player0Cards = pl0.getCardsBefore();
   msg.player0CardsDown = pl0.getCardsDown();
   msg.player0WinLoseEqual = pl0.getTotalBattles();
   msg.player0Win = pl0.getDiamond();
   msg.player0Buhua = pl0.getHuaValue();
   msg.baibannum0 = pl0.getBaibanhua();
  }
  Player pl1 = gt.getPlayerAtIndex(1);
  if (pl1 != null) {
   msg.player1Cards = pl1.getCardsBefore();
   msg.player1CardsDown = pl1.getCardsDown();
   msg.player1WinLoseEqual = pl1.getTotalBattles();
   msg.player1Win = pl1.getDiamond();
   msg.player1Buhua = pl1.getHuaValue();
   msg.baibannum1 = pl1.getBaibanhua();
  }
  //
  msg.dealerPos = gt.getDealerPos();
  msg.quanNum = gt.getHandNum();// gt.getQuanNum();
  // 是否听牌
  List<Player> players = gt.getPlayers();
  for (int i = 0; i < players.size(); i++) {
   Player pxx = gt.getPlayerAtIndex(i);
   if (pxx == null)
    continue;
   // 胡牌标志
   if (pxx.isHuuuuued()) {
    int huCd = pxx.getHuCard() & 0xff;
    msg.tingPlayers |= (huCd << (i * 8));
   }
   //
   // 是否离线
   if ((pxx.getOnTable() == false) || (pxx.isOnline() == false)) {
    msg.OffLinePlayers |= (1 << (i * 8));
   }
   // 设置金币
   if (pxx != null) {
    int ipt = pxx.getTablePos();
    if (gt.isVipTable()) {
     if (ipt == 0)
      msg.player0Gold = pxx.getVipTableGold();
     else if (ipt == 1)
      msg.player1Gold = pxx.getVipTableGold();
     else if (ipt == 2)
      msg.player2Gold = pxx.getVipTableGold();
     else if (ipt == 3)
      msg.player3Gold = pxx.getVipTableGold();
    } else {
     if (ipt == 0)
      msg.player0Gold = pxx.getGold();
     else if (ipt == 1)
      msg.player1Gold = pxx.getGold();
     else if (ipt == 2)
      msg.player2Gold = pxx.getGold();
     else if (ipt == 3)
      msg.player3Gold = pxx.getGold();
    }
   }
  }
  //
  Player pl2 = gt.getPlayerAtIndex(2);
  if (pl2 != null) {
   msg.player2Cards = pl2.getCardsBefore();
   msg.player2CardsDown = pl2.getCardsDown();
   msg.player2WinLoseEqual = pl2.getTotalBattles();
   msg.player2Win = pl2.getDiamond();
   msg.player2Buhua = pl2.getHuaValue();
   msg.baibannum2 = pl2.getBaibanhua();
  }
  Player pl3 = gt.getPlayerAtIndex(3);
  if (pl3 != null) {
   msg.player3Cards = pl3.getCardsBefore();
   msg.player3CardsDown = pl3.getCardsDown();
   msg.player3WinLoseEqual = pl3.getTotalBattles();
   msg.player3Win = pl3.getDiamond();
   msg.player3Buhua = pl3.getHuaValue();
   msg.baibannum3 = pl3.getBaibanhua();
  }
  //
  msg.chuCardPlayerIndex = gt.getCardOpPlayerIndex();
  msg.chuCard = gt.getCurrentCard() & 0xff;
  msg.serviceGold = gt.getHandsTotal();
  msg.baoCard = gt.getBaoCard();
  msg.baoCard |= (gt.getBaoCard2() << 8);
  //
  msg.sessionID = pl.getPlayerLobbySessionID();
  SystemConfig.gameSocketServer.sendMsg(pl.getSession(), msg);
 }
 //
 public void inviteFriend(InviteFriendEnterVipRoomMsg msg, Player pl) {
  Player friend = playerService.getPlayerByPlayerID(msg.playerID);
  if (friend == null)
   return;
  //
  GameRoom gr = getRoom(msg.roomID);
  if (gr == null)
   return;
  //
  GameTable gt = gr.getVipTableByVipTableID(msg.vipTableID);
  if (gt == null)
   return;
  //
  // 只有房主可以邀请
  if (gt.getCreatorPlayerID().equals(pl.getPlayerID())) {
   //
   BeInvitedEnterVipRoomMsg msx = new BeInvitedEnterVipRoomMsg();
   msx.tableID = gt.getTableID();
   msx.playerID = pl.getPlayerID();
   msx.roomID = msg.roomID;
   msx.vipTableID = msg.vipTableID;
   msx.password = gt.getVipPswMd5();
   //
   msx.sessionID = friend.getPlayerLobbySessionID();
   SystemConfig.gameSocketServer.sendMsg(friend.getSession(), msx);
  }
 }
 //
 public void enterVipRoom(EnterVipRoomMsg msg, Player pl) {
  GameRoom rm = null;
  GameTable gt = null;
  //
  if (msg.tableID.equals("enter_room")) {
   int vip_table_id = msg.roomID;
   msg.roomID = 2002;
   //
   rm = gameRoomMap.get(2002);
   gt = rm.getVipTableByVipTableID(vip_table_id);
  } else {
   rm = gameRoomMap.get(msg.roomID);
   if (rm == null) {
    logger.error("enterVipRoom,rm==null, playerIndex="
      + pl.getPlayerIndex());
    return;
   }
   //
   gt = rm.getTable(msg.tableID, false);
  }
  //
  if (gt == null) {
   RequestStartGameMsgAck ack = new RequestStartGameMsgAck();
   ack.gold = pl.getGold();
   //
   ack.result = ErrorCodeConstant.VIP_TABLE_NOT_FOUND;
   // 进入桌子,返回消息给玩家
   ack.sessionID = pl.getPlayerLobbySessionID();
   SystemConfig.gameSocketServer.sendMsg(pl.getSession(), ack);
   logger.error("enterVipRoom,gt==null, playerIndex="
     + pl.getPlayerIndex());
   return;
  }
  if (gt.isVipTable()) {
   if (!gt.isPayVipKa()) {
    int diamond_need = playerService.getTableDiamondCost(gt
      .getBaseHandsTotal());
    if (false == playerService.preuse_fanka(pl, diamond_need))
     return;
   }
  }
  // 现在不校验密码
  // 密码错误
  // if(gt.getVipPswMd5().equals(msg.psw)==false)
  // {
  // RequestStartGameMsgAck ack=new RequestStartGameMsgAck();
  // ack.gold=pl.getGold();
  // //
  // ack.result=ErrorCodeConstant.WRONG_PASSWORD;
  // //进入桌子,返回消息给玩家
  // ack.sessionID=pl.getPlayerLobbySessionID();
  // SystemConfig.gameSocketServer.sendMsg(pl.getSession(), ack);
  // return;
  // }
  //
  gt.setDizhu(rm.price);
  //
  int old_tablePos = gt.findPlayerIndex(pl);
  boolean old_table = false;
  if (old_tablePos >= 0)// 已经存在,离开又进来
  {
   old_table = true;
   //
   pl.setTableID(gt.getTableID());
   pl.setVipTableID(gt.getTableID());
  } else {
   if (gt.isFull()) {
    RequestStartGameMsgAck ack = new RequestStartGameMsgAck();
    ack.gold = pl.getGold();
    //
    ack.result = ErrorCodeConstant.VIP_TABLE_IS_FULL;
    // 进入桌子,返回消息给玩家
    ack.sessionID = pl.getPlayerLobbySessionID();
    SystemConfig.gameSocketServer.sendMsg(pl.getSession(), ack);
    return;
   }
   // 新玩家进来,设置VIP房间金币
   // if(pl.getVipTableGold() <= 0)
   // {
   // GameRoom gr=getRoom(gt.getRoomID());
   // if( (gr!=null) && (gr.roomType == GameConstant.ROOM_TYPE_VIP))
   // {
   // pl.setVipTableGold(gr.fixedGold);
   // }
   // }
   gt.enterTable(pl);
  }
  // 如等待玩家中,满了就开始,如果中间断线再进入,就不要这个状态切换
  if (gt.isFull()
    && gt.getState() == GameConstant.GAME_TABLE_STATE_WAITING_PLAYER) {
   gt.setState(GameConstant.GAME_TABLE_STATE_READY_GO);
  }
  //
  pl.setRoomID(msg.roomID);
  pl.setTableID(gt.getTableID());
  pl.setVipTableID(gt.getTableID());
  //
  boolean re_enter = false;
  if (old_table && gt.isFull())
   re_enter = true;
  enter_table_done(pl, gt, re_enter);
 }
 //
 // vip开房间,在服务器理解为创建一个vip桌子
 public void create_vip_table(Player pl, String psw, int quanNum,
   int roomID, int vip_rule) {
  GameRoom rm = gameRoomMap.get(roomID);
  if (rm == null)
   return;
  String vip_tb_id = pl.getVipTableID();
  if (vip_tb_id != null && vip_tb_id.length() > 1
    && rm.getPlayingTablesMap().containsKey(vip_tb_id)) {
   logger.error("player index:" + pl.getPlayerIndex() + ",md5:" + psw
     + ",ordin vip_rule:" + vip_rule + ",vip tableid:"
     + pl.getVipTableID());
   return;
  }
  // vip默认具有的打法,毋须客户端配置
  int default_rule = rm.get_default_vip_table_rule(SystemConfig.mjType);
  //
  vip_rule |= default_rule;
  
  
  int personNum = 4;
  if ((vip_rule & GameConstant.GAME_PLAY_2_PERSON) != 0) {
   personNum = 2;
  } else if ((vip_rule & GameConstant.GAME_PLAY_3_PERSON) != 0) {
   personNum = 2;
  }
  //
  GameTable gt = rm.createVipTable(psw, pl, personNum);
  if (gt == null)
   return;
  //
  gt.setBaseHandsTotal(quanNum);
  logger.info("tableid=" + gt.getTableID() + ",hands=" + quanNum);
  gt.setVip_rule(vip_rule);
  //
  if (gt.has_vip_rule(GameConstant.GAME_PLAY_2_PERSON))
   gt.setMaxPlayer(2);
  else if (gt.has_vip_rule(GameConstant.GAME_PLAY_3_PERSON))
   gt.setMaxPlayer(2);
  else
   gt.setMaxPlayer(4);

  //
  Date ct = DateService.getCurrentUtilDate();
  gt.setVipCreateTime(ct.getTime());
  // 总圈数
  gt.setHandsTotal(quanNum);
  //
  // 设置为未支付房卡
  gt.setPayVipKa(false);
  // 设置VIP房间带入金额
  pl.setVipTableGold(0);
  pl.setOnTable(true);
  //
  // 返回给玩家,
  RequestStartGameMsgAck ack = new RequestStartGameMsgAck();
  ack.gold = pl.getGold();
  ack.totalHand = gt.getHandsTotal();
  ack.currentHand = gt.getHandNum();
  //
  ack.newPlayWay = gt.getVip_rule();
  //
  ack.result = ErrorCodeConstant.CMD_EXE_OK;
  //
  ack.init_players(gt.getPlayers(), gt.isVipTable());
  //
  ack.roomID = roomID;
  // ack.tablePos=pl.getTablePos();
  ack.tablePos = pl.getTablePos() | (gt.getMaxPlayer() << 16);
  //
  ack.vipTableID = gt.getVipTableID();
  ack.creatorName = gt.getCreatorPlayerName();
  ack.createPlayerID = gt.getCreatorPlayerID();
  // 进入桌子,发消息给玩家
  ack.sessionID = pl.getPlayerLobbySessionID();
  SystemConfig.gameSocketServer.sendMsg(pl.getSession(), ack);
  //
  // System.out.println("vip table id="+gt.getVipTableID());
  // 测试允许机器人进入vip
  // machineService.newset_machinetime(pl,gt);
  /*
   * //在游戏开始的时候4个人一起创建,因为房间有可能没开始游戏就解散了 //创建一条vip房间记录 VipRoomRecord
   * vrr=new VipRoomRecord();
   * vrr.setStartTime(DateService.getCurrentUtilDate());
   * vrr.setRoomID(gt.getTableID()); vrr.setRoomIndex(gt.getVipTableID());
   * vrr.setPlayer1ID(pl.getPlayerID()); //
   * vrr.setHostName(pl.getPlayerName()); //
   * vrr.setRecordID(UUIDGenerator.generatorUUID()); //
   * playerService.createVipRoomRecord(vrr); // pl.setVrr(vrr);
   */
 }
 // 看看是否有老桌需要他进去,牌局未结束,不能离开
 private boolean enter_old_table(Player pl) {
  int roomID = pl.getRoomID();
  GameRoom rm = gameRoomMap.get(roomID);
  if (rm == null)
   return false;
  GameTable gt = rm.getTable(pl.getTableID(), pl.isPlayingSingleTable());
  if (gt != null
    && /* (gt.getState()==GameConstant.GAME_TABLE_STATE_PAUSED) && */(gt
      .findPlayerIndex(pl) >= 0)) {
   if ((gt.getState() == GameConstant.GAME_TABLE_STATE_WAITING_PALYER_TO_CONTINUE || gt
     .getState() != GameConstant.GAME_TABLE_STATE_WAITING_PLAYER)) {
    if (!validatePlayerGold(rm, pl))
     return false;
   }
   enter_table_done(pl, gt, true);
   return true;
  }
  return false;
 }
 //
 public void enter_room(Player pl, int roomID) {
  // 重置异常标志
  pl.setNeedCopyGameState(false);
  // 当前正在vip房间中,不能进其他房间,自动进vip房
  if (pl.getVipTableID().length() > 0) {
   GameRoom rm = gameRoomMap.get(pl.getRoomID());
   if (rm == null)
    return;
   GameTable gt = rm.getTable(pl.getTableID(), false);
   if (gt != null) {
    EnterVipRoomMsg mxg = new EnterVipRoomMsg();
    mxg.tableID = gt.getTableID();
    mxg.psw = gt.getVipPswMd5();
    mxg.roomID = pl.getRoomID();
    enterVipRoom(mxg, pl);
    return;
   }
  }
  GameRoom rm = gameRoomMap.get(roomID);
  // 看看是否进老桌子
  if (enter_old_table(pl)) {
   return;
  } else {
   // 看看是否还在桌子上
   List<GameTable> oldTables = this.getPlayingTables(pl
     .getPlayerIndex());
   if (oldTables != null && oldTables.size() >= 1) {
    // 还在老桌子中
    GameTable oldTable = oldTables.get(0);
    if (oldTable != null) {
     // logger.error("玩家:" + pl.getPlayerIndex() +
     // ",断线重连,遍历房间才找到老桌子,roomID=" + oldTable.getRoomID());
     pl.setRoomID(oldTable.getRoomID());
     pl.setTableID(oldTable.getTableID());
     pl.setNeedCopyGameState(true); // 玩家数据异常需要恢复游戏数据
     if (oldTable.isVipTable()) {
      pl.setVipTableID(oldTable.getTableID());
      // VIP房间处理
      EnterVipRoomMsg mxg = new EnterVipRoomMsg();
      mxg.tableID = oldTable.getTableID();
      mxg.psw = oldTable.getVipPswMd5();
      mxg.roomID = pl.getRoomID();
      enterVipRoom(mxg, pl);
      return;
     }
    }
   }
   // 校验金币是否足够
   if (!validatePlayerGold(rm, pl))
    return;
  }
  // 判断今日输赢是否已达到上限
  if (cfgService == null)
   cfgService = (ISystemConfigService) SpringService
     .getBean("sysConfigService");
  if (Math.abs(pl.getTodayRecordByRoomType(rm.roomType)) >= cfgService
    .getRoomMaxWinLose(rm.roomType)) {
   // 已达到场次输赢上限
   RequestStartGameMsgAck ack = new RequestStartGameMsgAck();
   ack.gold = cfgService.getRoomMaxWinLose(rm.roomType);
   ack.result = ErrorCodeConstant.TODAY_GAME_RECORD_OUT_LIMIT_IN_ROOM;
   // 进入桌子失败
   ack.sessionID = pl.getPlayerLobbySessionID();
   SystemConfig.gameSocketServer.sendMsg(pl.getSession(), ack);
   return;
  } else if (Math.abs(pl.getTodayRecordCount()) >= cfgService
    .getMaxWinLoseEveryDay()) {
   // 达到个人输赢上限
   RequestStartGameMsgAck ack = new RequestStartGameMsgAck();
   ack.gold = cfgService.getMaxWinLoseEveryDay();
   ack.result = ErrorCodeConstant.TODAY_GAME_RECORD_OUT_LIMIT_IN_GAME;
   // 进入桌子失败
   ack.sessionID = pl.getPlayerLobbySessionID();
   SystemConfig.gameSocketServer.sendMsg(pl.getSession(), ack);
   return;
  }
  //
  GameTable gt = rm.enterRoom(pl, SystemConfig.mjType);
  enter_table_done(pl, gt, false);
  //
  machineService.newset_machinetime(pl, gt);
 }
 public boolean validatePlayerGold(GameRoom rm, Player pl) {
  if (rm == null)
   return false;
  if (cfgService == null)
   cfgService = (ISystemConfigService) SpringService
     .getBean("sysConfigService");
  //
  // 进新桌,需要校验金币
  int minGold = rm.minGold;
  // 如果是进入VIP房间,只要校验完金币就可以了
  if (rm.roomType == GameConstant.ROOM_TYPE_VIP) {
   // 返回给玩家,
   RequestStartGameMsgAck ack = new RequestStartGameMsgAck();
   ack.gold = pl.getGold();
   ack.roomID = rm.roomID;
   ack.result = ErrorCodeConstant.CAN_ENTER_VIP_ROOM;
   //
   // 可以进入VIP房间
   ack.sessionID = pl.getPlayerLobbySessionID();
   SystemConfig.gameSocketServer.sendMsg(pl.getSession(), ack);
   return false;
  }
  if (pl.getGold() < minGold) {
   // 返回给玩家,
   RequestStartGameMsgAck ack = new RequestStartGameMsgAck();
   ack.gold = pl.getGold();
   ack.result = ErrorCodeConstant.GOLD_LOW_THAN_MIN_LIMIT;
   // 进入桌子失败
   ack.sessionID = pl.getPlayerLobbySessionID();
   SystemConfig.gameSocketServer.sendMsg(pl.getSession(), ack);
   return false;
  } else if (pl.getGold() > rm.maxGold) {
   // 返回给玩家,
   RequestStartGameMsgAck ack = new RequestStartGameMsgAck();
   ack.gold = pl.getGold();
   ack.result = ErrorCodeConstant.GOLD_HIGH_THAN_MAX_LIMIT;
   // 进入桌子失败
   ack.sessionID = pl.getPlayerLobbySessionID();
   SystemConfig.gameSocketServer.sendMsg(pl.getSession(), ack);
   return false;
  }
  return true;
 }
 //
 private void re_notify_current_operation_player(GameTable gt) {
  // 1先看看有没有吃碰杠提示的玩家
  MahjongCheckResult result = gt.getWaitingPlayerOperate();
  if (result != null) {
   Player plx = gt.getPlayerAtIndex(result.playerTableIndex);
   if (plx != null) {
    //
    PlayerOperationNotifyMsg msg = new PlayerOperationNotifyMsg();
    // 提示玩家出牌
    msg.operation = result.opertaion;
    msg.player_table_pos = result.playerTableIndex;
    msg.chi_card_value = result.chi_card_value;
    if (((msg.operation & GameConstant.MAHJONG_OPERTAION_CHU) == GameConstant.MAHJONG_OPERTAION_CHU)
      && (plx.getCardGrab() != 0)) {
     msg.chi_card_value = plx.getCardGrab(); // 新摸到的牌
    }
    msg.peng_card_value = result.peng_card_value;
    msg.target_card = result.targetCard;
    msg.tingList = result.tingList;
    msg.gangList = result.gangList;
    msg.chi_flag = result.chi_flag;
    msg.cardLeftNum = gt.getCardLeftNum();
    //
    msg.sessionID = plx.getPlayerLobbySessionID();
    // SystemConfig.gameSocketServer.sendMsg(plx.getSession(), msg);
    this.sengMsgToPlayer(gt, plx, msg);
    //
    // 发给其他玩家,让他们知道当前轮到谁操作
    PlayerOperationNotifyMsg msg2 = new PlayerOperationNotifyMsg();
    msg2.operation = GameConstant.MAHJONG_OPERTAION_TIP;
    msg2.cardLeftNum = gt.getCardLeftNum();
    msg2.player_table_pos = plx.getTablePos();
    this.sendMsgToTable(gt, msg2);
   }
  } else {
   // 没有吃碰听,那就当前玩家出牌
   player_chu_notify(gt, true, true);
  }
 }
 //
 // 离开重新进入
 private void player_re_enter(Player pl, GameTable gt) {
  // 恢复状态
  if (gt.getBackup_state() == GameConstant.GAME_TABLE_STATE_WAITING_PALYER_TO_CONTINUE) {
   pl.setGameState(GameConstant.PALYER_GAME_STATE_IN_TABLE_READY);
   // 给桌子上的其他玩家发个进入新玩家的消息
   PlayerGameOpertaionAckMsg axk = new PlayerGameOpertaionAckMsg();
   axk.opertaionID = GameConstant.GAME_OPERTAION_TABLE_ADD_NEW_PLAYER;
   axk.playerName = pl.getPlayerName();
   axk.targetPlayerName = pl.getHeadImageUrl();
   if (gt.isVipTable()) {
    axk.gold = pl.getVipTableGold();
   } else {
    axk.gold = pl.getGold();
   }
   axk.headImg = pl.getHeadImg();
   axk.sex = pl.getSex();
   axk.tablePos = pl.getTablePos();
   axk.playerID = pl.getPlayerID();
   axk.playerIndex = pl.getPlayerIndex();
   axk.canFriend = pl.getCanFriend();
   axk.ip = pl.getClientIP();
   axk.sessionID = pl.getPlayerLobbySessionID();
   axk.opValue = gt.getMaxPlayer();
   this.sendMsgToTableExceptMe(gt, axk, pl.getPlayerID());
  } else {
   pl.setGameState(GameConstant.PALYER_GAME_STATE_IN_TABLE_PLAYING);
   // 给桌子上的其他玩家发个玩家上线的消息
   PlayerOperationNotifyMsg axk = new PlayerOperationNotifyMsg();
   axk.operation = GameConstant.MAHJONG_OPERTAION_ONLINE;
   axk.player_table_pos = pl.getTablePos();
   axk.sessionID = pl.getPlayerLobbySessionID();
   this.sendMsgToTableExceptMe(gt, axk, pl.getPlayerID());
  }
  // 取消托管
  pl.setAutoOperation(0);
  // 发送断线重连消息
  player_recover(gt, pl);
  // 看看桌子上玩家是否都已经到齐
  gt.pauseContinue();
  // 打印所有玩家的状态
  // logger.info("玩家:" + pl.getPlayerIndex() + "断线重回,房间ID:" +
  // gt.getRoomID() + ",桌子状态:" + gt.getState() + ",前一个状态:" +
  // gt.getBackup_state());
  // for(Player onePl:gt.getPlayers())
  // {
  // logger.info("玩家ID:" + onePl.getPlayerIndex() + " 状态:" +
  // onePl.getGameState());
  // }
  if (gt.getState() == GameConstant.GAME_TABLE_STATE_PLAYING) {
   // 断线回来,如果当前桌子子状态为0,说明没有等待状态,直接提示当前玩家行动
   if (gt.getPlaySubstate() == 0)//
   {
    // 通知玩家行动
    re_notify_current_operation_player(gt);
   } else {
    // 否则就把等待时间设置为当前,系统等待一定时间后,提示玩家进行应该进行的动作,比如有玩家吃碰等
    Date dt = DateService.getCurrentUtilDate();
    gt.setWaitingStartTime(dt.getTime());
   }
  }
  //
  // System.out.println("back:"+pl.getPlayerName()+",player
  // num="+gt.getPlayers().size());
  
  try_Closevip(gt,pl);
 }
 //
 private void enter_table_done(Player pl, GameTable gt, boolean re_enter) {
  // 玩家坐在桌子上
  pl.setOnTable(true);
  pl.setAutoOperation(0);
  RequestStartGameMsgAck ack = new RequestStartGameMsgAck();
  ack.totalHand = gt.getHandsTotal();
  ack.currentHand = gt.getHandNum();
  if (gt.getState() == GameConstant.GAME_TABLE_STATE_WAITING_PALYER_TO_CONTINUE) {
   pl.setGameState(GameConstant.PALYER_GAME_STATE_IN_TABLE_READY);
   // gt.set_not_ready_player_ready();
  } else if (gt.getState() == GameConstant.GAME_TABLE_STATE_PAUSED) {
   if (gt.getBackup_state() == GameConstant.GAME_TABLE_STATE_WAITING_PALYER_TO_CONTINUE) {
    pl.setGameState(GameConstant.PALYER_GAME_STATE_IN_TABLE_READY);
   } else {
    pl
      .setGameState(GameConstant.PALYER_GAME_STATE_IN_TABLE_PLAYING);
   }
  }
  //
  ack.result = ErrorCodeConstant.CMD_EXE_OK;
  //
  ack.init_players(gt.getPlayers(), gt.isVipTable());
  //
  ack.gold = pl.getGold();
  //
  ack.roomID = pl.getRoomID();
  // ack.tablePos=pl.getTablePos();
  ack.tablePos = pl.getTablePos() | (gt.getMaxPlayer() << 16);
  ack.newPlayWay = gt.getVip_rule();
  GameRoom gr = getRoom(gt.getRoomID());
  if ((gr != null) && (gr.roomType == GameConstant.ROOM_TYPE_VIP)) {
   ack.vipTableID = gt.getVipTableID();
  }
  ack.creatorName = gt.getCreatorPlayerName();
  ack.createPlayerID = gt.getCreatorPlayerID();
  //
  // Date ct=DateService.getCurrentUtilDate();
  // 进入桌子,返回消息给玩家
  ack.sessionID = pl.getPlayerLobbySessionID();
  SystemConfig.gameSocketServer.sendMsg(pl.getSession(), ack);
  //
  if (re_enter
    && (gt.getState() != GameConstant.GAME_TABLE_STATE_WAITING_PALYER_TO_CONTINUE/*
                         * ||
                         * gt.isVipTable()
                         */))// 断线返回,VIP房间在结算的时候断线回来要走下面的分支
  {
   player_re_enter(pl, gt);
  } else {
   // 设置VIP房间带入金额
   // if( (gr!=null) && (gr.roomType == GameConstant.ROOM_TYPE_VIP) &&
   // (pl.getVipTableGold() <= 0))
   // {
   // pl.setVipTableGold(gr.fixedGold);
   // }
   // 给桌子上的其他玩家发个进入新玩家的消息
   PlayerGameOpertaionAckMsg axk = new PlayerGameOpertaionAckMsg();
   axk.opertaionID = GameConstant.GAME_OPERTAION_TABLE_ADD_NEW_PLAYER;
   axk.playerName = pl.getPlayerName();
   axk.targetPlayerName = pl.getHeadImageUrl();
   if (gt.isVipTable()) {
    axk.gold = pl.getVipTableGold();
   } else {
    axk.gold = pl.getGold();
   }
   axk.headImg = pl.getHeadImg();
   axk.sex = pl.getSex();
   axk.tablePos = pl.getTablePos();
   axk.playerID = pl.getPlayerID();
   axk.playerIndex = pl.getPlayerIndex();
   axk.canFriend = pl.getCanFriend();
   axk.ip = pl.getClientIP();
   axk.sessionID = pl.getPlayerLobbySessionID();
   axk.opValue = gt.getMaxPlayer();
   this.sendMsgToTableExceptMe(gt, axk, pl.getPlayerID());
   //
   // System.out.println("enter:"+pl.getPlayerName()+",player
   // num="+gt.getPlayers().size());
  }
 }
 // 游戏循环
 public void run_one_loop() {
  if (cfgService == null)
   cfgService = (ISystemConfigService) SpringService
     .getBean("sysConfigService");
  // System.out.println("房间数量:"+gameRooms.size());
  for (Integer rid : gameRoomMap.keySet()) {
   GameRoom gr = gameRoomMap.get(rid);
   game_room_tick(gr);
  }
 }
 //
 public void use_item(Player pl, ItemBase ib) {
 }
 //
 //
 public void player_left_table(Player pl) {
  if (pl == null)
   return;
  GameRoom gr = this.getRoom(pl.getRoomID());
  if (gr == null)
   return;
  //
  GameTable gt = gr.getTable(pl.getTableID(), pl.isPlayingSingleTable());
  if (gt == null) {
   return;
  }
  // 玩家不在桌子上
  pl.setOnTable(false);
  //
  if (gt.couldLeft(pl)) {
   //
   boolean found = gt.removePlayer(pl.getPlayerID());
   if (pl.isRobot()) {
    machineService.death_machine(pl.getPlayerIndex());
   }
   // if(gt.isAllRobot()){
   // gt.remove_robots_table();
   // death_machine(gt);
   // }
   //
   if (found) {
    gr.setPlayerNum(gr.getPlayerNum() - 1);
    gt.addFreePos(pl.getTablePos());
   }
   // 如果vip离开桌子,全部清理
   if (gt.isVipTable()
     && pl.getPlayerID().equals(gt.getCreatorPlayerID())) {
    PlayerGameOpertaionAckMsg axk = new PlayerGameOpertaionAckMsg();
    axk.opertaionID = GameConstant.GAME_OPERTAION_ROOM_DISMISS;
    axk.sessionID = pl.getPlayerLobbySessionID();
    this.sendMsgToTableExceptMe(gt, axk, pl.getPlayerID());
    //
    gt.clear_all();
   }
   //
   if (gt.getPlayerNum() > 0) {
    // 如果还有玩家,通知他们有玩家离开
    if (found) {
     PlayerGameOpertaionAckMsg axk = new PlayerGameOpertaionAckMsg();
     axk.opertaionID = GameConstant.GAME_OPERTAION_PLAYER_LEFT_TABLE;
     axk.playerName = pl.getPlayerName();
     axk.gold = pl.getGold();
     axk.headImg = pl.getHeadImg();
     axk.sex = pl.getSex();
     axk.playerID = pl.getPlayerID();
     axk.playerIndex = pl.getPlayerIndex();
     axk.canFriend = pl.getCanFriend();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值