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