Beispiel #1
0
 public void RemoveBot(Client client)
 {
     UId2ClientTable.TryRemove(client.UserID, out Client remove);
 }
Beispiel #2
0
 public void AddBot(Client client)
 {
     UId2ClientTable.TryAdd(client.UserID, client);
 }
Beispiel #3
0
        private void RoomSwitch(Client client, MyData data)
        {
            try
            {
                Room room = null;
                switch (data.Protocol)
                {
                case Protocol.CreateRoom:
                    CreateRoom(client, JsonUntity.Json2Object <GameSetting>(data.Body[0]));
                    break;

                case Protocol.JoinRoom:
                    int    room_id = -1;
                    string pass    = string.Empty;
                    if (data.Body.Count > 0)
                    {
                        room_id = int.Parse(data.Body[0]);
                        pass    = data.Body[1].ToString();
                    }
                    else
                    {
                        room_id = client.GameRoom;
                    }

                    bool result = false;
                    if (RId2Room.TryGetValue(room_id, out room))
                    {
                        //if (JoinRoom != null)
                        //{
                        //    Delegate[] delArray = JoinRoom.GetInvocationList();
                        //    foreach (Delegate del in delArray)
                        //    {
                        //        Room target = (Room)del.Target;
                        //        if (target != null && target.RoomId == room_id)
                        //        {
                        //            JoinRoomDelegate method = (JoinRoomDelegate)del;
                        //            result = method(client, room_id, pass);
                        //        }
                        //    }
                        //}
                        //JoinRoom?.Invoke(client, room_id, pass);
                        result = room.OnClientRequestInter(client, room_id, pass);
                    }
                    if (!result)
                    {
                        Debug(string.Format("{0} join request fail at hall", client.UserName));
                        data = new MyData
                        {
                            Description = PacketDescription.Hall2Cient,
                            Protocol    = Protocol.JoinRoom,
                        };
                        client.SendSwitchReply(data);
                    }
                    break;

                case Protocol.LeaveRoom:
                    if (RId2Room.TryGetValue(client.GameRoom, out room))
                    {
                        client.RequestLeaveRoom();
                    }
                    break;

                case Protocol.UpdateRoom:
                    client.RequstReady(bool.Parse(data.Body[0]));
                    break;

                case Protocol.RoleReserved:
                    if (client.UserRight >= 2 && RId2Room.TryGetValue(client.GameRoom, out room))
                    {
                        if (!room.GameStarted && room.Setting.GameMode == "Classic")
                        {
                            client.RoleReserved = data.Body[0];
                        }
                    }
                    break;

                case Protocol.GeneralReserved:
                    if (client.UserRight >= 2 && RId2Room.TryGetValue(client.GameRoom, out room) && !room.GameStarted &&
                        (room.Setting.GameMode == "Classic" || room.Setting.GameMode == "Hegemony") && data.Body.Count <= 2)
                    {
                        client.GeneralReserved = data.Body;
                    }
                    break;

                case Protocol.KickOff:
                    if (RId2Room.TryGetValue(client.GameRoom, out room) && room != null && room.Host == client && !room.GameStarted)
                    {
                        int victim_id = int.Parse(data.Body[0]);
                        if (UId2ClientTable.TryGetValue(victim_id, out Client victim) && victim != null)
                        {
                            victim.RequestLeaveRoom(true);
                        }
                    }
                    break;

                case Protocol.ConfigChange:
                    if (RId2Room.TryGetValue(client.GameRoom, out room) && room != null && room.Host == client && !room.GameStarted)
                    {
                        GameSetting setting = JsonUntity.Json2Object <GameSetting>(data.Body[0]);
                        GameMode    mode    = Engine.GetMode(room.Setting.GameMode);

                        if (room.Setting.GameMode == setting.GameMode && room.Setting.PlayerNum == setting.PlayerNum && setting.GeneralPackage.Count > 0 && setting.CardPackage.Count > 0)
                        {
                            foreach (string general in setting.GeneralPackage)
                            {
                                if (!mode.GeneralPackage.Contains(general))
                                {
                                    return;
                                }
                            }

                            foreach (string card in setting.CardPackage)
                            {
                                if (!mode.CardPackage.Contains(card))
                                {
                                    return;
                                }
                            }

                            room.ChangeSetting(setting);
                        }
                    }
                    break;

                default:
                    break;
                }
            }
            catch (Exception e)
            {
                LogHelper.WriteLog(null, e);
                Debug(string.Format("error on switch room {0} {1}", e.Message, e.TargetSite));
            }
        }
