/// <summary> /// Process Spell Cast subscribed event function. /// </summary> /// <param name="sender"><see cref="Obj_AI_Base" /> sender</param> /// <param name="args">Processed Spell Cast Data</param> private static void OnObjAiBaseProcessSpellCast(ProcessSpellCastEventArgs args) { var sender = args.Source; if (!sender.IsValidTarget(false) || /* !AutoAttack.IsAutoAttack(args.SData.Name) ||*/ !sender.IsAlly()) { return; } if (!(sender is IMinion) && !(sender is ITurret)) { return; } var target = args.Target as IMinion; if (target == null) { return; } ActiveAttacks.Remove(sender.Id); ActiveAttacks.Add( sender.Id, new PredictedDamage( sender, target, (int)((Game.Time * 1000) - (Game.Ping / 2)), sender.AttackCastDelay * 1000, (sender.AttackDelay * 1000) - (sender is ITurret ? 70 : 0), sender.CombatType == GameObjectCombatType.Melee ? int.MaxValue : (int)args.SpellData.MissileSpeed, sender.GetAutoAttackDamage(target))); }
private void ProcessSpellCast(ProcessSpellCastEventArgs args) { if (this.Unit.Compare(args.Source) && Orbwalking.IsAutoAttack(args.SpellData.Name)) { ProcessAfterAttack((IAttackable)args.Target); } }
/// <summary> /// Obj_AI_Base on DoCast subscribed event function. /// </summary> /// <param name="sender"> /// <see cref="Obj_AI_Base" /> sender /// </param> /// <param name="args"> /// <see cref="GameObjectProcessSpellCastEventArgs" /> event data /// </param> private static void OnObjAiBaseDoCast(ProcessSpellCastEventArgs args) { var sender = args.Source; if (sender.IsValid && sender.CombatType == GameObjectCombatType.Melee) { var casterNetworkId = sender.Id; if (ActiveAttacks.ContainsKey(casterNetworkId)) { ActiveAttacks[casterNetworkId].Processed = true; } } }
private void DoCast(ProcessSpellCastEventArgs args) { if (!this.Unit.Compare(args.Source)) { return; } var name = args.SpellData.Name; if (Orbwalking.IsAutoAttackReset(name)) { this.attackT = 0f; } else if (Orbwalking.IsAutoAttack(name)) { this.attackT = Game.Time - GetPingOffset(); } }