private void MoveNpc(EntityInfo obj, long deltaTime)
        {
            if (obj.HaveState(CharacterPropertyEnum.x3002_昏睡) ||
                obj.HaveState(CharacterPropertyEnum.x3001_眩晕))
            {
                return;
            }
            MovementStateInfo msi = obj.GetMovementStateInfo();

            //npc执行移动时忽略阻挡与避让,这些行为由ai模块在规划其路径时执行。
            if (!obj.IsDead() && obj.CanMove && msi.IsMoving)
            {
                ScriptRuntime.Vector3 pos = msi.GetPosition3D();
                float speed               = (float)obj.ActualProperty.GetFloat(CharacterPropertyEnum.x2011_最终速度);
                float distance            = (speed * (float)(int)deltaTime) / 1000.0f;
                ScriptRuntime.Vector3 dir = msi.TargetDir;

                //LogSystem.Debug("MovementSystem npc:{0} speed:{1} deltaTime:{2} distance:{3}", obj.GetId(), speed, deltaTime, distance);

                float x = 0, y = 0;
                if (msi.CalcDistancSquareToTarget() < distance * distance)
                {
                    x = msi.TargetPosition.X;
                    y = msi.TargetPosition.Z;
                    ScriptRuntime.Vector2 newPos = new ScriptRuntime.Vector2(x, y);
                    msi.SetPosition2D(newPos);
                    msi.IsMoving = false;
                }
                else
                {
                    ScriptRuntime.Vector3 tpos = pos + dir * distance;
                    msi.SetPosition(tpos);
                }
            }
        }
 public static void AoeQuery(GameObject srcObj, GameObject targetObj, int aoeType, float range, float angleOrLength, SkillInstance instance, int senderId, int targetType, Vector3 relativeCenter, bool relativeToTarget, MyFunc<float, int, bool> callback)
 {
     float radian;
     Vector3 center;
     if (null != targetObj && relativeToTarget) {
         Vector3 srcPos = srcObj.transform.position;
         Vector3 targetPos = targetObj.transform.position;
         radian = Geometry.GetYRadian(new ScriptRuntime.Vector2(srcPos.x, srcPos.z), new ScriptRuntime.Vector2(targetPos.x, targetPos.z));
         ScriptRuntime.Vector2 newOffset = Geometry.GetRotate(new ScriptRuntime.Vector2(relativeCenter.x, relativeCenter.z), radian);
         center = targetPos + new Vector3(newOffset.X, relativeCenter.y, newOffset.Y);
     } else {
         radian = Geometry.DegreeToRadian(srcObj.transform.localRotation.eulerAngles.y);
         center = srcObj.transform.TransformPoint(relativeCenter);
     }
     if (aoeType == (int)SkillAoeType.Circle || aoeType == (int)SkillAoeType.Sector) {
         angleOrLength = Geometry.DegreeToRadian(angleOrLength);
         ClientModule.Instance.KdTree.Query(center.x, center.y, center.z, range, (float distSqr, KdTreeObject kdTreeObj) => {
             int targetId = kdTreeObj.Object.GetId();
             if (targetType == (int)SkillTargetType.Enemy && CharacterRelation.RELATION_ENEMY == EntityController.Instance.GetRelation(senderId, targetId) ||
                 targetType == (int)SkillTargetType.Friend && CharacterRelation.RELATION_FRIEND == EntityController.Instance.GetRelation(senderId, targetId)) {
                 bool isMatch = false;
                 if (aoeType == (int)SkillAoeType.Circle) {
                     isMatch = true;
                 } else {
                     ScriptRuntime.Vector2 u = Geometry.GetRotate(new ScriptRuntime.Vector2(0, 1), radian);
                     isMatch = Geometry.IsSectorDiskIntersect(new ScriptRuntime.Vector2(center.x, center.z), u, angleOrLength / 2, range, new ScriptRuntime.Vector2(kdTreeObj.Position.X, kdTreeObj.Position.Z), kdTreeObj.Radius);
                 }
                 if (isMatch) {
                     if (!callback(distSqr, kdTreeObj.Object.GetId())) {
                         return false;
                     }
                 }
             }
             return true;
         });
     } else {
         ScriptRuntime.Vector2 angleu = Geometry.GetRotate(new ScriptRuntime.Vector2(0, angleOrLength), radian);
         ScriptRuntime.Vector2 c = new ScriptRuntime.Vector2(center.x, center.z) + angleu / 2;
         GameFramework.ClientModule.Instance.KdTree.Query(c.X, 0, c.Y, range + angleOrLength / 2, (float distSqr, GameFramework.KdTreeObject kdTreeObj) => {
             int targetId = kdTreeObj.Object.GetId();
             if (targetType == (int)SkillTargetType.Enemy && CharacterRelation.RELATION_ENEMY == EntityController.Instance.GetRelation(senderId, targetId) ||
                 targetType == (int)SkillTargetType.Friend && CharacterRelation.RELATION_FRIEND == EntityController.Instance.GetRelation(senderId, targetId)) {
                 bool isMatch = false;
                 if (aoeType == (int)SkillAoeType.Capsule) {
                     isMatch = Geometry.IsCapsuleDiskIntersect(new ScriptRuntime.Vector2(center.x, center.z), angleu, range, new ScriptRuntime.Vector2(kdTreeObj.Position.X, kdTreeObj.Position.Z), kdTreeObj.Radius);
                 } else {
                     ScriptRuntime.Vector2 half = new ScriptRuntime.Vector2(range / 2, angleOrLength / 2);
                     isMatch = Geometry.IsObbDiskIntersect(c, half, radian, new ScriptRuntime.Vector2(kdTreeObj.Position.X, kdTreeObj.Position.Z), kdTreeObj.Radius);
                 }
                 if (isMatch) {
                     if (!callback(distSqr, kdTreeObj.Object.GetId())) {
                         return false;
                     }
                 }
             }
             return true;
         });
     }
 }
