Example #1
0
 private void CommandHandle_SelectFreePosition(IPEndPoint remoteIp, NetInputData package)
 {
     Monitor.Enter(netPlayerList);
     try
     {
         //检测是否在选位列表内
         int listIndex = FindPlayerFromSelectList(remoteIp);
         if (listIndex == -1)
         {
             this.Send(remoteIp, NetInputData.Create_Command_SelectFreePositionErr());
             return;
         }
         int selectpositionindex = package.Command_SelectFreePosition_SelectPosition;
         int positionInfo        = AccountSelectPositionInfo();
         //这个位置已经被占用
         if ((positionInfo & (1 << selectpositionindex)) == (1 << selectpositionindex))
         {
             this.Send(remoteIp, NetInputData.Create_Command_SelectPositionCantUse());
             return;
         }
         //标记这个位置占用
         SelectPositionData data = selectPositionList[listIndex];
         data.selectPosition           = selectpositionindex;
         selectPositionList[listIndex] = data;
         //通知客户端选择这个位置成功了
         NetInputData retpackage = package.Clone();
         retpackage.Command = NetInputData.NetCommand.Command_SelectFreePositionReback;
         this.Send(remoteIp, retpackage);
         //把新的信息同步给所有选位客户端
         retpackage = NetInputData.Create_Command_UpdateSelectPositionInfo(
             SupportPlayers, AccountSelectPositionInfo());
         for (int i = 0; i < selectPositionList.Count; i++)
         {
             this.Send(selectPositionList[i].remoteIp, retpackage);
         }
     }
     catch (System.Exception ex)
     {
     }
     finally
     {
         Monitor.Exit(netPlayerList);
     }
 }
Example #2
0
        private void CommandHandle_InputKeyUpdate(IPEndPoint remoteIp, NetInputData package)
        {
            Monitor.Enter(netPlayerList);
            try
            {
                //如果客户端的玩家索引为空,未分配
                //检测分配的索引是否溢出当前用户总数
                if (package.PlayerIndex == NetInputData.PlayerIndexEmpty ||
                    package.PlayerIndex >= SupportPlayers)
                {
                    if (IsRemoteIpLocked(remoteIp))
                    {
                        return;
                    }

                    //同步游戏信息
                    this.Send(remoteIp, NetInputData.Create_Command_UpdateGameInfo(gameName));
                    int freeIndex = freePlayerPosition;
                    //没有空闲的位置了
                    if (freeIndex == -1)
                    {
                        this.Send(remoteIp, NetInputData.Create_Command_PlayersFull());
                    }
                    //游戏只支持一名玩家,或者,游戏剩余的位置就一个位置了,没必要选位置了
                    else if (SupportPlayers == 1 || freePlayerPositionCount == 1)
                    {
                        AllocationPlayerPosition(remoteIp, freeIndex);
                    }
                    //加入选位清单,并发生选位请求
                    else
                    {
                        //把这个用户加入选位列表
                        AddPlayerToSelectList(remoteIp);
                        //向客户端发起选位信息
                        this.Send(remoteIp,
                                  NetInputData.Create_Command_UpdateSelectPositionInfo(SupportPlayers,
                                                                                       AccountSelectPositionInfo()));
                    }
                    LockRemoteIp(remoteIp);
                }
                else
                {
                    NetInputPlayer player = getNetPlayer(package.PlayerIndex);
                    if (!player.isActive)
                    {
                        //同步游戏信息
                        this.Send(remoteIp, NetInputData.Create_Command_UpdateGameInfo(gameName));
                        //分配这个位置给用户
                        AllocationPlayerPosition(remoteIp, package.PlayerIndex);
                    }
                    //这个位置已经被其他人激活了
                    else if (!player.remoteIp.Equals(remoteIp))
                    {
                        if (IsRemoteIpLocked(remoteIp))
                        {
                            return;
                        }
                        //同步游戏信息
                        this.Send(remoteIp, NetInputData.Create_Command_UpdateGameInfo(gameName));
                        int freeIndex = freePlayerPosition;
                        //没有空闲的位置了
                        if (freeIndex == -1)
                        {
                            this.Send(remoteIp, NetInputData.Create_Command_PlayersFull());
                        }
                        //游戏只支持一名玩家,或者,游戏剩余的位置就一个位置了,没必要选位置了
                        else if (SupportPlayers == 1 || freePlayerPositionCount == 1)
                        {
                            AllocationPlayerPosition(remoteIp, freeIndex);
                        }
                        //加入选位清单,并发生选位请求
                        else
                        {
                            //把这个用户加入选位列表
                            AddPlayerToSelectList(remoteIp);
                            //向客户端发起选位信息
                            this.Send(remoteIp,
                                      NetInputData.Create_Command_UpdateSelectPositionInfo(SupportPlayers,
                                                                                           AccountSelectPositionInfo()));
                        }
                        LockRemoteIp(remoteIp);
                    }
                    //这个封包就是我的封包被确认,开始处理
                    else
                    {
                        OnHandleReceiveCommand(player, package);
                    }
                }
            }
            catch (System.Exception ex)
            {
            }
            finally
            {
                Monitor.Exit(netPlayerList);
            }
        }