private static void GameObject_OnCreate(GameObject sender, EventArgs args) { if (sender == null) { return; } var partical = sender as Obj_GeneralParticleEmitter; if (partical != null) { var pdata = SkillshotDatabase.List.FirstOrDefault(s => partical.Name.EndsWith(".troy") && ((!string.IsNullOrEmpty(s.ParticalName) && partical.Name.StartsWith(s.ParticalName)) || (!string.IsNullOrEmpty(s.MissileName) && partical.Name.StartsWith(s.MissileName)) || (s.ExtraMissileName != null && s.ExtraMissileName.Any(x => partical.Name.StartsWith(x))))); if (pdata != null) { var pcaster = EntityManager.Heroes.AllHeroes.OrderBy(e => e.Distance(partical)).FirstOrDefault(h => h.Hero.Equals(pdata.hero)); var correctObject = ObjectManager.Get <Obj_AI_Base>().OrderBy(o => o.Distance(partical)).FirstOrDefault(o => !string.IsNullOrEmpty(pdata.ParticalObjectName) && o.Name.Equals(pdata.ParticalObjectName)); if (correctObject != null) { var pdetected = new DetectedSkillshotData { Caster = pcaster, Start = correctObject.Position.To2D(), End = correctObject.Position.To2D(), Data = pdata, StartTick = Core.GameTickCount }; Add(pdetected); } else { var start = partical.Position.To2D(); var end = partical.Position.To2D(); if (pcaster != null) { //start = pcaster.ServerPosition.To2D(); switch (pcaster.ChampionName) { case "Zac": if (start.Distance(end) > pdata.Range) { start = end.Extend(start, pdata.Range); } break; } } var pdetected = new DetectedSkillshotData { Caster = pcaster, Start = start, End = end, Data = pdata, StartTick = Core.GameTickCount }; Add(pdetected); } } else { var StartluxR = SkillshotDatabase.List.FirstOrDefault(p => !string.IsNullOrEmpty(p.StartParticalName) && partical.Name.StartsWith(p.StartParticalName) && partical.Name.EndsWith(".troy")); var MidluxR = SkillshotDatabase.List.FirstOrDefault(p => !string.IsNullOrEmpty(p.StartParticalName) && partical.Name.StartsWith(p.MidParticalName) && partical.Name.EndsWith(".troy")); var EndluxR = SkillshotDatabase.List.FirstOrDefault(p => !string.IsNullOrEmpty(p.StartParticalName) && partical.Name.StartsWith(p.MidParticalName) && partical.Name.EndsWith(".troy")); AIHeroClient pcaster; if (StartluxR != null || MidluxR != null || EndluxR != null) { pcaster = EntityManager.Heroes.AllHeroes.OrderBy(h => h.Distance(partical)).FirstOrDefault(h => h.ChampionName.Equals("Lux")); if (pcaster != null) { var alreadyDetected = DetectedLuxRParticals.FirstOrDefault(p => p.caster != null && !p.FullyDetected && p.caster.IdEquals(pcaster)); if (alreadyDetected != null) { if (alreadyDetected.Start == null && StartluxR != null) { alreadyDetected.Start = partical.Position; } if (alreadyDetected.Mid == null && MidluxR != null) { alreadyDetected.Mid = partical.Position; } if (alreadyDetected.End == null && EndluxR != null) { alreadyDetected.End = partical.Position; } } else { var addnew = new LuxRPartical { caster = pcaster, Start = StartluxR != null ? partical.Position : (Vector3?)null, Mid = MidluxR != null ? partical.Position : (Vector3?)null, End = EndluxR != null ? partical.Position : (Vector3?)null, Data = SkillshotDatabase.List.FirstOrDefault(s => s.hero.Equals(Champion.Lux) && s.slot.Equals(SpellSlot.R)) }; DetectedLuxRParticals.Add(addnew); } } } } } var missile = sender as MissileClient; var caster = missile?.SpellCaster; if (missile == null || caster == null || missile.IsAutoAttack() || !missile.IsValid) { return; } var missilename = missile.SData.Name; //Console.WriteLine($"{missilename} - mis - {missile.Slot}"); var data = GetData(caster, null, missile); if (data == null) { //Console.WriteLine($"OnCreateSkillshots: {caster.ChampionName} - [{missile.Slot} | {missilename}] - Not Detected"); return; } var Misstart = missile.StartPosition.To2D(); var Misend = missile.EndPosition.To2D(); if (data.hero.Equals(Champion.Shen) && data.slot.Equals(SpellSlot.Q)) { Misstart = missile.Position.To2D(); Misend = caster.ServerPosition.To2D(); data.Range = Misstart.Distance(Misend); } var detected = new DetectedSkillshotData { Caster = caster, Missile = missile, Start = Misstart, End = Misend, Data = data, StartTick = Core.GameTickCount }; Add(detected); }
private static void GameObject_OnCreate(GameObject sender, EventArgs args) { if (sender == null) { return; } var partical = sender as Obj_GeneralParticleEmitter; if (partical != null) { var particleName = partical.Name.ToLower(); var pdata = SkillshotDatabase.Current.FirstOrDefault(s => !ExcludeEnds.Any(particleName.EndsWith) && s.IsParticleName(particleName) && ObjectManager.Get <Obj_AI_Base>().Any(s.HasBuff)); if (pdata != null) { var isAlly = AlliedNames.Any(particleName.EndsWith); var yasuoEQ = partical.Name.StartsWith("Yasuo_Base_EQ_SwordGlow"); var jungleMob = pdata.IsCasterName("jungle"); Obj_AI_Base pcaster = jungleMob ? ObjectManager.Get <Obj_AI_Base>().Where(m => pdata.IsCasterName(m.BaseSkinName) && m.IsValid && !m.IsDead).OrderBy(m => m.Distance(partical)).FirstOrDefault() : yasuoEQ?EntityManager.Heroes.AllHeroes.OrderBy(m => m.Distance(partical)).FirstOrDefault(h => h.ChampionName == "Yasuo" && h.IsValid && !h.IsDead) : EntityManager.Heroes.AllHeroes.OrderByDescending(h => h.Distance(partical)).FirstOrDefault(h => h.IsInRange(partical, 3000) && pdata.IsCasterName(h.BaseSkinName) && (isAlly ? h.IsAlly : h.IsEnemy) && h.IsValid && !h.IsDead && pdata.HasBuff(h)); var correctObject = ObjectManager.Get <Obj_AI_Base>().OrderBy(o => o.Distance(partical)).FirstOrDefault(o => !string.IsNullOrEmpty(pdata.ParticalObjectName) && (o.Name.Equals(pdata.ParticalObjectName) || o.BaseSkinName.Equals(pdata.ParticalObjectName) || o.Model.Equals(pdata.ParticalObjectName) || pdata.HasBuff(o))); if (correctObject != null) { var buff = correctObject.Buffs.FirstOrDefault(b => b.Caster is Obj_AI_Base); var correctCaster = buff?.Caster as Obj_AI_Base; if (correctCaster != null) { pcaster = correctCaster; } if (pcaster != null) { var pdetected = new DetectedSkillshotData { Caster = pcaster, Start = correctObject.Position.To2D(), End = correctObject.Position.To2D(), Data = pdata, StartTick = Core.GameTickCount, Particle = partical }; Add(pdetected); } } else { var start = partical.Position.To2D(); var end = partical.Position.To2D(); if (pcaster != null) { //start = pcaster.ServerPosition.To2D(); switch (pcaster.BaseSkinName) { case "Yasuo": { var alreadydetected = SkillshotsDetected.FirstOrDefault(s => s.Caster.IdEquals(pcaster)); if (alreadydetected != null) { var qcircle = SkillshotDatabase.Current.FirstOrDefault(s => s.IsCasterName(Champion.Yasuo) && s.IsDisplayName(pcaster.HasBuff("YasuoQ3W") ? "E Q3" : "E Q")); if (qcircle != null) { alreadydetected.Data = qcircle; alreadydetected.End = pcaster.GetDashInfo() != null?pcaster.GetDashInfo().EndPos.To2D() : pcaster.ServerPosition.To2D(); alreadydetected.Update(); } } return; } case "Zac": start = pcaster.IsHPBarRendered ? pcaster.ServerPosition.To2D() : end.Extend(pcaster, pdata.Range); break; } var pdetected = new DetectedSkillshotData { Caster = pcaster, Start = start, End = end, Data = pdata, StartTick = Core.GameTickCount, Particle = partical }; Add(pdetected); } } } else { var StartluxR = SkillshotDatabase.Current.FirstOrDefault(p => !string.IsNullOrEmpty(p.StartParticalName) && partical.Name.StartsWith(p.StartParticalName) && partical.Name.EndsWith(".troy")); var MidluxR = SkillshotDatabase.Current.FirstOrDefault(p => !string.IsNullOrEmpty(p.MidParticalName) && partical.Name.StartsWith(p.MidParticalName) && partical.Name.EndsWith(".troy")); var EndluxR = SkillshotDatabase.Current.FirstOrDefault(p => !string.IsNullOrEmpty(p.EndParticalName) && partical.Name.StartsWith(p.EndParticalName) && partical.Name.EndsWith(".troy")); AIHeroClient pcaster; if (StartluxR != null || MidluxR != null || EndluxR != null) { pdata = SkillshotDatabase.Current.FirstOrDefault(s => s.IsCasterName(Champion.Lux) && s.IsSlot(SpellSlot.R)); var luxInStart = EntityManager.Heroes.AllHeroes.FirstOrDefault(h => h.Hero.Equals(Champion.Lux) && h.IsValidTarget() && h.IsInRange(partical, 275)); pcaster = luxInStart ?? EntityManager.Heroes.AllHeroes.OrderBy(h => h.Distance(partical)).FirstOrDefault(h => h.BaseSkinName.Equals("Lux") && (h.Spellbook.IsChanneling || h.Spellbook.IsCharging || h.Spellbook.IsCastingSpell || !h.IsHPBarRendered)); if (pcaster != null) { var alreadyDetected = DetectedLuxRParticals.FirstOrDefault(p => p.caster != null && !p.FullyDetected && p.caster.IdEquals(pcaster)); if (alreadyDetected != null) { if (alreadyDetected.Start == null && StartluxR != null) { alreadyDetected.Start = partical.Position.To2D(); } if (alreadyDetected.Mid == null && MidluxR != null) { alreadyDetected.Mid = partical.Position.To2D(); } if (alreadyDetected.End == null && EndluxR != null) { alreadyDetected.End = partical.Position.To2D(); } return; } var addnew = new LuxRPartical { caster = pcaster, Start = StartluxR != null?partical.Position.To2D() : (Vector2?)null, Mid = MidluxR != null?partical.Position.To2D() : (Vector2?)null, End = EndluxR != null?partical.Position.To2D() : (Vector2?)null, Data = pdata }; DetectedLuxRParticals.Add(addnew); return; } } } } var missile = sender as MissileClient; var caster = missile?.SpellCaster; if (missile == null || caster == null || !missile.IsValid) { return; } //var missilename = missile.SData.Name; //Console.WriteLine($"{missilename} - mis - {missile.Slot}"); var data = GetData(caster, null, missile); if (data == null) { //Console.WriteLine($"OnCreateSkillshots: {caster.ChampionName} - [{missile.Slot} | {missilename}] - Not Detected"); return; } var Misstart = missile.StartPosition.To2D(); var Misend = missile.EndPosition.To2D(); if (data.IsCasterName(Champion.Shen) && data.IsSlot(SpellSlot.Q)) { Misstart = missile.Position.To2D(); Misend = caster.ServerPosition.To2D(); data.Range = Misstart.Distance(Misend); } var detected = new DetectedSkillshotData { Caster = caster, Target = missile.Target as AIHeroClient, Missile = missile, Start = Misstart, End = Misend, Data = data, StartTick = Core.GameTickCount }; Add(detected); }