Exemple #3
0
        /**
         * @brief 将字符串解析为Vector2D
         *
         * @param vec 字符串,类似于"100,200"
         *
         * @return
         */
        public static ScriptRuntime.Vector2 ConvertVector2D(string vec)
        {
            string strPos = vec;

            string[] resut = strPos.Split(s_ListSplitString, StringSplitOptions.None);
            ScriptRuntime.Vector2 vector = new ScriptRuntime.Vector2(Convert.ToSingle(resut[0]), Convert.ToSingle(resut[1]));
            return(vector);
        }
Exemple #4
0
        /**
         * @brief 预估移动时间
         *
         * @param pos
         *
         * @return
         */
        public float PredictMoveDuration(CharacterInfo character, ScriptRuntime.Vector2 pos)
        {
            float distance = ScriptRuntime.Vector2.Distance(character.GetMovementStateInfo().GetPosition2D(), pos);
            float duration = distance / character.GetActualProperty().MoveSpeed;

            duration += ClientConfig.s_PredictMoveDurationRefix;

            return(duration);
        }
        public override bool Execute(object sender, SkillInstance instance, long delta, long curSectionTime)
        {
            GfxSkillSenderInfo senderObj = sender as GfxSkillSenderInfo;

            if (null == senderObj)
            {
                return(false);
            }
            GameObject obj = senderObj.GfxObj;

            if (obj == null)
            {
                return(false);
            }
            GameObject targetObj = senderObj.TargetGfxObj;

            if (null != senderObj.TrackEffectObj)
            {
                obj       = senderObj.TrackEffectObj;
                targetObj = senderObj.GfxObj;
            }
            if (curSectionTime < StartTime)
            {
                return(true);
            }
            if (m_IsForRoundMove)
            {
                Vector3 srcPos    = obj.transform.position;
                Vector3 targetPos = Vector3.zero;
                if (null != targetObj)
                {
                    targetPos = targetObj.transform.position;
                }
                TriggerUtil.GetSkillStartPosition(srcPos, senderObj.ConfigData, instance, senderObj.ActorId, senderObj.TargetActorId, ref targetPos);
                if (targetPos.sqrMagnitude > Geometry.c_FloatPrecision)
                {
                    float angle = Geometry.GetYRadian(new ScriptRuntime.Vector2(srcPos.x, srcPos.z), new ScriptRuntime.Vector2(targetPos.x, targetPos.z));
                    ScriptRuntime.Vector2 newPos = new ScriptRuntime.Vector2(targetPos.x, targetPos.z) + Geometry.GetRotate(new ScriptRuntime.Vector2(m_RelativeOffset.x, m_RelativeOffset.z), angle);
                    targetPos = new Vector3(newPos.X, srcPos.y + m_RelativeOffset.y, newPos.Y);
                    TriggerUtil.MoveObjTo(obj, targetPos);
                }
            }
            else if (null != targetObj)
            {
                //Vector3 pos = targetObj.transform.TransformPoint(m_RelativeOffset);
                Vector3 srcPos = obj.transform.position;
                Vector3 pos    = Vector3.zero;
                if (null != targetObj)
                {
                    pos = targetObj.transform.position;
                }
                TriggerUtil.GetSkillStartPosition(srcPos, senderObj.ConfigData, instance, senderObj.ActorId, senderObj.TargetActorId, ref pos);
                pos.y = srcPos.y;
                TriggerUtil.MoveObjTo(obj, pos);
            }
            return(false);
        }
 public static ScriptRuntime.Vector2 ConvertVector2D(string vec)
 {
     try {
         string   strPos = vec;
         string[] resut  = strPos.Split(s_ListSplitString, StringSplitOptions.RemoveEmptyEntries);
         ScriptRuntime.Vector2 vector = new ScriptRuntime.Vector2(Convert.ToSingle(resut[0]), Convert.ToSingle(resut[1]));
         return(vector);
     } catch (System.Exception ex) {
         LogSystem.Error("ConvertVector2D {0} Exception:{1}/{2}", vec, ex.Message, ex.StackTrace);
         throw;
     }
 }
        private void MoveNpc(EntityInfo obj, long deltaTime)
        {
            if (obj.IsHaveStateFlag(CharacterState_Type.CST_Sleep) ||
                obj.IsHaveStateFlag(CharacterState_Type.CST_FixedPosition))
            {
                return;
            }
            MovementStateInfo msi = obj.GetMovementStateInfo();

            //npc执行移动时忽略阻挡与避让,这些行为由ai模块在规划其路径时执行。
            if (!obj.IsDead() && obj.CanMove && msi.IsMoving && !msi.IsSkillMoving)
            {
                ScriptRuntime.Vector3 pos = msi.GetPosition3D();
                float speed               = (float)obj.GetActualProperty().MoveSpeed;
                float distance            = (speed * (float)(int)deltaTime) / 1000.0f;
                ScriptRuntime.Vector3 dir = msi.TargetDir;

                //LogSystem.Debug("MovementSystem npc:{0} speed:{1} deltaTime:{2} distance:{3}", obj.GetId(), speed, deltaTime, distance);

                float x = 0, y = 0;
                if (msi.CalcDistancSquareToTarget() < distance * distance)
                {
                    x = msi.TargetPosition.X;
                    y = msi.TargetPosition.Z;
                    ScriptRuntime.Vector2 newPos = new ScriptRuntime.Vector2(x, y);
                    msi.SetPosition2D(newPos);

                    msi.IsMoving = false;
                    User user = obj.CustomData as User;
                    if (null != user)
                    {
                        Msg_RC_NpcMove npcMoveBuilder = DataSyncUtility.BuildNpcMoveMessage(obj);
                        if (null != npcMoveBuilder)
                        {
                            Scene scene = user.OwnRoom.ActiveScene;
                            if (null != scene)
                            {
                                scene.NotifyAllUser(RoomMessageDefine.Msg_RC_NpcMove, npcMoveBuilder);
                            }
                        }
                    }
                }
                else
                {
                    ScriptRuntime.Vector3 tpos = pos + dir * distance;
                    msi.SetPosition(tpos);
                }
            }
        }
 public override bool Execute(object sender, SkillInstance instance, long delta, long curSectionTime)
 {
     GfxSkillSenderInfo senderObj = sender as GfxSkillSenderInfo;
     if (null == senderObj) return false;
     GameObject obj = senderObj.GfxObj;
     if (obj == null) {
         return false;
     }
     GameObject targetObj = senderObj.TargetGfxObj;
     if (null != senderObj.TrackEffectObj) {
         obj = senderObj.TrackEffectObj;
         targetObj = senderObj.GfxObj;
     }
     if (curSectionTime < StartTime) {
         return true;
     }
     if (m_IsForRoundMove) {
         Vector3 srcPos = obj.transform.position;
         Vector3 targetPos = Vector3.zero;
         if (null != targetObj) {
             targetPos = targetObj.transform.position;
         }
         TriggerUtil.GetSkillStartPosition(srcPos, senderObj.ConfigData, instance, senderObj.ActorId, senderObj.TargetActorId, ref targetPos);
         if (targetPos.sqrMagnitude > Geometry.c_FloatPrecision) {
             float angle = Geometry.GetYRadian(new ScriptRuntime.Vector2(srcPos.x, srcPos.z), new ScriptRuntime.Vector2(targetPos.x, targetPos.z));
             ScriptRuntime.Vector2 newPos = new ScriptRuntime.Vector2(targetPos.x, targetPos.z) + Geometry.GetRotate(new ScriptRuntime.Vector2(m_RelativeOffset.x, m_RelativeOffset.z), angle);
             targetPos = new Vector3(newPos.X, srcPos.y + m_RelativeOffset.y, newPos.Y);
             TriggerUtil.MoveObjTo(obj, targetPos);
         }
     } else if (null != targetObj) {
         //Vector3 pos = targetObj.transform.TransformPoint(m_RelativeOffset);
         Vector3 srcPos = obj.transform.position;
         Vector3 pos = Vector3.zero;
         if (null != targetObj)
         {
             pos = targetObj.transform.position;
         }
         TriggerUtil.GetSkillStartPosition(srcPos, senderObj.ConfigData, instance, senderObj.ActorId, senderObj.TargetActorId, ref pos);
         pos.y = srcPos.y;
         TriggerUtil.MoveObjTo(obj, pos);
     }
     return false;
 }
 private bool Prepare(GfxSkillSenderInfo senderObj, GameObject obj, GameObject targetObj)
 {
     if (!m_TargetChecked)
     {
         m_TargetChecked = true;
         Vector3 srcPos    = obj.transform.position;
         Vector3 targetPos = Vector3.zero;
         if (null != targetObj && m_ObjPath == "vector3")
         {
             targetPos = targetObj.transform.position;
             float degree = Geometry.GetYRadian(new ScriptRuntime.Vector2(srcPos.x, srcPos.z), new ScriptRuntime.Vector2(targetPos.x, targetPos.z));
             ScriptRuntime.Vector2 newPos = new ScriptRuntime.Vector2(targetPos.x, targetPos.z) + Geometry.GetRotate(new ScriptRuntime.Vector2(m_Offset.x, m_Offset.z), degree);
             targetPos = new Vector3(newPos.X, targetPos.y + m_Offset.y, newPos.Y);
         }
         else
         {
             var tobj = GameObject.Find(m_ObjPath);
             if (null != tobj)
             {
                 targetPos = tobj.transform.position;
             }
             else
             {
                 return(false);
             }
         }
         m_Forward   = targetPos - srcPos;
         m_Forward.y = 0;
         m_Velocity  = m_Forward.magnitude * 1000 / m_Duration;
         m_Forward.Normalize();
         if (m_IsFaceToTarget)
         {
             float radian = Geometry.GetYRadian(new ScriptRuntime.Vector2(srcPos.x, srcPos.z), new ScriptRuntime.Vector2(targetPos.x, targetPos.z));
             obj.transform.rotation = Quaternion.AngleAxis(Geometry.RadianToDegree(radian), Vector3.up);
         }
         float tan = GetTanToPoint(m_Velocity, m_G, srcPos, targetPos);
         m_InitY     = srcPos.y;
         m_YVelocity = m_Velocity * tan;
     }
     return(true);
 }
        /// <summary>
        /// Raises the draw gizmos selected event.
        /// </summary>
        protected virtual void OnDrawGizmosSelected()
        {
            if (npcInfo == null)
            {
                return;
            }
            UnityEditor.Handles.color = viewRangeColor;
            UnityEditor.Handles.DrawWireDisc(transform.position, Vector3.up, npcInfo.ViewRange);

            SkillInfo skillInfo = npcInfo.GetSkillStateInfo().GetCurSkillInfo();

            if (skillInfo != null)
            {
                UnityEditor.Handles.color = skillRangeColor;
                UnityEditor.Handles.DrawWireDisc(transform.position, Vector3.up, skillInfo.distance);

                TableConfig.Skill cfg = skillInfo.ConfigData;
                if (cfg.aoeType == (int)SkillAoeType.Circle)
                {
                    UnityEditor.Handles.color = Color.black;
                    UnityEditor.Handles.DrawWireDisc(transform.position, Vector3.up, cfg.aoeSize);
                }
                else if (cfg.aoeType == (int)SkillAoeType.Sector)
                {
                    UnityEditor.Handles.color = Color.black;
                    float radian = Utility.DegreeToRadian(transform.localRotation.eulerAngles.y);
                    ScriptRuntime.Vector2 dir = Geometry.GetRotate(new ScriptRuntime.Vector2(0, 1), radian - cfg.aoeAngleOrLength / 2);
                    UnityEditor.Handles.DrawWireArc(transform.position, Vector3.up, new Vector3(dir.X, 0, dir.Y), cfg.aoeAngleOrLength, cfg.aoeSize);
                }
                else
                {
                    float radian = Utility.DegreeToRadian(transform.localRotation.eulerAngles.y);
                    ScriptRuntime.Vector2 dir = Geometry.GetRotate(new ScriptRuntime.Vector2(0, 1), radian) * cfg.aoeAngleOrLength;
                    Vector3 pos1 = transform.position;
                    Vector3 pos2 = pos1 + new Vector3(dir.X, 0, dir.Y);
                    UnityEditor.Handles.color = Color.black;
                    UnityEditor.Handles.DrawLine(pos1, pos2);
                }
            }
        }
        private void MoveNpc(EntityInfo obj, long deltaTime)
        {
            if (obj.IsHaveStateFlag(CharacterState_Type.CST_Sleep)
            || obj.IsHaveStateFlag(CharacterState_Type.CST_FixedPosition)) {
            return;
              }
              MovementStateInfo msi = obj.GetMovementStateInfo();
              //npc执行移动时忽略阻挡与避让,这些行为由ai模块在规划其路径时执行。
              if (!obj.IsDead() && obj.CanMove && msi.IsMoving && !msi.IsSkillMoving) {
            ScriptRuntime.Vector3 pos = msi.GetPosition3D();
                float speed = (float)obj.GetActualProperty().MoveSpeed;
                float distance = (speed * (float)(int)deltaTime) / 1000.0f;
                ScriptRuntime.Vector3 dir = msi.TargetDir;

            //LogSystem.Debug("MovementSystem npc:{0} speed:{1} deltaTime:{2} distance:{3}", obj.GetId(), speed, deltaTime, distance);

                float x = 0, y = 0;
                if (msi.CalcDistancSquareToTarget() < distance * distance) {
                    x = msi.TargetPosition.X;
                    y = msi.TargetPosition.Z;
                    ScriptRuntime.Vector2 newPos = new ScriptRuntime.Vector2(x, y);
                    msi.SetPosition2D(newPos);

                    msi.IsMoving = false;
                    User user = obj.CustomData as User;
                    if (null != user) {
                        Msg_RC_NpcMove npcMoveBuilder = DataSyncUtility.BuildNpcMoveMessage(obj);
                        if (null != npcMoveBuilder) {
                            Scene scene = user.OwnRoom.ActiveScene;
                            if (null != scene) {
                                scene.NotifyAllUser(RoomMessageDefine.Msg_RC_NpcMove, npcMoveBuilder);
                            }
                        }
                    }
                } else {
                    ScriptRuntime.Vector3 tpos = pos + dir * distance;
                    msi.SetPosition(tpos);
                }
            }
        }
