StopCurSection() public méthode

public StopCurSection ( ) : void
Résultat void
 static public int StopCurSection(IntPtr l)
 {
     try {
         SkillSystem.SkillInstance self = (SkillSystem.SkillInstance)checkSelf(l);
         self.StopCurSection();
         pushValue(l, true);
         return(1);
     }
     catch (Exception e) {
         return(error(l, e));
     }
 }
 public override bool Execute(object sender, SkillInstance instance, long delta, long curSectionTime)
 {
     GfxSkillSenderInfo senderObj = sender as GfxSkillSenderInfo;
     if (null == senderObj) return false;
     Scene scene = senderObj.Scene;
     EntityInfo obj = senderObj.GfxObj;
     if (null == obj) return false;
     if (curSectionTime < StartTime) {
         return true;
     }
     if (m_HaveIsContinue) {
         if (0 == m_Type.CompareTo("shield")) {
             if (scene.EntityController.HaveShield(senderObj.ActorId))
                 return true;
         } else {
             if (scene.EntityController.HaveState(senderObj.ActorId, m_Type))
                 return true;
         }
     } else {
         if (0 == m_Type.CompareTo("shield")) {
             if (!scene.EntityController.HaveShield(senderObj.ActorId))
                 return true;
         } else {
             if (!scene.EntityController.HaveState(senderObj.ActorId, m_Type))
                 return true;
         }
     }
     instance.StopCurSection();
     return false;
 }
        public override bool Execute(object sender, SkillInstance instance, long delta, long curSectionTime)
        {
            GfxSkillSenderInfo senderObj = sender as GfxSkillSenderInfo;
            if (null == senderObj) {
                return false;
            }
            if (senderObj.ConfigData.type == (int)SkillOrImpactType.Skill) {
                return false;//track只能在impact或buff里使用
            }
            Scene scene = senderObj.Scene;
            EntityInfo obj = senderObj.GfxObj;
            if (null != obj) {
                if (curSectionTime >= StartTime) {

                    if (!m_IsStarted) {
                        m_IsStarted = true;

                        Vector3 dest = obj.GetMovementStateInfo().GetPosition3D();
                        dest.Y += 1.5f;

                        Vector3 pos = scene.EntityController.GetImpactSenderPosition(senderObj.ActorId, senderObj.SkillId, senderObj.Seq);
                        object speedObj;
                        if (instance.Variables.TryGetValue("emitSpeed", out speedObj)) {
                            m_Speed = (float)speedObj;
                        } else {
                            return false;
                        }

                        float duration = m_Duration;
                        if (duration > Geometry.c_FloatPrecision) {
                            float d = duration / 1000.0f;
                            m_Lifetime = d;
                            m_Speed = (dest - m_StartPos).Length() / m_Lifetime;
                        } else {
                            m_Lifetime = 1.0f;
                            if (m_Speed > Geometry.c_FloatPrecision) {
                                m_Lifetime = (dest - m_StartPos).Length() / m_Speed;
                            }
                        }

                    } else if (curSectionTime > StartTime + (long)(m_Lifetime * 1000)) {
                        m_HitEffectRotation = Quaternion.Identity;
                        if (m_NoImpact) {
                            instance.SetVariable("hitEffectRotation", m_HitEffectRotation);
                        } else {
                            int impactId = scene.EntityController.GetTrackSendImpact(senderObj.ActorId, senderObj.Seq, instance.Variables);
                            Dictionary<string, object> args;
                            TriggerUtil.CalcImpactConfig(0, impactId, instance, senderObj.ConfigData, out args);
                            if (args.ContainsKey("hitEffectRotation"))
                                args["hitEffectRotation"] = m_HitEffectRotation;
                            else
                                args.Add("hitEffectRotation", m_HitEffectRotation);
                            scene.EntityController.TrackSendImpact(senderObj.ActorId, senderObj.SkillId, senderObj.Seq, impactId, args);
                            int senderId, targetId;
                            scene.EntityController.CalcSenderAndTarget(senderObj, out senderId, out targetId);
                        }
                        instance.StopCurSection();
                        return false;
                    }

                    //GameFramework.LogSystem.Debug("EmitEffectTriger:{0}", m_EffectPath);
                    return true;
                } else {
                    return true;
                }
            } else {
                instance.StopCurSection();
                return false;
            }
        }
        public override bool Execute(object sender, SkillInstance instance, long delta, long curSectionTime)
        {
            GfxSkillSenderInfo senderObj = sender as GfxSkillSenderInfo;
            if (null == senderObj) return false;
            Scene scene = senderObj.Scene;
            EntityInfo obj = senderObj.GfxObj;
            if (obj == null) {
                return false;
            }
            if (curSectionTime < StartTime) {
                return true;
            }
            int senderId = 0;
            int targetType = scene.EntityController.GetTargetType(senderObj.ActorId, senderObj.ConfigData, senderObj.Seq);
            int impactId = TriggerUtil.GetSkillImpactId(instance.Variables, senderObj.ConfigData);
            if (senderObj.ConfigData.type == (int)SkillOrImpactType.Skill) {
                senderId = senderObj.ActorId;
            } else {
                senderId = senderObj.TargetActorId;
            }

            float range = 0;
            TableConfig.Skill cfg = senderObj.ConfigData;
            if (null != cfg) {
                range = cfg.aoeSize;
            }
            float angle = obj.GetMovementStateInfo().GetFaceDir();
            Vector3 center = Geometry.TransformPoint(obj.GetMovementStateInfo().GetPosition3D(), m_RelativeCenter, angle);
            if (!m_IsStarted) {
                m_IsStarted = true;
                m_LastPos = center;
            } else if ((center - m_LastPos).LengthSquared() >= 0.25f || StartTime + m_DurationTime < curSectionTime) {
                Vector3 c = (m_LastPos + center) / 2;
                Vector3 angleu = center - m_LastPos;
                float queryRadius = range + angleu.Length() / 2;

                int ct = 0;
                bool isCollide = false;
                scene.KdTree.Query(c.X, c.Y, c.Z, queryRadius, (float distSqr, KdTreeObject kdTreeObj) => {
                    int targetId = kdTreeObj.Object.GetId();
                    if (targetType == (int)SkillTargetType.Enemy && CharacterRelation.RELATION_ENEMY == scene.EntityController.GetRelation(senderId, targetId) ||
                        targetType == (int)SkillTargetType.Friend && CharacterRelation.RELATION_FRIEND == scene.EntityController.GetRelation(senderId, targetId)) {
                        bool isMatch = Geometry.IsCapsuleDiskIntersect(new ScriptRuntime.Vector2(center.X, center.Z), new ScriptRuntime.Vector2(angleu.X, angleu.Z), range, new ScriptRuntime.Vector2(kdTreeObj.Position.X, kdTreeObj.Position.Z), kdTreeObj.Radius);
                        if (isMatch) {
                            isCollide = true;
                            if (!m_SingleHit || !m_Targets.Contains(targetId)) {
                                m_Targets.Add(targetId);
                                Dictionary<string, object> args;
                                TriggerUtil.CalcImpactConfig(0, impactId, instance, senderObj.ConfigData, out args);
                                scene.EntityController.SendImpact(senderObj.ConfigData, senderObj.Seq, senderObj.ActorId, senderId, targetId, impactId, args);
                                ++ct;
                                if (senderObj.ConfigData.maxAoeTargetCount <= 0 || ct < senderObj.ConfigData.maxAoeTargetCount) {
                                    return true;
                                } else {
                                    return false;
                                }
                            }
                        }
                    }
                    return true;
                });

                m_LastPos = center;

                if (isCollide && m_FinishOnCollide) {
                    return false;
                }
            }
            if (StartTime + m_DurationTime < curSectionTime) {
                instance.StopCurSection();
                return false;
            }
            return true;
        }
        public override bool Execute(object sender, SkillInstance instance, long delta, long curSectionTime)
        {
            GfxSkillSenderInfo senderObj = sender as GfxSkillSenderInfo;
            if (null == senderObj) {
                return false;
            }
            if (senderObj.ConfigData.type == (int)SkillOrImpactType.Skill) {
                return false;//track只能在impact或buff里使用
            }
            GameObject obj = senderObj.GfxObj;
            if (null != obj) {
                if (curSectionTime >= StartTime) {
                    if (!m_IsStarted) {
                        m_IsStarted = true;
                        Vector3 dest;
                        string trackBone = m_TrackBone.Get(instance);
                        m_BoneTransform = Utility.FindChildRecursive(obj.transform, trackBone);
                        if (null != m_BoneTransform) {
                            dest = m_BoneTransform.position;
                        } else {
                            dest = obj.transform.position;
                            dest.y += 1.5f;
                            LogSystem.Warn("[skill:{0} dsl skill id:{1}] track bone {2} can't find.", senderObj.SkillId, instance.DslSkillId, trackBone);
                        }
                        m_StartPos = EntityController.Instance.GetImpactSenderPosition(senderObj.ActorId, senderObj.SkillId, senderObj.Seq);
                        dest = Utility.FrontOfTarget(m_StartPos, dest, 0.1f);
                        object speedObj;
                        if (instance.Variables.TryGetValue("emitSpeed", out speedObj)) {
                            m_Speed = (float)speedObj;
                        } else {
                            return false;
                        }
                        float duration = m_Duration.Get(instance);
                        if (duration > Geometry.c_FloatPrecision) {
                            float d = duration / 1000.0f;
                            m_Lifetime = d;
                            m_Speed = (dest - m_StartPos).magnitude / m_Lifetime;
                        } else {
                            m_Lifetime = 1.0f;
                            if (m_Speed > Geometry.c_FloatPrecision) {
                                m_Lifetime = (dest - m_StartPos).magnitude / m_Speed;
                            }
                        }
                        long newSectionDuration = StartTime + (long)(m_Lifetime * 1000);
                        if (instance.CurSectionDuration < newSectionDuration) {
                            instance.SetCurSectionDuration(newSectionDuration);
                        }
                        Quaternion dir;
                        object dirObj;
                        if (instance.Variables.TryGetValue("emitDir", out dirObj)) {
                            dir = (Quaternion)dirObj;
                        } else {
                            dir = Quaternion.identity;
                        }
                        Vector3 scale;
                        object scaleObj;
                        if (instance.Variables.TryGetValue("emitScale", out scaleObj)) {
                            scale = (Vector3)scaleObj;
                        } else {
                            scale = Vector3.one;
                        }
                        Vector3 lookDir = dest - m_StartPos;
                        Quaternion q = Quaternion.LookRotation(lookDir);
                        m_ControlPos = m_StartPos + Vector3.Scale(q * dir * Vector3.forward, scale * lookDir.magnitude * 0.5f);
                        string effectPath = SkillParamUtility.RefixResourceVariable("emitEffect", instance, senderObj.ConfigData.resources);
                        m_Effect = ResourceSystem.Instance.NewObject(effectPath, m_Lifetime) as GameObject;
                        if (null != m_Effect) {
                            senderObj.TrackEffectObj = m_Effect;
                            TriggerUtil.SetObjVisible(m_Effect, true);
                            m_Effect.SetActive(false);
                            m_Effect.transform.position = m_StartPos;
                            m_Effect.transform.localRotation = q;
                            m_Effect.SetActive(true);
                        } else {
                            if (string.IsNullOrEmpty(effectPath)) {
                                LogSystem.Warn("[skill:{0} dsl skill id:{1}] track effect is empty.", senderObj.SkillId, instance.DslSkillId);
                            } else {
                                LogSystem.Warn("[skill:{0} dsl skill id:{1}] track effect {2} can't find.", senderObj.SkillId, instance.DslSkillId, effectPath);
                            }
                        }
                    } else if (null != m_Effect) {
                        if (!m_NotMove && !m_IsHit) {
                            Vector3 dest;
                            if (null != m_BoneTransform) {
                                dest = m_BoneTransform.position;
                            } else {
                                dest = obj.transform.position;
                                dest.y += 1.5f;
                            }
                            dest = Utility.FrontOfTarget(m_StartPos, dest, 0.1f);
                            //m_Effect.transform.position = Vector3.MoveTowards(m_Effect.transform.position, dest, m_RealSpeed * Time.deltaTime);
                            m_Effect.transform.position = Utility.GetBezierPoint(m_StartPos, m_ControlPos, dest, (curSectionTime - StartTime) / 1000.0f / m_Lifetime);
                            if ((dest - m_Effect.transform.position).sqrMagnitude <= 0.01f) {
                                m_HitEffectRotation = Quaternion.LookRotation(m_StartPos - dest);
                                if (m_NoImpact) {
                                    instance.SetVariable("hitEffectRotation", m_HitEffectRotation);
                                } else {
                                    int impactId = EntityController.Instance.GetTrackSendImpact(senderObj.ActorId, senderObj.Seq, instance.Variables);
                                    Dictionary<string, object> args;
                                    TriggerUtil.CalcImpactConfig(0, impactId, instance, senderObj.ConfigData, out args);
                                    if (args.ContainsKey("hitEffectRotation"))
                                        args["hitEffectRotation"] = m_HitEffectRotation;
                                    else
                                        args.Add("hitEffectRotation", m_HitEffectRotation);
                                    EntityController.Instance.TrackSendImpact(senderObj.ActorId, senderObj.SkillId, senderObj.Seq, impactId, args);
                                    int senderId, targetId;
                                    EntityController.Instance.CalcSenderAndTarget(senderObj, out senderId, out targetId);
                                }
                                m_IsHit = true;
                            }
                        }
                        if (curSectionTime > StartTime + m_Lifetime * 1000) {
                            m_Effect.SetActive(false);
                            ResourceSystem.Instance.RecycleObject(m_Effect);
                            m_Effect = null;
                            instance.StopCurSection();
                            return false;
                        }
                    } else {
                        return false;
                    }

                    //GameFramework.LogSystem.Debug("EmitEffectTriger:{0}", m_EffectPath);
                    return true;
                } else {
                    return true;
                }
            } else {
                instance.StopCurSection();
                return false;
            }
        }
 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;
     }
     if (null != senderObj.TrackEffectObj)
         obj = senderObj.TrackEffectObj;
     if (curSectionTime < StartTime) {
         return true;
     }
     int senderId = 0;
     int targetType = EntityController.Instance.GetTargetType(senderObj.ActorId, senderObj.ConfigData, senderObj.Seq);
     int impactId = TriggerUtil.GetSkillImpactId(instance.Variables, senderObj.ConfigData);
     if (senderObj.ConfigData.type == (int)SkillOrImpactType.Skill) {
         senderId = senderObj.ActorId;
     } else {
         senderId = senderObj.TargetActorId;
     }
     float range = 0;
     TableConfig.Skill cfg = senderObj.ConfigData;
     if (null != cfg) {
         range = cfg.aoeSize;
     }
     long duration = m_DurationTime.Get(instance);
     float angle = Geometry.DegreeToRadian(obj.transform.localRotation.eulerAngles.y);
     Vector3 center = obj.transform.TransformPoint(m_RelativeCenter);
     if (!m_IsStarted) {
         m_IsStarted = true;
         m_LastPos = center;
     } else if ((center - m_LastPos).sqrMagnitude >= 0.25f || StartTime + duration < curSectionTime) {
         Vector3 c = (m_LastPos + center) / 2;
         Vector3 angleu = center - m_LastPos;
         float queryRadius = range + angleu.magnitude / 2;
         int ct = 0;
         bool isCollide = false;
         List<int> targetIds = new List<int>();
         GameFramework.ClientModule.Instance.KdTree.Query(c.x, c.y, c.z, queryRadius, (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 = Geometry.IsCapsuleDiskIntersect(new ScriptRuntime.Vector2(m_LastPos.x, m_LastPos.z), new ScriptRuntime.Vector2(angleu.x, angleu.z), range, new ScriptRuntime.Vector2(kdTreeObj.Position.X, kdTreeObj.Position.Z), kdTreeObj.Radius);
                 if (isMatch) {
                     isCollide = true;
                     if (!m_SingleHit || !m_Targets.Contains(targetId)) {
                         m_Targets.Add(targetId);
                         Dictionary<string, object> args;
                         TriggerUtil.CalcImpactConfig(0, impactId, instance, senderObj.ConfigData, out args);
                         EntityController.Instance.SendImpact(senderObj.ConfigData, senderObj.Seq, senderObj.ActorId, senderId, targetId, impactId, IsFinal, args);
                         targetIds.Add(targetId);
                         ++ct;
                         if (senderObj.ConfigData.maxAoeTargetCount <= 0 || ct < senderObj.ConfigData.maxAoeTargetCount) {
                             return true;
                         } else {
                             return false;
                         }
                     }
                 }
             }
             return true;
         });
         m_LastPos = center;
         if (isCollide && m_FinishOnCollide) {
             return false;
         }
     }
     if (StartTime + duration < curSectionTime) {
         instance.StopCurSection();
         return false;
     }
     return true;
 }