public void Create(NpcInfo npc) { Init(); if (null != npc) { m_Npc = npc; m_Npc.OnBeginAttack = ResetShootAnimation; MovementStateInfo msi = m_Npc.GetMovementStateInfo(); Vector3 pos = msi.GetPosition3D(); float dir = msi.GetFaceDir(); CreateActor(m_Npc.GetId(), m_Npc.GetModel(), pos, dir, m_Npc.Scale); InitAnimationSets(); UpdateWeaponModel(m_Npc); } }
public void Create(UserInfo user) { Init(); if (null != user) { m_User = user; m_User.OnBeginAttack = ResetShootAnimation; MovementStateInfo msi = m_User.GetMovementStateInfo(); Vector3 pos = msi.GetPosition3D(); float dir = msi.GetFaceDir(); CreateActor(m_User.GetId(), m_User.GetModel(), pos, dir, m_User.Scale); InitAnimationSets(); UpdateWeaponModel(m_User); if (user.GetId() == WorldSystem.Instance.PlayerSelfId) { GfxSystem.MarkPlayerSelf(Actor); } } }
protected void UpdateMovement() { CharacterInfo obj = GetOwner(); if (null != obj && !obj.IsDead() && null != ObjectInfo) { MovementStateInfo msi = obj.GetMovementStateInfo(); ObjectInfo.FaceDir = msi.GetFaceDir(); if (msi.IsMoving) { ScriptRuntime.Vector3 pos = msi.GetPosition3D(); ObjectInfo.MoveCos = (float)msi.MoveDirCosAngle; ObjectInfo.MoveSin = (float)msi.MoveDirSinAngle; ObjectInfo.MoveSpeed = (float)obj.GetActualProperty().MoveSpeed *(float)obj.VelocityCoefficient; if (obj is UserInfo) { if (msi.TargetPosition.LengthSquared() < Geometry.c_FloatPrecision) { ObjectInfo.MoveTargetDistanceSqr = 100.0f; } else { ObjectInfo.MoveTargetDistanceSqr = msi.CalcDistancSquareToTarget(); } } else { ObjectInfo.MoveTargetDistanceSqr = msi.CalcDistancSquareToTarget(); } ObjectInfo.IsLogicMoving = true; } else { ObjectInfo.IsLogicMoving = false; } } else { ObjectInfo.IsLogicMoving = false; } }
internal void Tick() { try { if (this.CurrentState != RoomState.Active && this.CurrentState != RoomState.Finish) { return; } long curTime = TimeUtility.GetServerMilliseconds(); if (m_LastLogTime + 60000 < curTime) { m_LastLogTime = curTime; LogSys.Log(LOG_TYPE.INFO, "Room.Tick {0}", RoomID); } if (this.CurrentState == RoomState.Active) { Scene scene = GetActiveScene(); if (null != scene) { scene.Tick(); scene.SightTick(); } 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); } } } } 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(); } } int userCount = GetActiveRoomUserCount(); if (userCount <= 0) { if (GetMinimizeElapsedDroppedTime() > c_finish_time_for_no_users_) { //若房间内玩家数目为0,结束战斗,关闭房间 EndBattle((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); } }