Beispiel #4
0
        public void RemoveRoom(Room room, Client host, List <Client> clients)
        {
            try
            {
                //更新该room下用户的房间号为0
                foreach (Client client in clients)
                {
                    if (client.UserID > 0)
                    {
                        client.GameRoom = 0;
                        ClientDBOperation.UpdateGameRoom(client.UserName, 0);
                    }
                }

                //若房主存在,重建一个新的房间
                if (host != null)
                {
                    CreateRoom(host, room.Setting);
                    int id = host.GameRoom;

                    //Debug(string.Format("host {0} {1}", host.Profile.NickName, host.GameRoom));

                    if (id > 0 && id != room.RoomId)
                    {
                        Room new_room = GetRoom(id);
                        foreach (Client client in clients)
                        {
                            if (client == host || client.Status != Client.GameStatus.online)
                            {
                                continue;
                            }
                            new_room.OnClientRequestInter(client, id, room.Setting.PassWord);
                        }
                    }
                }

                if (!RId2Room.TryRemove(room.RoomId, out Room remove))
                {
                    Debug(string.Format("remove room {0} failed", room.RoomId));
                }

                if (Room2Thread.TryGetValue(room, out Thread thread))
                {
                    thread.Abort();
                    Room2Thread.TryRemove(room, out Thread _trhead);
                    thread = null;
                }
                RoomList.Instance().RemoveRoom(room.RoomId);
                int room_id = room.RoomId;
                room.Dispose();
                room = null;

                MyData data = new MyData
                {
                    Description = PacketDescription.Hall2Cient,
                    Protocol    = Protocol.UPdateRoomList,
                    Body        = new List <string>
                    {
                        room_id.ToString()
                    }
                };

                List <Client> all = new List <Client>(UId2ClientTable.Values);
                foreach (Client client in all)
                {
                    client.SendProfileReply(data);
                }
            }
            catch (Exception e)
            {
                LogHelper.WriteLog(null, e);
                Debug(string.Format("error at remove room {0} {1} {2}", e.Message, e.TargetSite, e.Source));
            }
        }
Beispiel #5
0
        private void MessageForward(Client sourcer, MyData data)
        {
            try
            {
                MyData message = new MyData
                {
                    Description = PacketDescription.Hall2Cient,
                    Protocol    = data.Protocol
                };
                message.Body = data.Body;

                List <Client> clients = new List <Client>(UId2ClientTable.Values);
                switch (data.Protocol)
                {
                case Protocol.Message2Hall:
                    foreach (Client client in clients)
                    {
                        if (client.GameRoom <= 0)
                        {
                            client.SendMessage(message);
                        }
                    }
                    break;

                case Protocol.Message2Client:
                    if (UId2ClientTable.TryGetValue(int.Parse(data.Body[2]), out Client destination) && destination != null)
                    {
                        destination.SendMessage(message);
                    }
                    break;

                case Protocol.Message2Room:
                    message.Description = PacketDescription.Room2Cient;
                    Room room = GetRoom(sourcer.GameRoom);
                    if (room != null)
                    {
                        if (!room.GameStarted || !room.Setting.SpeakForbidden || (data.Body.Count == 3 && data.Body[1] != "Speech"))
                        {
                            if (!room.GameStarted)
                            {
                                foreach (Client dest in room.Clients)
                                {
                                    if (dest.GameRoom == room.RoomId)
                                    {
                                        dest.SendMessage(message);
                                    }
                                }
                            }
                            else
                            {
                                //假如双方有分冷暖阵营,则只有同阵营之间可以通讯
                                Game3v3Camp camp = room.GetPlayers(sourcer.UserID)[0].Camp;
                                foreach (Client dest in room.Clients)
                                {
                                    if (dest.GameRoom == room.RoomId && room.GetPlayers(dest.UserID)[0].Camp == camp)
                                    {
                                        dest.SendMessage(message);
                                    }
                                }
                            }
                        }
                    }
                    break;

                case Protocol.MessageSystem:
                    if (sourcer.UserRight >= 3)
                    {
                        foreach (Client client in clients)
                        {
                            client.SendMessage(message);
                        }
                    }
                    break;

                default:
                    return;
                }
            }
            catch (Exception e)
            {
                LogHelper.WriteLog(null, e);
                Debug(string.Format("error on message forward {0} {1}", e.Message, e.TargetSite));
            }
        }