private static void GameObject_OnDestroy(GameObject sender) { if (sender == null || !sender.IsValid) { return; } var mc = sender as MissileClient; if (mc == null || mc.SpellCaster == null || mc.SpellCaster.IsMelee || mc.SpellCaster is Obj_AI_Hero) { return; } var target = mc.Target as Obj_AI_Base; if (target == null) { return; } var attacks = Attacks.GetOutBoundAttacks(mc.SpellCaster.NetworkId); //Might be destroying too eearly, attack may not land when missile destroyed //add the missile to the attack object var attack = attacks?.Where(x => x.Target.NetworkId == mc.Target.NetworkId && x.AttackStatus != AutoAttack.AttackState.Completed).MinBy(x => x.DetectTime); if (attack != null) { if (attack is RangedAttack rangedAttack) { rangedAttack.MissileDestroyed(); } } }
private void GameObject_OnDestroy(GameObject sender) { if (sender == null || !sender.IsValid) { return; } var mc = sender as MissileClient; if (mc == null || mc.SpellCaster == null || mc.SpellCaster.IsMelee || mc.SpellCaster is Obj_AI_Hero) { return; } var target = mc.Target as Obj_AI_Base; if (target == null) { return; } var attacks = Attacks.GetOutBoundAttacks(mc.SpellCaster.NetworkId); var attack = attacks?.Where(x => x.Target.NetworkId == mc.Target.NetworkId && x.AttackStatus != AutoAttack.AttackState.Completed && x is RangedAttack).MinBy(x => x.DetectTime); if (attack != null) { var rattack = attack as RangedAttack; if (rattack != null) { rattack.AttackStatus = AutoAttack.AttackState.Completed; } } }
private void GameObject_OnCreate(GameObject gsender) { if (gsender == null || !gsender.IsValid) { return; } var mc = gsender as MissileClient; if (mc == null || !mc.IsValid || mc.Target == null || !mc.Target.IsValid) { return; } var sender = mc.SpellCaster; var target = mc.Target as Obj_AI_Minion; if (sender == null || !sender.IsValid || sender.IsMelee || sender is Obj_AI_Hero) { return; } if (target == null || !target.IsValid) { return; } //Ignore the missile if it is not an auto attack... if (!mc.SpellData.Name.ToLower().Contains("attack")) { return; } var attacks = Attacks.GetOutBoundAttacks(mc.SpellCaster.NetworkId); if (attacks != null) { var attack = attacks.MaxBy(x => x.DetectTime); if (attack != null) { if (attack is RangedAttack rangedAttack) { rangedAttack.MissileCreated(mc); } } } }
private void SpellBook_OnStopCast(Obj_AI_Base sender, SpellBookStopCastEventArgs e) { if (sender == null || !sender.IsValid) { return; } var ob = Attacks.GetOutBoundAttacks(sender.NetworkId); if (ob != null) { //Remove any pending attacks or attacks in progress because the auto attack was cancelled if (e.StopAnimation || e.ForceStop || e.DestroyMissile) { ob.Clear(); } } }
private void Obj_AI_Base_OnPerformCast(Obj_AI_Base sender, Obj_AI_BaseMissileClientDataEventArgs e) { if (sender != null && sender.IsValid && sender.IsMelee) { var ob = Attacks.GetOutBoundAttacks(sender.NetworkId); if (ob != null) { var attacks = ob.Where(x => x.AttackStatus != AutoAttack.AttackState.Completed); //Get the oldest attack var attack = attacks.MinBy(x => x.DetectTime); if (attack != null) { attack.AttackStatus = AutoAttack.AttackState.Completed; } } } }
private void SpellBook_OnStopCast(Obj_AI_Base sender, SpellBookStopCastEventArgs e) { if (sender == null || !sender.IsValid) { return; } var ob = Attacks.GetOutBoundAttacks(sender.NetworkId); if (ob != null) { //Remove any pending attacks or attacks in progress because the auto attack was cancelled if (e.StopAnimation || e.ForceStop || e.DestroyMissile) { foreach (var attack in ob) { if (attack.AttackStatus == AutoAttack.AttackState.Completed) { continue; } attack.Completed(); var rattack = attack as RangedAttack; if (rattack == null) { continue; } if (e.DestroyMissile) { rattack.MissileDestroyed(); } } } } }