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); } }
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); } }