Exemple #12
0
        public override bool Execute(object sender, SkillInstance instance, long delta, long curSectionTime)
        {
            GfxSkillSenderInfo senderObj = sender as GfxSkillSenderInfo;

            if (null == senderObj)
            {
                return(false);
            }
            GameObject obj = senderObj.GfxObj;

            if (null == obj)
            {
                return(false);
            }
            GameObject targetObj = senderObj.TargetGfxObj;

            if (null != senderObj.TrackEffectObj)
            {
                obj       = senderObj.TrackEffectObj;
                targetObj = senderObj.GfxObj;
            }
            bool isTower = !EntityController.Instance.IsMovableEntity(obj);

            if (isTower)
            {
                return(false);
            }
            if (!m_TargetChecked)
            {
                m_TargetChecked = true;
                m_RealDuration  = m_Duration;
                m_RealVelocity  = m_Velocity;
                if (m_RealDuration <= 0)
                {
                    m_RealDuration += instance.CurSectionDuration;
                }
                if (m_RealDuration <= 0)
                {
                    LogSystem.Warn("jump duration is 0, skill id:{0} dsl skill id:{1}", senderObj.SkillId, instance.DslSkillId);
                    return(false);
                }
                if (null != targetObj || m_IsForRoundMove)
                {
                    Vector3 srcPos    = obj.transform.position;
                    Vector3 targetPos = Vector3.zero;
                    if (null != targetObj)
                    {
                        targetPos = targetObj.transform.position;
                    }
                    if (m_IsForRoundMove)
                    {
                        TriggerUtil.GetSkillStartPosition(srcPos, senderObj.ConfigData, instance, senderObj.ActorId, senderObj.TargetActorId, ref targetPos);
                    }
                    if (targetPos.sqrMagnitude > Geometry.c_FloatPrecision)
                    {
                        float degree = Geometry.GetYRadian(new ScriptRuntime.Vector2(srcPos.x, srcPos.z), new ScriptRuntime.Vector2(targetPos.x, targetPos.z));
                        ScriptRuntime.Vector2 newPos = new ScriptRuntime.Vector2(targetPos.x, targetPos.z) + Geometry.GetRotate(new ScriptRuntime.Vector2(m_Offset.x, m_Offset.z), degree);
                        targetPos   = new Vector3(newPos.X, targetPos.y + m_Offset.y, newPos.Y);
                        m_TargetPos = targetPos;
                        if (m_StopAtTarget == (int)StopAtTargetType.AdjustVelocity)
                        {
                            m_RealVelocity = (long)(1000.0f * (targetPos - srcPos).magnitude / m_RealDuration);
                        }
                        else if (m_StopAtTarget == (int)StopAtTargetType.AdjustTime)
                        {
                            m_RealDuration = (long)(1000.0f * (targetPos - srcPos).magnitude / m_RealVelocity);
                            CalcYVelocityAndG();
                        }
                        m_Forward   = targetPos - srcPos;
                        m_Forward.y = 0;
                        m_Forward.Normalize();
                    }
                    else
                    {
                        m_Forward = obj.transform.forward;
                    }
                }
                else
                {
                    m_Forward = obj.transform.forward;
                }
                m_InitY = obj.transform.position.y;
            }
            if (curSectionTime < StartTime)
            {
                return(true);
            }
            else if (curSectionTime <= StartTime + m_RealDuration)
            {
                float   t         = (float)(int)(curSectionTime - StartTime) / 1000.0f;
                float   disty     = m_YVelocity * t - m_G * t * t / 2;
                float   dist      = TriggerUtil.ConvertToSecond(delta) * m_RealVelocity;
                Vector3 targetPos = obj.transform.position + m_Forward * dist;
                targetPos.y = m_InitY + disty;
                TriggerUtil.MoveObjTo(obj, targetPos);
                return(true);
            }
            else
            {
                Vector3 srcPos = obj.transform.position;
                if (m_IsForRoundMove && m_TargetPos.sqrMagnitude > Geometry.c_FloatPrecision)
                {
                    srcPos = m_TargetPos;
                }
                obj.transform.position = new Vector3(srcPos.x, m_InitY, srcPos.z);
                return(false);
            }
        }
