예제 #1
0
 public void StartMatch(ClientListener client, Pluto pluto)
 {
     LoggerHelper.Debug("StartMatch");
     foreach (var item in m_roomsData.Values)
     {
         if (!item.IsBusy)
         {
             var canStart = item.AddClient(client);
             var ecap     = new EntityCellAttachedPluto();
             var res      = ecap.ServerEncode(GetCellData(client));
             client.Send(res);
             AOINew(client);
             AOIEntityies(client);
             if (canStart)
             {
                 StartBattle(client, pluto);
             }
             LoggerHelper.Debug("StartMatch " + canStart);
             return;
         }
     }
     CreatRoom(client, (int)pluto.Arguments[0], (int)pluto.Arguments[1]);
     if ((int)pluto.Arguments[0] == 1)//单人模式
     {
         StartBattle(client, pluto);
     }
 }
예제 #2
0
        private CellAttachedInfo GetCellData(ClientListener client, bool needProps = true, bool isNewCell = false, bool needName = false)
        {
            CellAttachedInfo cellData;

            if (isNewCell)
            {
                cellData = new CellAttachedInfo();
            }
            else
            {
                cellData = cellInfoTemplate;
            }
            List <EntityPropertyValue> props = null;

            if (needProps)
            {
                props = new List <EntityPropertyValue>()
                {
                    new EntityPropertyValue(GetEntityDefPropertyByName("TeamId"), client.ClientData.TeamId),
                    new EntityPropertyValue(GetEntityDefPropertyByName("MapId"), client.ClientData.MapId),
                    new EntityPropertyValue(GetEntityDefPropertyByName("HeadQuarterId"), client.ClientData.HeadQuarterId),
                };
                if (needName)
                {
                    props.Add(new EntityPropertyValue(GetEntityDefPropertyByName("Name"), client.ClientData.Name));
                }
            }
            cellData.SetData(Avatar, client.ClientData.Id, props);
            return(cellData);
        }
예제 #3
0
        public bool AddClient(ClientListener client)
        {
            m_currentTeam++;
            if (m_currentTeam == m_teamCount)
            {
                m_currentTeam = 0;
            }
            client.ClientData.TeamId = m_currentTeam;
            m_teamMemberDic[m_currentTeam].Add(client);
            m_memberList.Add(client);
            client.ClientData.MapId      = MapId;
            client.ClientData.BelongRoom = this;

            if (m_currentHeadQuarter == m_mapHeadQuarterMapping[MapId].Count)
            {
                LoggerHelper.Error("m_currentHeadQuarter == m_mapHeadQuarterMapping[MapId].Count! " + m_currentHeadQuarter + " MapId: " + MapId);
                return(true);
            }
            client.ClientData.HeadQuarterId = m_mapHeadQuarterMapping[MapId][m_currentHeadQuarter];
            m_currentHeadQuarter++;
            if (m_clientCount == m_memberList.Count)
            {
                IsBusy = true;
                return(true);//可以开始比赛
            }
            else
            {
                return(false);
            }
        }
예제 #4
0
 private void RemoveClient(ClientListener c)
 {
     c.Closed -= client_Closed;
     lock (m_clientListLocker)
     {
         allClientList.Remove(c);
         allClientDic.Remove(c.ClientData.Id);
     }
 }
예제 #5
0
        private void AOIRPC(ClientListener client, Pluto pluto)
        {
            var res = pluto.Content;

            for (int i = 0; i < client.ClientData.BelongRoom.MemberList.Count; i++)
            {
                client.ClientData.BelongRoom.MemberList[i].Send(res);
                //var c = tempList[i];
                //c.Send(res);
            }
        }
예제 #6
0
        private ClientListener AddClient(Socket handler, bool isDummy = false)
        {
            var client = new ClientListener(handler, isDummy);

            client.ClientData.Id   = (uint)Guid.NewGuid().GetHashCode();
            client.ClientData.Dbid = client.ClientData.Id;
            client.Closed         += client_Closed;
            lock (m_clientListLocker)
            {
                allClientList.Add(client);
                allClientDic.Add(client.ClientData.Id, client);
            }
            return(client);
        }
예제 #7
0
        private void AOIDelete(ClientListener client)
        {
            var pluto = new AOIDelEntityPluto();
            var res   = pluto.ServerEncode(GetCellData(client, false));

            for (int i = 0; i < client.ClientData.BelongRoom.MemberList.Count; i++)
            {
                var c = client.ClientData.BelongRoom.MemberList[i];
                if (c != client)
                {
                    c.Send(res);
                }
            }
        }
