示例#1
0
 public void MsgtoCli_Lobby(Msg_Lobby sermsg)
 {
     if (sermsg.comcode == ComCode.JoinRoom)
     {
         GameMan._ins.AddRoomPlayerUI_Cli(sermsg.playerconnid, sermsg.playername);
     }
     else if (sermsg.comcode == ComCode.LeaveRoom)
     {
         GameMan._ins.RemovePlayer_Cli(sermsg.playerconnid);
     }
     else if (sermsg.comcode == ComCode.ReadyFlag)
     {
         GameMan._ins.ChangeReadyUI_Cli(sermsg.playerconnid, sermsg.rdyornot);
     }
     else if (sermsg.comcode == ComCode.AllReady)
     {
         GameMan._ins.EnableStartButton(sermsg.enaRoomStart);
     }
     else if (sermsg.comcode == ComCode.SetLeader)
     {
         GameMan._ins.SetLeaderUI(sermsg.ureleader);
     }
     else if (sermsg.comcode == ComCode.ChangeLeader)
     {
         GameMan._ins.ChangLeader_Cli(sermsg.playerconnid);
     }
 }
示例#2
0
    // SERVER CALLS THIS TO REMOVE AND PROMOTE NEW LEADER OR REMOVE ROOM FROM RECORD
    /// <summary>
    ///
    /// </summary>
    /// <param name="roomid"></param>
    /// <param name="cliconn"></param>
    /// <param name="mess"> Contains the id of conn that leave</param>
    private void LeaveAndPromote(string roomid, NetworkConnection cliconn, Msg_Lobby mess)
    {
        if (GameMan._ins.roomTab_ser.ContainsKey(roomid))
        {
            // send msg to all players in the room
            GameMan.Room ro = GameMan._ins.roomTab_ser[roomid];
            if (ro.members.Count == 0)
            {
                // remove the room from room list, cuz no one else left
                GameMan._ins.roomTab_ser.Remove(roomid);
            }
            else
            {
                if (cliconn != ro.leader)
                {
                    ro.leader.Send(mess);
                    ro.members.Remove(cliconn);
                    ro.nameslist.Remove(cliconn.connectionId);
                }
                else
                {
                    // promote the next one to be leader, need to be in different order
                    ro.nameslist.Remove(ro.leader.connectionId); // remove name of conn as leader
                    ro.leader = ro.members[0];                   // promote
                    ro.leader.Send(mess);
                    // send msg to enable leader ui
                    ro.leader.Send(new Msg_Lobby {
                        comcode = ComCode.SetLeader, ureleader = true
                    });
                    ro.members.Remove(ro.leader);
                    // remove id of new leader from ready flags list
                    if (ro.readyflags.ContainsKey(ro.leader.connectionId))
                    {
                        ro.readyflags.Remove(ro.leader.connectionId);
                    }
                }

                // loop over members and send them msg to remove from their local lobby
                for (int i = 0; i < ro.members.Count; i++)
                {
                    ro.members[i].Send(mess);
                    // send another message to update all with the new leader
                    ro.members[i].Send(new Msg_Lobby {
                        comcode = ComCode.ChangeLeader, playerconnid = ro.leader.connectionId
                    });
                }
                // remove flag from flag list
                if (ro.readyflags.ContainsKey(cliconn.connectionId))
                {
                    ro.readyflags.Remove(cliconn.connectionId);
                    H.klog($"Remove Flag of players that left the room, remaining {ro.readyflags.Count}");
                }
                // check ro ready flags, to enable start button for new leader
                CheckRoomReadyFlags(ro);
            }
        }
    }
示例#3
0
    public void MsgtoSer_Lobby(NetworkConnection cliconn, Msg_Lobby climsg)
    {
        if (climsg.comcode == ComCode.ReadyFlag)
        {
            if (GameMan._ins.roomTab_ser.ContainsKey(climsg.roomid))
            {
                GameMan.Room ro = GameMan._ins.roomTab_ser[climsg.roomid];
                if (ro.readyflags.ContainsKey(cliconn.connectionId))
                {
                    ro.readyflags[cliconn.connectionId] = climsg.rdyFlag;
                }
                else
                {
                    ro.readyflags.Add(cliconn.connectionId, climsg.rdyFlag);
                }
                // loop over member in room and update that player's state
                Msg_Lobby messtocli = new Msg_Lobby {
                    playerconnid = cliconn.connectionId, comcode = ComCode.ReadyFlag
                };
                messtocli.rdyornot = climsg.rdyFlag ? "Ready" : "Not Ready";

                if (ro.leader != cliconn)
                {
                    ro.leader.Send(messtocli);
                }

                for (int i = 0; i < ro.members.Count; i++)
                {
                    ro.members[i].Send(messtocli);
                }
                // in case if leader id exist in ready list, remove it
                if (ro.readyflags.ContainsKey(ro.leader.connectionId))
                {
                    ro.readyflags.Remove(ro.leader.connectionId);
                }
                // enable start button if all ready
                CheckRoomReadyFlags(ro);
            }
        }
    }
示例#4
0
 public void MsgtoSer_RoomInGeneral(NetworkConnection cliconn, Msg_RoomInGeneral inmsg)
 {
     if (inmsg.comcode == ComCode.CreateRoom)
     {
         //H.klog2($"Client - {cliconn} send me room req, what hsould id o", this.name);
         string id = H.GenIds();
         // set up room list on server, assign this cliconn as leader
         GameMan._ins.SetupRoom_Ser(id, cliconn, inmsg.urname);
         // assign the connection id with room id
         GameMan._ins.playerTab_ser.Add(cliconn.connectionId, id);
         // sending created room id to client
         Msg_RoomInGeneral sendtocli = new Msg_RoomInGeneral()
         {
             roomids = id, comcode = ComCode.CreateRoom
         };
         cliconn.Send(sendtocli);
         cliconn.Send(new Msg_Lobby {
             comcode = ComCode.SetLeader, ureleader = true
         });
     }
     else if (inmsg.comcode == ComCode.LeaveRoom)
     {
         Msg_Lobby resmsg = new Msg_Lobby {
             comcode = ComCode.LeaveRoom, playerconnid = cliconn.connectionId
         };
         // send message to all member to remove the one that leave
         //cli who sends this still connect to server
         if (GameMan._ins.roomTab_ser.ContainsKey(inmsg.roomids))
         {
             LeaveAndPromote(inmsg.roomids, cliconn, resmsg);
         }
         // remove player from player table
         H.klog($"remove LEAVING {cliconn.connectionId} from Game Manager");
         if (GameMan._ins.playerTab_ser.ContainsKey(cliconn.connectionId))
         {
             GameMan._ins.playerTab_ser.Remove(cliconn.connectionId);
         }
     }
 }