private static void OnDetectSkillshot(Skillshot skillshot)
{
var alreadyAdded = false;
foreach (var i in SkillshotDetector.DetectedSkillshots)
{
if (i.SpellData.SpellName == skillshot.SpellData.SpellName
&& i.Unit.NetworkId == skillshot.Unit.NetworkId
&& skillshot.Direction.AngleBetween(i.Direction) < 5
&& (skillshot.Start.Distance(i.Start) < 100 || skillshot.SpellData.FromObjects.Length == 0))
alreadyAdded = true;
}
if (skillshot.Unit.Team == ObjectManager.Player.Team)
{
return;
}
if (skillshot.Start.Distance(ObjectManager.Player.ServerPosition.To2D())
> (skillshot.SpellData.Range + skillshot.SpellData.Radius + 1000) * 1.5)
{
return;
}
if (alreadyAdded && !skillshot.SpellData.DontCheckForDuplicates)
{
return;
}
if (skillshot.DetectionType == DetectionType.ProcessSpell)
{
if (skillshot.SpellData.MultipleNumber != -1)
{
var originalDirection = skillshot.Direction;
for (var i = -(skillshot.SpellData.MultipleNumber - 1) / 2;
i <= (skillshot.SpellData.MultipleNumber - 1) / 2;
i++)
{
SkillshotDetector.DetectedSkillshots.Add(
new Skillshot(
skillshot.DetectionType,
skillshot.SpellData,
skillshot.StartTick,
skillshot.Start,
skillshot.Start
+ skillshot.SpellData.Range
* originalDirection.Rotated(skillshot.SpellData.MultipleAngle * i),
skillshot.Unit));
}
return;
}
if (skillshot.SpellData.SpellName == "UFSlash")
{
skillshot.SpellData.MissileSpeed = 1600 + (int)skillshot.Unit.MoveSpeed;
}
if (skillshot.SpellData.SpellName == "SionR")
{
skillshot.SpellData.MissileSpeed = (int)skillshot.Unit.MoveSpeed;
}
if (skillshot.SpellData.Invert)
{
SkillshotDetector.DetectedSkillshots.Add(
new Skillshot(
skillshot.DetectionType,
skillshot.SpellData,
skillshot.StartTick,
skillshot.Start,
skillshot.Start
+ -(skillshot.End - skillshot.Start).Normalized()
* skillshot.Start.Distance(skillshot.End),
skillshot.Unit));
return;
}
if (skillshot.SpellData.Centered)
{
SkillshotDetector.DetectedSkillshots.Add(
new Skillshot(
skillshot.DetectionType,
skillshot.SpellData,
skillshot.StartTick,
skillshot.Start - skillshot.Direction * skillshot.SpellData.Range,
skillshot.Start + skillshot.Direction * skillshot.SpellData.Range,
skillshot.Unit));
return;
}
if (skillshot.SpellData.SpellName == "SyndraE" || skillshot.SpellData.SpellName == "syndrae5")
{
const int Angle = 60;
var edge1 =
(skillshot.End - skillshot.Unit.ServerPosition.To2D()).Rotated(
-Angle / 2f * (float)Math.PI / 180);
var edge2 = edge1.Rotated(Angle * (float)Math.PI / 180);
foreach (var skillshotToAdd in from minion in ObjectManager.Get<Obj_AI_Minion>()
let v =
(minion.ServerPosition - skillshot.Unit.ServerPosition).To2D(
)
where
minion.Name == "Seed" && edge1.CrossProduct(v) > 0
&& v.CrossProduct(edge2) > 0
&& minion.Distance(skillshot.Unit) < 800
&& minion.Team != ObjectManager.Player.Team
let start = minion.ServerPosition.To2D()
let end =
skillshot.Unit.ServerPosition.Extend(
minion.ServerPosition,
skillshot.Unit.Distance(minion) > 200 ? 1300 : 1000)
select
new Skillshot(
skillshot.DetectionType,
skillshot.SpellData,
skillshot.StartTick,
start,
end,
skillshot.Unit))
{
SkillshotDetector.DetectedSkillshots.Add(skillshotToAdd);
}
return;
}
if (skillshot.SpellData.SpellName == "AlZaharCalloftheVoid")
{
SkillshotDetector.DetectedSkillshots.Add(
new Skillshot(
skillshot.DetectionType,
skillshot.SpellData,
skillshot.StartTick,
skillshot.End - skillshot.Perpendicular * 400,
skillshot.End + skillshot.Perpendicular * 400,
skillshot.Unit));
return;
}
if (skillshot.SpellData.SpellName == "DianaArc")
{
SkillshotDetector.DetectedSkillshots.Add(
new Skillshot(
skillshot.DetectionType,
SpellDatabase.GetByName("DianaArcArc"),
skillshot.StartTick,
skillshot.Start,
skillshot.End,
skillshot.Unit));
}
if (skillshot.SpellData.SpellName == "ZiggsQ")
{
var d1 = skillshot.Start.Distance(skillshot.End);
var d2 = d1 * 0.4f;
var d3 = d2 * 0.69f;
var bounce1SpellData = SpellDatabase.GetByName("ZiggsQBounce1");
var bounce2SpellData = SpellDatabase.GetByName("ZiggsQBounce2");
var bounce1Pos = skillshot.End + skillshot.Direction * d2;
var bounce2Pos = bounce1Pos + skillshot.Direction * d3;
bounce1SpellData.Delay =
(int)(skillshot.SpellData.Delay + d1 * 1000f / skillshot.SpellData.MissileSpeed + 500);
bounce2SpellData.Delay =
(int)(bounce1SpellData.Delay + d2 * 1000f / bounce1SpellData.MissileSpeed + 500);
SkillshotDetector.DetectedSkillshots.Add(
new Skillshot(
skillshot.DetectionType,
bounce1SpellData,
skillshot.StartTick,
skillshot.End,
bounce1Pos,
skillshot.Unit));
SkillshotDetector.DetectedSkillshots.Add(
new Skillshot(
skillshot.DetectionType,
bounce2SpellData,
skillshot.StartTick,
bounce1Pos,
bounce2Pos,
skillshot.Unit));
}
if (skillshot.SpellData.SpellName == "ZiggsR")
{
skillshot.SpellData.Delay =
(int)(1500 + 1500 * skillshot.End.Distance(skillshot.Start) / skillshot.SpellData.Range);
}
if (skillshot.SpellData.SpellName == "JarvanIVDragonStrike")
{
var endPos = new Vector2();
foreach (var s in SkillshotDetector.DetectedSkillshots)
{
if (s.Unit.NetworkId == skillshot.Unit.NetworkId && s.SpellData.Slot == SpellSlot.E)
{
var extendedE = new Skillshot(
skillshot.DetectionType,
skillshot.SpellData,
skillshot.StartTick,
skillshot.Start,
skillshot.End + skillshot.Direction * 100,
skillshot.Unit);
if (!extendedE.IsSafePoint(s.End))
{
endPos = s.End;
}
break;
}
}
foreach (var m in ObjectManager.Get<Obj_AI_Minion>())
{
if (m.CharData.BaseSkinName == "jarvanivstandard" && m.Team == skillshot.Unit.Team)
{
var extendedE = new Skillshot(
skillshot.DetectionType,
skillshot.SpellData,
skillshot.StartTick,
skillshot.Start,
skillshot.End + skillshot.Direction * 100,
skillshot.Unit);
if (!extendedE.IsSafePoint(m.Position.To2D()))
{
endPos = m.Position.To2D();
}
break;
}
}
if (endPos.IsValid())
{
skillshot = new Skillshot(
DetectionType.ProcessSpell,
SpellDatabase.GetByName("JarvanIVEQ"),
AkaLib.Evade.Extensions.GameTimeTickCount,
skillshot.Start,
endPos + 200 * (endPos - skillshot.Start).Normalized(),
skillshot.Unit);
}
}
}
if (skillshot.SpellData.SpellName == "OriannasQ")
{
SkillshotDetector.DetectedSkillshots.Add(
new Skillshot(
skillshot.DetectionType,
SpellDatabase.GetByName("OriannaQend"),
skillshot.StartTick,
skillshot.Start,
skillshot.End,
skillshot.Unit));
}
if (skillshot.SpellData.DisableFowDetection && skillshot.DetectionType == DetectionType.RecvPacket)
{
return;
}
SkillshotDetector.DetectedSkillshots.Add(skillshot);
}