public static void Init() { GameObject.OnCreate += GameObject_OnCreate; GameObject.OnDelete += GameObject_OnDelete; foreach (var emitter in ObjectManager.Get <Obj_GeneralParticleEmitter>().Where(FioraPassive)) { if (emitter.IsEnemy) { var passive = new FioraVital(emitter) { startTick = Core.GameTickCount }; if (!StoredPassives.Contains(passive)) { StoredPassives.Add(passive); } } } }
private static void GameObject_OnCreate(GameObject sender, EventArgs args) { var emitter = sender as Obj_GeneralParticleEmitter; if (emitter != null && emitter.Name.Contains("Fiora")) { if (FioraPassive(emitter) && emitter.IsEnemy) { StoredPassives.RemoveAll(v => (v.Vital != null && (v.Vital.IsDead || !v.Vital.IsValid)) || (v.Caster != null && (!v.Caster.IsValid || v.Caster.IsDead)) || Core.GameTickCount - v.startTick > 15000); var passive = new FioraVital(emitter) { startTick = Core.GameTickCount }; if (!StoredPassives.Contains(passive)) { StoredPassives.Add(passive); } } } }
public static Vector3?CanQVital(FioraVital v, bool shortVital, bool longVital) { var target = v?.Caster; if (target == null) { return(null); } var center = v.QpredVitalsector.CenterOfPolygon().To3DWorld(); var qpos = v.QPredVitalPos; if (shortVital) { if (Q1.IsInRange(qpos)) { return(qpos); } if (Q1.IsInRange(center)) { return(center); } } if (longVital) { var vitdis = v.QPredVitalPos.Distance(Player.Instance, true); var tardis = target.Distance(Player.Instance, true); var farvit = tardis > vitdis || Q1.IsInRange(center); var maxQCast = Player.Instance.ServerPosition.Extend(v.QPredVitalPos, Q2.IsInRange(v.QPredVitalPos) ? Player.Instance.Distance(v.QPredVitalPos) : Q2.Range).To3D(); var qrect = new Geometry.Polygon.Rectangle(Player.Instance.ServerPosition, maxQCast, Q2.Width + target.BoundingRadius); var insidepoint = v.QpredVitalsector.Points.Any(p => qrect.IsInside(p)) && !qrect.IsInside(target); if (Q2.IsInRange(v.QPredVitalPos) && (farvit || insidepoint)) { return(v.QPredVitalPos); } } return(null); }