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; } }
public bool IsHurtEntity(IHitHoster id) { XBulletTarget target; if (id != null && _hurt_target.TryGetValue(id, out target)) { return(!target.Hurtable); } return(false); }
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); } }
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; } } }
private bool IsHurtEntity(IHitHoster id, int triggerTime) { return(_hurt_target.ContainsKey(triggerTime) ? _hurt_target[triggerTime].Contains(id) : false); }
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); } }