public static void CreateSpellData(
Obj_AI_Base hero,
Vector3 spellStartPos,
Vector3 spellEndPos,
SpellData spellData,
GameObject obj = null,
float extraEndTick = 0.0f,
bool processSpell = true,
SpellType spellType = SpellType.None,
bool checkEndExplosion = true,
float spellRadius = 0)
{
if (checkEndExplosion && spellData.HasEndExplosion)
{
CreateSpellData(hero, spellStartPos, spellEndPos,
spellData, obj, extraEndTick, false,
spellData.SpellType, false);
CreateSpellData(hero, spellStartPos, spellEndPos,
spellData, obj, extraEndTick, true,
SpellType.Circular, false);
return;
}
if (spellStartPos.Distance(MyHero.Position) < spellData.Range + ConfigValue.ExtraDetectionRange.GetInt())
{
Vector2 startPosition = spellStartPos.To2D();
Vector2 endPosition = spellEndPos.To2D();
Vector2 direction = (endPosition - startPosition).Normalized();
float endTick = 0;
if (spellType == SpellType.None)
{
spellType = spellData.SpellType;
}
if (spellData.FixedRange) //for diana q
{
if (endPosition.Distance(startPosition) > spellData.Range)
{
endPosition = startPosition + direction * spellData.Range;
}
}
if (spellType == SpellType.Line)
{
endTick = spellData.SpellDelay + (spellData.Range / spellData.ProjectileSpeed) * 1000;
endPosition = startPosition + direction * spellData.Range;
if (spellData.UseEndPosition)
{
var range = spellEndPos.To2D().Distance(spellStartPos.To2D());
endTick = spellData.SpellDelay + (range / spellData.ProjectileSpeed) * 1000;
endPosition = spellEndPos.To2D();
}
if (obj != null)
endTick -= spellData.SpellDelay;
}
else if (spellType == SpellType.Circular)
{
endTick = spellData.SpellDelay;
if (spellData.ProjectileSpeed == 0)
{
endPosition = hero.ServerPosition.To2D();
}
else if (spellData.ProjectileSpeed > 0)
{
if (spellData.SpellType == SpellType.Line &&
spellData.HasEndExplosion &&
spellData.UseEndPosition == false)
{
endPosition = startPosition + direction * spellData.Range;
}
endTick = endTick + 1000 * startPosition.Distance(endPosition) / spellData.ProjectileSpeed;
}
}
else if (spellType == SpellType.Arc)
{
endTick = endTick + 1000 * startPosition.Distance(endPosition) / spellData.ProjectileSpeed;
if (obj != null)
endTick -= spellData.SpellDelay;
}
else if (spellType == SpellType.Cone)
{
return;
}
else
{
return;
}
endTick += extraEndTick;
Spell newSpell = new Spell();
newSpell.StartTime = EvadeUtils.TickCount;
newSpell.EndTime = EvadeUtils.TickCount + endTick;
newSpell.StartPos = startPosition;
newSpell.EndPos = endPosition;
newSpell.Height = spellEndPos.Z + spellData.ExtraDrawHeight;
newSpell.Direction = direction;
newSpell.HeroId = hero.NetworkId;
newSpell.Info = spellData;
newSpell.SpellType = spellType;
newSpell.Radius = spellRadius > 0 ? spellRadius : newSpell.GetSpellRadius();
if (obj != null)
{
newSpell.SpellObject = obj;
newSpell.ProjectileId = obj.NetworkId;
}
int spellId = CreateSpell(newSpell, processSpell);
Core.DelayAction(() => DeleteSpell(spellId), (int) (endTick + spellData.ExtraEndTime));
}
}