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