Exemple #13
0
        public static void AoeQuery(GameObject srcObj, GameObject targetObj, int aoeType, float range, float angleOrLength, SkillInstance instance, int senderId, int targetType, Vector3 relativeCenter, bool relativeToTarget, MyFunc <float, int, bool> callback)
        {
            float   radian;
            Vector3 center;

            if (null != targetObj && relativeToTarget)
            {
                Vector3 srcPos    = srcObj.transform.position;
                Vector3 targetPos = targetObj.transform.position;
                radian = Geometry.GetYRadian(new ScriptRuntime.Vector2(srcPos.x, srcPos.z), new ScriptRuntime.Vector2(targetPos.x, targetPos.z));
                ScriptRuntime.Vector2 newOffset = Geometry.GetRotate(new ScriptRuntime.Vector2(relativeCenter.x, relativeCenter.z), radian);
                center = targetPos + new Vector3(newOffset.X, relativeCenter.y, newOffset.Y);
            }
            else
            {
                radian = Geometry.DegreeToRadian(srcObj.transform.localRotation.eulerAngles.y);
                center = srcObj.transform.TransformPoint(relativeCenter);
            }
            if (aoeType == (int)SkillAoeType.Circle || aoeType == (int)SkillAoeType.Sector)
            {
                angleOrLength = Geometry.DegreeToRadian(angleOrLength);
                PluginFramework.Instance.KdTree.QueryWithFunc(center.x, center.y, center.z, range, (float distSqr, KdTreeObject kdTreeObj) => {
                    int targetId = kdTreeObj.Object.GetId();
                    if (targetType == (int)SkillTargetType.Enemy && CharacterRelation.RELATION_ENEMY == EntityController.Instance.GetRelation(senderId, targetId) ||
                        targetType == (int)SkillTargetType.Friend && CharacterRelation.RELATION_FRIEND == EntityController.Instance.GetRelation(senderId, targetId))
                    {
                        bool isMatch = false;
                        if (aoeType == (int)SkillAoeType.Circle)
                        {
                            isMatch = true;
                        }
                        else
                        {
                            ScriptRuntime.Vector2 u = Geometry.GetRotate(new ScriptRuntime.Vector2(0, 1), radian);
                            isMatch = Geometry.IsSectorDiskIntersect(new ScriptRuntime.Vector2(center.x, center.z), u, angleOrLength / 2, range, new ScriptRuntime.Vector2(kdTreeObj.Position.X, kdTreeObj.Position.Z), kdTreeObj.Radius);
                        }
                        if (isMatch)
                        {
                            if (!callback(distSqr, kdTreeObj.Object.GetId()))
                            {
                                return(false);
                            }
                        }
                    }
                    return(true);
                });
            }
            else
            {
                ScriptRuntime.Vector2 angleu = Geometry.GetRotate(new ScriptRuntime.Vector2(0, angleOrLength), radian);
                ScriptRuntime.Vector2 c      = new ScriptRuntime.Vector2(center.x, center.z) + angleu / 2;
                GameFramework.PluginFramework.Instance.KdTree.QueryWithFunc(c.X, 0, c.Y, range + angleOrLength / 2, (float distSqr, GameFramework.KdTreeObject kdTreeObj) => {
                    int targetId = kdTreeObj.Object.GetId();
                    if (targetType == (int)SkillTargetType.Enemy && CharacterRelation.RELATION_ENEMY == EntityController.Instance.GetRelation(senderId, targetId) ||
                        targetType == (int)SkillTargetType.Friend && CharacterRelation.RELATION_FRIEND == EntityController.Instance.GetRelation(senderId, targetId))
                    {
                        bool isMatch = false;
                        if (aoeType == (int)SkillAoeType.Capsule)
                        {
                            isMatch = Geometry.IsCapsuleDiskIntersect(new ScriptRuntime.Vector2(center.x, center.z), angleu, range, new ScriptRuntime.Vector2(kdTreeObj.Position.X, kdTreeObj.Position.Z), kdTreeObj.Radius);
                        }
                        else
                        {
                            ScriptRuntime.Vector2 half = new ScriptRuntime.Vector2(range / 2, angleOrLength / 2);
                            isMatch = Geometry.IsObbDiskIntersect(c, half, radian, new ScriptRuntime.Vector2(kdTreeObj.Position.X, kdTreeObj.Position.Z), kdTreeObj.Radius);
                        }
                        if (isMatch)
                        {
                            if (!callback(distSqr, kdTreeObj.Object.GetId()))
                            {
                                return(false);
                            }
                        }
                    }
                    return(true);
                });
            }
        }
        private bool Prepare(GfxSkillSenderInfo senderObj, SkillInstance instance, GameObject obj, GameObject targetObj)
        {
            if (!m_TargetChecked)
            {
                m_TargetChecked = true;
                m_RealDuration  = m_Duration;
                m_RealVelocity  = m_Velocity;
                if (m_RealDuration <= 0)
                {
                    m_RealDuration += instance.CurSectionDuration;
                }
                if (m_RealDuration <= 0)
                {
                    LogSystem.Warn("charge duration is 0, skill id:{0} dsl skill id:{1}", senderObj.SkillId, instance.DslSkillId);
                    return(false);
                }
                m_StartPos = obj.transform.position;
                Vector3 targetPos = Vector3.zero;
                if (null != targetObj)
                {
                    targetPos = targetObj.transform.position;
                }
                if (!m_IsFreeMove && targetPos.sqrMagnitude > Geometry.c_FloatPrecision)
                {
                    float degree = Geometry.GetYRadian(new ScriptRuntime.Vector2(m_StartPos.x, m_StartPos.z), new ScriptRuntime.Vector2(targetPos.x, targetPos.z));
                    ScriptRuntime.Vector2 newPos;
                    if (m_RandRelativeToSelf)
                    {
                        int v = Helper.Random.Next();
                        if (v < 50)
                        {
                            newPos    = new ScriptRuntime.Vector2(m_StartPos.x, m_StartPos.z) + Geometry.GetRotate(new ScriptRuntime.Vector2(m_Offset.x, m_Offset.z), degree);
                            targetPos = new Vector3(newPos.X, m_StartPos.y + m_Offset.y, newPos.Y);
                        }
                        else
                        {
                            newPos    = new ScriptRuntime.Vector2(m_StartPos.x, m_StartPos.z) + Geometry.GetRotate(new ScriptRuntime.Vector2(-m_Offset.x, m_Offset.z), degree);
                            targetPos = new Vector3(newPos.X, m_StartPos.y + m_Offset.y, newPos.Y);
                        }
                    }
                    else if (m_RelativeToSelf)
                    {
                        newPos    = new ScriptRuntime.Vector2(m_StartPos.x, m_StartPos.z) + Geometry.GetRotate(new ScriptRuntime.Vector2(m_Offset.x, m_Offset.z), degree);
                        targetPos = new Vector3(newPos.X, m_StartPos.y + m_Offset.y, newPos.Y);
                    }
                    else if (m_RandRelativeToTarget)
                    {
                        int v = Helper.Random.Next();
                        if (v < 50)
                        {
                            newPos    = new ScriptRuntime.Vector2(targetPos.x, targetPos.z) + Geometry.GetRotate(new ScriptRuntime.Vector2(m_Offset.x, m_Offset.z), degree);
                            targetPos = new Vector3(newPos.X, targetPos.y + m_Offset.y, newPos.Y);
                        }
                        else
                        {
                            newPos    = new ScriptRuntime.Vector2(targetPos.x, targetPos.z) + Geometry.GetRotate(new ScriptRuntime.Vector2(-m_Offset.x, m_Offset.z), degree);
                            targetPos = new Vector3(newPos.X, targetPos.y + m_Offset.y, newPos.Y);
                        }
                    }
                    else
                    {
                        newPos    = new ScriptRuntime.Vector2(targetPos.x, targetPos.z) + Geometry.GetRotate(new ScriptRuntime.Vector2(m_Offset.x, m_Offset.z), degree);
                        targetPos = new Vector3(newPos.X, targetPos.y + m_Offset.y, newPos.Y);
                    }

                    m_Forward   = targetPos - m_StartPos;
                    m_Forward.y = 0;
                    m_Forward.Normalize();

                    if (m_StopAtTarget == (int)StopAtTargetType.AdjustVelocity)
                    {
                        m_RealVelocity = (long)(1000.0f * (targetPos - m_StartPos).magnitude / m_RealDuration);
                        m_TargetPos    = targetPos;
                    }
                    else if (m_StopAtTarget == (int)StopAtTargetType.AdjustTime)
                    {
                        m_RealDuration = (long)(1000.0f * (targetPos - m_StartPos).magnitude / m_RealVelocity);
                        m_TargetPos    = targetPos;
                    }
                    else
                    {
                        m_TargetPos = m_StartPos + m_Forward * m_RealVelocity * m_RealDuration / 1000.0f;
                    }
                }
                else
                {
                    if (m_RandRelativeToSelf)
                    {
                        int v = Helper.Random.Next();
                        if (v < 50)
                        {
                            m_TargetPos = obj.transform.TransformPoint(m_Offset.x, 0, m_Offset.z);
                        }
                        else
                        {
                            m_TargetPos = obj.transform.TransformPoint(-m_Offset.x, 0, m_Offset.z);
                        }
                    }
                    else if (m_RelativeToSelf)
                    {
                        m_TargetPos = obj.transform.TransformPoint(m_Offset.x, 0, m_Offset.z);
                    }
                    else
                    {
                        m_TargetPos = obj.transform.TransformPoint(0, 0, m_RealVelocity * m_RealDuration / 1000.0f);
                    }
                    m_Forward = obj.transform.forward;
                }
            }
            return(true);
        }
