public 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();
OnTick();
}
m_DisconnectedUsers.Clear();
m_RequestDeleteUsers.Clear();
foreach (User user in m_RoomUserMgr.RoomUsers)
{
if (user != null)
{
user.Tick();
if (user.IsTimeout())
{
if (user.UserControlState == (int)UserControlState.User)
{
m_DisconnectedUsers.Add(user);
}
else if (user.UserControlState == (int)UserControlState.Remove)
{
m_RequestDeleteUsers.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 = m_RoomId;
uaqBuilder.UserGuid = user.Guid;
uaqBuilder.IsBattleEnd = false;
m_Connector.SendMsgToLobby(uaqBuilder);
user.LastNotifyUserDropTime = curTime;
}
//临时处理,踢掉断线的玩家
user.UserControlState = (int)UserControlState.Remove;
}
}
}
}
foreach (User user in m_DisconnectedUsers)
{
m_RoomUserMgr.DropUser(user);
}
foreach (User user in m_RequestDeleteUsers)
{
m_RoomUserMgr.RemoveUser(user);
}
//todo:观察者掉线处理
for (int i = 0; i < m_RoomUserMgr.RoomObservers.Length; ++i)
{
Observer observer = m_RoomUserMgr.RoomObservers[i];
if (!observer.IsIdle)
{
observer.Tick();
}
}
if (!IsFieldRoom)
{
int userCount = GetActiveRoomUserCount();
if (userCount <= 0 && CanFinish)
{
if (GetMinimizeElapsedDroppedTime() > c_FinishTimeForNoUsers)
{
//若房间内玩家数目为0,结束战斗,关闭房间
Finish((int)CampIdEnum.Unkown);
}
}
}
//每个Tick结束,将空间属性同步给Peer,用于Peer转发消息
foreach (User user in m_RoomUserMgr.RoomUsers)
{
if (null != user && null != user.Info && null != user.Info.GetMovementStateInfo())
{
GameFramework.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);
}
}