예제 #8
0
 private void HandleMove(ClientListener client, Pluto pluto)
 {
     if (pluto.Arguments.Length > 0)
     {
         var cell = pluto.Arguments[0] as CellAttachedInfo;
         if (cell != null)
         {
             //client.ClientData.face = cell.face;
             //client.ClientData.Position = cell.position;
             //UpdatePos(client);
         }
     }
     //LoggerHelper.Debug("HandleMove: " + pluto.Arguments.Length);
 }
예제 #9
0
        public void CreatRoom(ClientListener client, int teamCount, int clientCount)
        {
            LoggerHelper.Debug("CreatRoom " + teamCount + " " + clientCount);
            var room = new RoomData(teamCount, clientCount);

            room.Id    = (uint)Guid.NewGuid().GetHashCode();
            room.MapId = GetRandomMapId();
            room.AddClient(client);
            var ecap = new EntityCellAttachedPluto();
            var res  = ecap.ServerEncode(GetCellData(client));

            client.Send(res);

            m_roomsData.Add(room.Id, room);
        }
예제 #10
0
        public void AttrSync(ClientListener client)
        {
            var selfPluto  = new AvatarAttriSyncPluto();
            var selfRes    = selfPluto.ServerEncode(cellInfoTemplate);
            var otherPluto = new OtherAttriSyncPluto();
            var otherRes   = otherPluto.ServerEncode(cellInfoTemplate);

            for (int i = 0; i < tempList.Count; i++)
            {
                var c = tempList[i];
                if (c != client)
                {
                    c.Send(otherRes);
                }
                else
                {
                    c.Send(selfRes);
                }
            }
        }
예제 #11
0
        private void HandleRPCCall(ClientListener client, Pluto pluto)
        {
            switch (pluto.FuncName)
            {
            case "HeartBeat":
                break;

            case "StartMatch":
                StartMatch(client, pluto);
                break;

            case "CreateAvatarResp":
                CreateAvatar();
                break;

            default:
                AOIRPC(client, pluto);
                break;
            }
            //LoggerHelper.Debug("HandleRPCCall: " + pluto.Arguments.Length);
        }
예제 #12
0
        private void OnDataReceive(ClientListener client, Byte[] data)
        {
            var pluto = Pluto.Decode(data);
            var type  = pluto.GetType();

            if (type == typeof(LoginPluto))
            {
                HandleLogin(client, pluto);
            }
            else if (type == typeof(MovePluto))
            {
                HandleMove(client, pluto);
            }
            else if (type == typeof(RpcCallPluto))
            {
                HandleRPCCall(client, pluto);
            }
            else
            {
                LoggerHelper.Debug("Unkown type pluto: " + pluto.GetType().ToString());
            }
        }
예제 #13
0
        private void HandleLogin(ClientListener client, Pluto pluto)
        {
            client = InitClientData(client, pluto.Arguments[0].ToString());

            var eap = new EntityAttachedPluto();
            var res = eap.ServerEncode(new BaseAttachedInfo()
            {
                typeId = Avatar,
                id     = client.ClientData.Id,
                dbid   = client.ClientData.Dbid,
                props  = new List <EntityPropertyValue>()
                {
                    new EntityPropertyValue(GetEntityDefPropertyByName("Name"), client.ClientData.Name),
                }
            });

            client.Send(res);

            //AOINew(client);
            //AOIEntityies(client);
            LoggerHelper.Debug("Client Login: " + pluto.Arguments[0]);
        }
예제 #14
0
        private void AOIEntityies(ClientListener client)
        {
            var pluto = new AOIEntitiesPluto();
            var list  = new List <CellAttachedInfo>();

            for (int i = 0; i < client.ClientData.BelongRoom.MemberList.Count; i++)
            {
                var c = client.ClientData.BelongRoom.MemberList[i];
                if (c != client)
                {
                    list.Add(GetCellData(c, isNewCell: true, needName: true));
                }
            }

            if (list.Count == 0)
            {
                return;
            }
            var res = pluto.ServerEncode(list);

            //LoggerHelper.Debug("tempList.Count: " + tempList.Count + " list.Count: " + list.Count + " res: " + res.Length);
            client.Send(res);
        }
예제 #15
0
        private void UpdatePos(ClientListener client)
        {
            GetCellData(client, false);

            PosSync(client);
        }
예제 #16
0
 public void StartBattle(ClientListener client, Pluto pluto)
 {
     AOIRPC(client, pluto);
 }
예제 #17
0
 private ClientListener InitClientData(ClientListener client, string name)
 {
     client.ClientData.Name = name;
     return(client);
 }
예제 #18
0
 public void RemoveClient(ClientListener client)
 {
     m_teamMemberDic[client.ClientData.TeamId].Remove(client);
     m_memberList.Remove(client);
     m_currentHeadQuarter--;
 }