GameFramework.Room.Tick C# (CSharp) Method

Tick() private method

private Tick ( ) : void
return void
        internal void Tick()
        {
            try {
                if (this.CurrentState != RoomState.Active && this.CurrentState != RoomState.Finish)
                    return;

                long curTime = TimeUtility.GetLocalMilliseconds();
                if (m_LastLogTime + 60000 < curTime) {
                    m_LastLogTime = curTime;

                    LogSys.Log(LOG_TYPE.INFO, "Room.Tick {0}", RoomID);
                }

                if (this.CurrentState == RoomState.Active) {
                    Scene scene = ActiveScene;
                    if (null != scene) {
                        scene.Tick();
                    }
                    disconnected_users_.Clear();
                    request_delete_users_.Clear();
                    foreach (User user in room_users_) {
                        if (user != null) {
                            user.Tick();
                            if (user.IsTimeout()) {
                                if (user.UserControlState == (int)UserControlState.User) {
                                    disconnected_users_.Add(user);
                                } else if (user.UserControlState == (int)UserControlState.Remove) {
                                    request_delete_users_.Add(user);
                                } else if (user.UserControlState == (int)UserControlState.UserDropped) {
                                    if (user.LastNotifyUserDropTime + c_NotifyUserDropInterval < curTime) {
                                        Msg_RL_UserDrop uaqBuilder = new Msg_RL_UserDrop();
                                        uaqBuilder.RoomID = cur_room_id_;
                                        uaqBuilder.UserGuid = user.Guid;
                                        uaqBuilder.IsBattleEnd = false;
                                        connector_.SendMsgToLobby(uaqBuilder);

                                        user.LastNotifyUserDropTime = curTime;
                                    }
                                    //临时处理,踢掉断线的玩家
                                    user.UserControlState = (int)UserControlState.Remove;
                                }
                            }
                        }
                    }
                    foreach (User user in disconnected_users_) {
                        DropUser(user);
                    }
                    foreach (User user in request_delete_users_) {
                        RemoveUser(user);
                    }
                    //todo:观察者掉线处理
                    for (int i = 0; i < room_observers_.Length; ++i) {
                        Observer observer = room_observers_[i];
                        if (!observer.IsIdle) {
                            observer.Tick();
                        }
                    }
                    if (!IsFieldRoom) {
                        int userCount = GetActiveRoomUserCount();
                        if (userCount <= 0 && CanFinish) {
                            if (GetMinimizeElapsedDroppedTime() > c_finish_time_for_no_users_) {
                                //若房间内玩家数目为0,结束战斗,关闭房间
                                Finish((int)CampIdEnum.Unkown);
                            }
                        }
                    }
                    //每个Tick结束,将空间属性同步给Peer,用于Peer转发消息
                    foreach (User user in room_users_) {
                        if (null != user && null != user.Info && null != user.Info.GetMovementStateInfo()) {
                            RoomServer.RoomPeer peer = user.GetPeer();
                            if (null != peer) {
                                MovementStateInfo info = user.Info.GetMovementStateInfo();
                                peer.Position = info.GetPosition3D();
                                peer.FaceDir = info.GetFaceDir();
                            }
                        }
                    }
                } else if (m_FinishTime + c_DeactiveWaitTime < curTime) {
                    Deactive();
                }
            } catch (Exception ex) {
                LogSys.Log(LOG_TYPE.ERROR, "Exception {0}\n{1}", ex.Message, ex.StackTrace);
            }
        }