Esempio n. 1
0
    public void Result(IHitHoster hit)
    {
        if (IsHurtEntity(hit))
        {
            return;
        }

        _data.Firer.Attribute.skillResult.InnerResult(_data.Sequnce, _bullet.transform.forward, _bullet.transform.position, _data.Skill, hit);
        if (hit != null)
        {
            XBulletTarget bt;
            if (!_hurt_target.TryGetValue(hit, out bt))
            {
                bt = new XBulletTarget();
                _hurt_target.Add(hit, bt);
            }
            XTimerMgr.singleton.RemoveTimer(bt.TimerToken);
            bt.Hurtable = false;
            bt.HurtCount++;
            bt.TimerToken = _data.Skill.Result[_data.Sequnce].LongAttackData.Refine_Cycle > 0 ?
                            XTimerMgr.singleton.SetTimer(_data.Skill.Result[_data.Sequnce].LongAttackData.Refine_Cycle, OnRefined, hit) : 0;
            _hurt_target[hit] = bt;
        }
        if (_data.Skill.Result[_data.Sequnce].LongAttackData.TriggerOnce)
        {
            _pingponged = _data.Skill.Result[_data.Sequnce].LongAttackData.IsPingPong;
        }
    }
Esempio n. 2
0
    public bool IsHurtEntity(IHitHoster id)
    {
        XBulletTarget target;

        if (id != null && _hurt_target.TryGetValue(id, out target))
        {
            return(!target.Hurtable);
        }
        return(false);
    }
Esempio n. 3
0
 private void AddHurtTarget(XSkillData data, IHitHoster hit, int triggerTime)
 {
     if (!data.Result[triggerTime].Loop && !data.Result[triggerTime].LongAttackEffect)
     {
         if (!_hurt_target.ContainsKey(triggerTime))
         {
             _hurt_target[triggerTime] = new HashSet <IHitHoster>();
         }
         _hurt_target[triggerTime].Add(hit);
     }
 }
Esempio n. 4
0
    private void OnRefined(object o)
    {
        XBulletTarget bt;
        IHitHoster    id = (IHitHoster)o;

        if (_hurt_target.TryGetValue(id, out bt))
        {
            if (bt.HurtCount < _data.Skill.Result[_data.Sequnce].LongAttackData.Refine_Count)
            {
                bt.Hurtable      = true;
                _hurt_target[id] = bt;
            }
        }
    }
Esempio n. 5
0
 private bool IsHurtEntity(IHitHoster id, int triggerTime)
 {
     return(_hurt_target.ContainsKey(triggerTime) ? _hurt_target[triggerTime].Contains(id) : false);
 }
Esempio n. 6
0
    public void InnerResult(int triggerTime, Vector3 forward, Vector3 pos, XSkillData data, IHitHoster hitted = null)
    {
        nHotID = triggerTime;

        if (hitted == null)
        {
            pos           += XCommon.singleton.VectorToQuaternion(host.Transform.forward) * new Vector3(data.Result[triggerTime].Offset_X, 0, data.Result[triggerTime].Offset_Z);
            nResultForward = forward;
            for (int i = 0, max = host.Hits.Length; i < max; i++)
            {
                var hit = host.Hits[i];
                if (IsHurtEntity(hit, triggerTime))
                {
                    continue;
                }
                Vector3 dir = hit.RadiusCenter - pos;
                dir.y = 0;
                float distance = dir.magnitude;
                if (distance > hit.Attr.radius)
                {
                    distance -= hit.Attr.radius;
                }
                if (dir.sqrMagnitude == 0)
                {
                    dir = forward;
                }
                dir.Normalize();

                if (data.IsInField(triggerTime, pos, forward, hit.RadiusCenter, Vector3.Angle(forward, dir), distance))
                {
                    Vector3 vHitDir = data.Result[triggerTime].Affect_Direction == XResultAffectDirection.AttackDir ? (hit.RadiusCenter - pos).normalized : host.Attribute.GetRotateTo();
                    AddHurtTarget(data, hit, triggerTime);
                    hit.Begin(host, data.Hit[triggerTime], vHitDir, data.Logical.AttackOnHitDown);
                }
            }
        }
        else
        {
            Vector3 vHitDir = data.Result[triggerTime].Affect_Direction == XResultAffectDirection.AttackDir ? hitted.RadiusCenter - pos : host.Attribute.GetRotateTo();
            vHitDir.y = 0;
            vHitDir.Normalize();
            hitted.Begin(host, data.Hit[triggerTime], vHitDir, data.Logical.AttackOnHitDown);
        }
    }