# Spell
# Description
The Spell class is used to manage and predict skill casting in the game, providing functionality for skill damage calculation, hit prediction, and skill casting.
# How to Use
// Create a skill instance
Spell qSpell(eSpellSlot::Q, 900, eDamageType::Physical);
// Set as a skillshot
qSpell.SetSkillshot(0.25f, 60.f, 1600.f, true, eSkillshotType::Line);
// Check if the skill is ready to cast
if (qSpell.IsReady())
{
// Get the target
AIBaseClient* target = qSpell.GetTarget();
// If there is a target and it can be hit
if (target != nullptr && qSpell.CanCast(target))
{
// Cast the skill
qSpell.Cast(target);
}
}
# CanCast
bool CanCast(AIBaseClient* unit) const
Checks if the skill can be cast on the specified unit.
| Parameter Name | Parameter Type | Description |
|---|---|---|
| unit | AIBaseClient* | Target unit |
if (qSpell.CanCast(target))
{
// Can cast the skill on the target
}
# Cast
eCastStates Cast(AIBaseClient* unit, bool packetCast = false, bool aoe = false)
Casts the skill on the specified unit.
| Parameter Name | Parameter Type | Description |
|---|---|---|
| unit | AIBaseClient* | Target unit |
| packetCast | bool | Whether to use packet casting (optional) |
| aoe | bool | Whether it's an area skill (optional) |
eCastStates result = qSpell.Cast(target);
# Cast
bool Cast(bool packetCast = false)
Casts the skill (self-targeted).
| Parameter Name | Parameter Type | Description |
|---|---|---|
| packetCast | bool | Whether to use packet casting (optional) |
bool success = qSpell.Cast();
# Cast
bool Cast(Vector const& fromPosition, Vector const& toPosition)
Casts the skill from a specified position to a specified position.
| Parameter Name | Parameter Type | Description |
|---|---|---|
| fromPosition | Vector const& | Start position |
| toPosition | Vector const& | Target position |
bool success = qSpell.Cast(myHero->Position, targetPos);
# Cast
bool Cast(Vector const& position, bool packetCast = false)
Casts the skill to a specified position.
| Parameter Name | Parameter Type | Description |
|---|---|---|
| position | Vector const& | Target position |
| packetCast | bool | Whether to use packet casting (optional) |
bool success = qSpell.Cast(targetPos);
# CastIfHitchanceEquals
bool CastIfHitchanceEquals(AIBaseClient* unit, eHitChance hitChance, bool packetCast = false)
Casts the skill when the hit chance equals the specified value.
| Parameter Name | Parameter Type | Description |
|---|---|---|
| unit | AIBaseClient* | Target unit |
| hitChance | eHitChance | Hit chance requirement |
| packetCast | bool | Whether to use packet casting (optional) |
bool success = qSpell.CastIfHitchanceEquals(target, eHitChance::VeryHigh);
# CastIfWillHit
bool CastIfWillHit(AIBaseClient* unit, int minTargets = 5, bool packetCast = false)
Casts the skill when it can hit at least the specified number of targets.
| Parameter Name | Parameter Type | Description |
|---|---|---|
| unit | AIBaseClient* | Primary target unit |
| minTargets | int | Minimum number of targets to hit (optional) |
| packetCast | bool | Whether to use packet casting (optional) |
bool success = qSpell.CastIfWillHit(target, 2);
# CastOnBestTarget
eCastStates CastOnBestTarget(float extraRange = 0, bool packetCast = false, bool aoe = false)
Casts the skill on the best target.
| Parameter Name | Parameter Type | Description |
|---|---|---|
| extraRange | float | Extra range (optional) |
| packetCast | bool | Whether to use packet casting (optional) |
| aoe | bool | Whether it's an area skill (optional) |
eCastStates result = qSpell.CastOnBestTarget(50.f);
# CastOnUnit
bool CastOnUnit(AIBaseClient* unit, bool packetCast = false)
Casts the skill on the specified unit (unit-targeted skill).
| Parameter Name | Parameter Type | Description |
|---|---|---|
| unit | AIBaseClient* | Target unit |
| packetCast | bool | Whether to use packet casting (optional) |
bool success = qSpell.CastOnUnit(target);
# ChargingStartTime
float ChargingStartTime() const
Gets the time when a charging skill started charging.
float chargeTime = qSpell.ChargingStartTime();
# Cooldown
float Cooldown() const
Gets the current cooldown time of the skill.
float cd = qSpell.Cooldown();
if (cd <= 0)
{
// Skill has finished cooling down
}
# CountHits
int CountHits(std::vector<AIBaseClient*>const& units, Vector const& castPosition) const
Counts the number of units that can be hit by casting the skill from the specified position.
| Parameter Name | Parameter Type | Description |
|---|---|---|
| units | std::vector<AIBaseClient*>const& | List of potential targets |
| castPosition | Vector const& | Cast position |
std::vector<AIBaseClient*> enemies = ObjectManager::GetEnemyHeroes();
int hitCount = qSpell.CountHits(enemies, castPos);
# CountHits
int CountHits(std::vector<Vector>const& points, Vector const& castPosition) const
Counts the number of points that can be hit by casting the skill from the specified position.
| Parameter Name | Parameter Type | Description |
|---|---|---|
| points | std::vector<Vector>const& | List of potential hit points |
| castPosition | Vector const& | Cast position |
std::vector<Vector> positions;
// Fill positions
int hitCount = qSpell.CountHits(positions, castPos);
# From
Vector From() const
Gets the starting position for the skill cast.
Vector startPos = qSpell.From();
# From_Set
void From_Set(const Vector& value)
Sets the starting position for the skill cast.
| Parameter Name | Parameter Type | Description |
|---|---|---|
| value | const Vector& | Start position coordinates |
qSpell.From_Set(myHero->Position);
# GetCircularFarmLocation
FarmLocation GetCircularFarmLocation(std::vector<AIBaseClient*>const& minions, float overrideWidth = -1) const
Gets the best location for a circular skill to farm minions.
| Parameter Name | Parameter Type | Description |
|---|---|---|
| minions | std::vector<AIBaseClient*>const& | List of minions |
| overrideWidth | float | Override skill width (optional) |
std::vector<AIBaseClient*> minions = ObjectManager::GetEnemyMinions();
FarmLocation farmLoc = qSpell.GetCircularFarmLocation(minions);
if (farmLoc.Position.IsValid() && farmLoc.MinionsHit > 2)
{
qSpell.Cast(farmLoc.Position);
}
# GetCircularFarmLocation
FarmLocation GetCircularFarmLocation(std::vector<Vector>const& minionPositions, float overrideWidth = -1) const
Gets the best location for a circular skill to farm minions (based on a list of points).
| Parameter Name | Parameter Type | Description |
|---|---|---|
| minionPositions | std::vector<Vector>const& | List of minion positions |
| overrideWidth | float | Override skill width (optional) |
std::vector<Vector> positions;
// Fill positions
FarmLocation farmLoc = qSpell.GetCircularFarmLocation(positions);
# GetCollision
void GetCollision(std::vector<AIBaseClient*>& Output, const Vector& from, std::vector<Vector>const& to, float delayOverride = -1) const
Gets collision units along the skill path.
| Parameter Name | Parameter Type | Description |
|---|---|---|
| Output | std::vector<AIBaseClient*>& | Output collision units |
| from | const Vector& | Start position |
| to | std::vector<Vector>const& | List of target positions |
| delayOverride | float | Override delay value (optional) |
std::vector<AIBaseClient*> collisionUnits;
std::vector<Vector> endPositions = { targetPos };
qSpell.GetCollision(collisionUnits, myHero->Position, endPositions);
# GetDamage
float GetDamage(AIBaseClient* target, int stage = 0) const
Gets the damage value of the skill against the target.
| Parameter Name | Parameter Type | Description |
|---|---|---|
| target | AIBaseClient* | Target unit |
| stage | int | Damage stage (optional) |
float damage = qSpell.GetDamage(target);
if (damage >= target->Health)
{
// Skill can kill the target
}
# GetHealthPrediction
float GetHealthPrediction(AIBaseClient* unit) const
Predicts the unit's health when the skill reaches it.
| Parameter Name | Parameter Type | Description |
|---|---|---|
| unit | AIBaseClient* | Target unit |
float predictedHealth = qSpell.GetHealthPrediction(target);
# GetHitCount
int GetHitCount(eHitChance hitChance = eHitChance::High) const
Gets the number of targets that meet the specified hit chance.
| Parameter Name | Parameter Type | Description |
|---|---|---|
| hitChance | eHitChance | Hit chance requirement (optional) |
int count = qSpell.GetHitCount();
# GetLineFarmLocation
FarmLocation GetLineFarmLocation(std::vector<AIBaseClient*>const& minions, float overrideWidth = -1) const
Gets the best location for a linear skill to farm minions.
| Parameter Name | Parameter Type | Description |
|---|---|---|
| minions | std::vector<AIBaseClient*>const& | List of minions |
| overrideWidth | float | Override skill width (optional) |
std::vector<AIBaseClient*> minions = ObjectManager::GetEnemyMinions();
FarmLocation farmLoc = qSpell.GetLineFarmLocation(minions);
if (farmLoc.Position.IsValid() && farmLoc.MinionsHit > 2)
{
qSpell.Cast(farmLoc.Position);
}
# GetLineFarmLocation
FarmLocation GetLineFarmLocation(std::vector<Vector>const& minionPositions, float overrideWidth = -1) const
Gets the best location for a linear skill to farm minions (based on a list of points).
| Parameter Name | Parameter Type | Description |
|---|---|---|
| minionPositions | std::vector<Vector>const& | List of minion positions |
| overrideWidth | float | Override skill width (optional) |
std::vector<Vector> positions;
// Fill positions
FarmLocation farmLoc = qSpell.GetLineFarmLocation(positions);
# GetPrediction
PredictionOutput GetPrediction(AIBaseClient* unit, bool aoe = false, float overrideRange = -1, std::vector<eCollisionableObjects> const& collisionable = { eCollisionableObjects::Heroes ,eCollisionableObjects::Minions }) const
Gets the prediction result for the skill.
| Parameter Name | Parameter Type | Description |
|---|---|---|
| unit | AIBaseClient* | Target unit |
| aoe | bool | Whether it's an area skill (optional) |
| overrideRange | float | Override range value (optional) |
| collisionable | std::vector<eCollisionableObjects> const& | Collisionable objects (optional) |
PredictionOutput pred = qSpell.GetPrediction(target);
if (pred.Hitchance >= eHitChance::High)
{
qSpell.Cast(pred.CastPosition);
}
# GetRange
float GetRange(AIBaseClient* target) const
Gets the skill range for a specific target.
| Parameter Name | Parameter Type | Description |
|---|---|---|
| target | AIBaseClient* | Target unit |
float range = qSpell.GetRange(target);
# GetRangeSqr
float GetRangeSqr(AIBaseClient* target) const
Gets the squared value of the skill range for a specific target.
| Parameter Name | Parameter Type | Description |
|---|---|---|
| target | AIBaseClient* | Target unit |
float rangeSqr = qSpell.GetRangeSqr(target);
# GetTarget
AIBaseClient* GetTarget(float extraRange = 0, const std::vector<AIBaseClient*>& champsToIgnore = {}) const
Gets the current best target for the skill.
| Parameter Name | Parameter Type | Description |
|---|---|---|
| extraRange | float | Extra range (optional) |
| champsToIgnore | const std::vector<AIBaseClient*>& | List of targets to ignore (optional) |
AIBaseClient* target = qSpell.GetTarget(50.f);
if (target != nullptr)
{
qSpell.Cast(target);
}
# Instance
SpellDataInst* Instance() const
Gets the instance data of the skill.
SpellDataInst* spellData = qSpell.Instance();
# IsCharging
bool IsCharging() const
Checks if the skill is currently charging.
if (qSpell.IsCharging())
{
// Skill is charging
}
# IsInRange
bool IsInRange(AIBaseClient* obj, float range = -1) const
Checks if the target is within the skill range.
| Parameter Name | Parameter Type | Description |
|---|---|---|
| obj | AIBaseClient* | Target unit |
| range | float | Override range value (optional) |
if (qSpell.IsInRange(target))
{
// Target is within skill range
}
# IsInRange
bool IsInRange(Vector const& point, float range = -1) const
Checks if the position is within the skill range.
| Parameter Name | Parameter Type | Description |
|---|---|---|
| point | Vector const& | Target position |
| range | float | Override range value (optional) |
if (qSpell.IsInRange(targetPos))
{
// Position is within skill range
}
# IsKillable
bool IsKillable(AIBaseClient* target, int stage = 0) const
Checks if the target can be killed by the skill.
| Parameter Name | Parameter Type | Description |
|---|---|---|
| target | AIBaseClient* | Target unit |
| stage | int | Damage stage (optional) |
if (qSpell.IsKillable(target))
{
// Target can be killed by the skill
qSpell.Cast(target);
}
# IsReady
bool IsReady(int t = 0) const
Checks if the skill is ready to cast.
| Parameter Name | Parameter Type | Description |
|---|---|---|
| t | int | Extra time (optional) |
if (qSpell.IsReady())
{
// Skill is ready
}
# Level
int Level() const
Gets the current level of the skill.
int level = qSpell.Level();
# ManaCost
float ManaCost() const
Gets the mana cost of the skill.
float mana = qSpell.ManaCost();
if (myHero->Mana >= mana)
{
// Mana is sufficient
}
# Range
float Range() const
Gets the range of the skill.
float range = qSpell.Range();
# Range_Set
void Range_Set(float value)
Sets the range of the skill.
| Parameter Name | Parameter Type | Description |
|---|---|---|
| value | float | Skill range |
qSpell.Range_Set(1000.f);
# RangeCheckFrom
Vector RangeCheckFrom() const
Gets the starting position for range checking of the skill.
Vector checkPos = qSpell.RangeCheckFrom();
# RangeCheckFrom_Set
void RangeCheckFrom_Set(const Vector& value)
Sets the starting position for range checking of the skill.
| Parameter Name | Parameter Type | Description |
|---|---|---|
| value | const Vector& | Range check start position |
qSpell.RangeCheckFrom_Set(myHero->Position);
# RangeSqr
float RangeSqr() const
Gets the squared value of the skill range.
float rangeSqr = qSpell.RangeSqr();
# SetCharged
void SetCharged(float minRange, float maxRange, float deltaT)
Sets as a charging skill.
| Parameter Name | Parameter Type | Description |
|---|---|---|
| minRange | float | Minimum range |
| maxRange | float | Maximum range |
| deltaT | float | Charging time |
qSpell.SetCharged(400.f, 1200.f, 1.5f);
# SetSkillshot
void SetSkillshot(float delay, float width, float speed, bool collision, eSkillshotType type, Vector const& from = Vector::Zero, Vector const& rangeCheckFrom = Vector::Zero)
Sets as a skillshot.
| Parameter Name | Parameter Type | Description |
|---|---|---|
| delay | float | Delay time |
| width | float | Width |
| speed | float | Speed |
| collision | bool | Whether to check collision |
| type | eSkillshotType | Skillshot type |
| from | Vector const& | Start position (optional) |
| rangeCheckFrom | Vector const& | Range check start position (optional) |
qSpell.SetSkillshot(0.25f, 60.f, 1600.f, true, eSkillshotType::Line);
# SetTargetted
void SetTargetted(float delay, float speed, Vector const& from = Vector::Zero, Vector const& rangeCheckFrom = Vector::Zero)
Sets as a targeted skill.
| Parameter Name | Parameter Type | Description |
|---|---|---|
| delay | float | Delay time |
| speed | float | Speed |
| from | Vector const& | Start position (optional) |
| rangeCheckFrom | Vector const& | Range check start position (optional) |
qSpell.SetTargetted(0.25f, 2000.f);
# StartCharging
void StartCharging()
Starts charging the skill.
qSpell.StartCharging();
# Width
float Width() const
Gets the width of the skill.
float width = qSpell.Width();
# Width_Set
void Width_Set(float value)
Sets the width of the skill.
| Parameter Name | Parameter Type | Description |
|---|---|---|
| value | float | Skill width |
qSpell.Width_Set(80.f);
# WillHit
bool WillHit(AIBaseClient* unit, Vector const& castPosition, int extraWidth = 0, eHitChance minHitChance = eHitChance::High) const
Checks if the skill will hit the target.
| Parameter Name | Parameter Type | Description |
|---|---|---|
| unit | AIBaseClient* | Target unit |
| castPosition | Vector const& | Cast position |
| extraWidth | int | Extra width (optional) |
| minHitChance | eHitChance | Minimum hit chance (optional) |
if (qSpell.WillHit(target, castPos))
{
// Skill will hit the target
}
# WillHit
bool WillHit(Vector const& point, Vector const& castPosition, int extraWidth = 0) const
Checks if the skill will hit the specified position.
| Parameter Name | Parameter Type | Description |
|---|---|---|
| point | Vector const& | Target position |
| castPosition | Vector const& | Cast position |
| extraWidth | int | Extra width (optional) |
if (qSpell.WillHit(targetPos, castPos))
{
// Skill will hit the target position
}