Exemple #15
0
 /**
  * @brief 检验是否在某位置
  *
  * @param pos
  *
  * @return
  */
 public bool IsAtPosition(CharacterInfo entity, ScriptRuntime.Vector2 pos)
 {
     return(ScriptRuntime.Vector2.Distance(entity.GetMovementStateInfo().GetPosition2D(), pos) < ClientConfig.s_PositionRefix);
 }
 public override bool Execute(object sender, SkillInstance instance, long delta, long curSectionTime)
 {
     GfxSkillSenderInfo senderObj = sender as GfxSkillSenderInfo;
     if (null == senderObj) return false;
     GameObject obj = senderObj.GfxObj;
     if (null == obj) return false;
     GameObject targetObj = senderObj.TargetGfxObj;
     if (null != senderObj.TrackEffectObj) {
         obj = senderObj.TrackEffectObj;
         targetObj = senderObj.GfxObj;
     }
     bool isTower = !EntityController.Instance.IsMovableEntity(obj);
     if (isTower)
         return false;
     if (!m_TargetChecked) {
         m_TargetChecked = true;
         m_RealDuration = m_Duration;
         m_RealVelocity = m_Velocity;
         if (m_RealDuration <= 0) {
             m_RealDuration += instance.CurSectionDuration;
         }
         if (m_RealDuration <= 0) {
             LogSystem.Warn("jump duration is 0, skill id:{0} dsl skill id:{1}", senderObj.SkillId, instance.DslSkillId);
             return false;
         }
         if (null != targetObj || m_IsForRoundMove) {
             Vector3 srcPos = obj.transform.position;
             Vector3 targetPos = Vector3.zero;
             if (null != targetObj) {
                 targetPos = targetObj.transform.position;
             }
             if (m_IsForRoundMove) {
                 TriggerUtil.GetSkillStartPosition(srcPos, senderObj.ConfigData, instance, senderObj.ActorId, senderObj.TargetActorId, ref targetPos);
             }
             if (targetPos.sqrMagnitude > Geometry.c_FloatPrecision) {
                 float degree = Geometry.GetYRadian(new ScriptRuntime.Vector2(srcPos.x, srcPos.z), new ScriptRuntime.Vector2(targetPos.x, targetPos.z));
                 ScriptRuntime.Vector2 newPos = new ScriptRuntime.Vector2(targetPos.x, targetPos.z) + Geometry.GetRotate(new ScriptRuntime.Vector2(m_Offset.x, m_Offset.z), degree);
                 targetPos = new Vector3(newPos.X, targetPos.y + m_Offset.y, newPos.Y);
                 m_TargetPos = targetPos;
                 if (m_StopAtTarget == (int)StopAtTargetType.AdjustVelocity) {
                     m_RealVelocity = (long)(1000.0f * (targetPos - srcPos).magnitude / m_RealDuration);
                 } else if (m_StopAtTarget == (int)StopAtTargetType.AdjustTime) {
                     m_RealDuration = (long)(1000.0f * (targetPos - srcPos).magnitude / m_RealVelocity);
                     CalcYVelocityAndG();
                 }
                 m_Forward = targetPos - srcPos;
                 m_Forward.y = 0;
                 m_Forward.Normalize();
             } else {
                 m_Forward = obj.transform.forward;
             }
         } else {
             m_Forward = obj.transform.forward;
         }
         m_InitY = obj.transform.position.y;
     }
     if (curSectionTime < StartTime) {
         return true;
     } else if (curSectionTime <= StartTime + m_RealDuration) {
         float t = (float)(int)(curSectionTime - StartTime) / 1000.0f;
         float disty = m_YVelocity * t - m_G * t * t / 2;
         float dist = TriggerUtil.ConvertToSecond(delta) * m_RealVelocity;
         Vector3 targetPos = obj.transform.position + m_Forward * dist;
         targetPos.y = m_InitY + disty;
         TriggerUtil.MoveObjTo(obj, targetPos);
         return true;
     } else {
         Vector3 srcPos = obj.transform.position;
         if (m_IsForRoundMove && m_TargetPos.sqrMagnitude > Geometry.c_FloatPrecision) {
             srcPos = m_TargetPos;
         }
         obj.transform.position = new Vector3(srcPos.x, m_InitY, srcPos.z);
         return false;
     }
 }
Exemple #17
0
 public void SetPosition2D(ScriptRuntime.Vector2 pos)
 {
     m_Position.X = pos.X;
     m_Position.Z = pos.Y;
 }
Exemple #18
0
 internal void OnTick(ScriptRuntime.Vector2 frame_time)
 {
     mHandleTick(mName, frame_time.X, frame_time.Y);
 }