Ejemplo n.º 1
0
 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);
     }
 }
Ejemplo n.º 2
0
 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);
         }
     }
 }
Ejemplo n.º 3
0
        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;
            }
        }
Ejemplo n.º 4
0
        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);
            }
        }