Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- static float GetPredictedMissileTravelTime(GameObject* source, Vector2 sourcePosition, float missileDelay, float missileSpeed)
- {
- if (missileSpeed > 0 && missileSpeed < FLT_MAX)
- {
- auto minionPosition = source->Position;
- if (source->IsMoving())
- {
- auto pathEndPosition = source->GetPathController()->GetNavigationPath()->EndPosition;
- auto direction = (pathEndPosition - minionPosition).Normalized();
- auto totalPathLength = pathEndPosition.Distance(minionPosition);
- auto delayDistance = missileDelay * source->MoveSpeed;
- if (delayDistance <= totalPathLength)
- {
- auto positionAfterDelay = minionPosition + direction * delayDistance;
- auto bAngle = Angle((positionAfterDelay - sourcePosition).Normalized(), direction);
- auto sinB = sin(bAngle);
- auto sinC = sin(source->MoveSpeed / missileSpeed * sinB);
- auto cAngle = asin(sinC);
- auto aAngle = M_PI - bAngle - cAngle;
- if (aAngle >= 0)
- {
- auto startDistance = positionAfterDelay.Distance(sourcePosition);
- auto sinA = sin(aAngle);
- auto playerDistance = (float)(sinC / sinA * startDistance);
- auto predictedPos = positionAfterDelay + direction * playerDistance;
- minionPosition = playerDistance + delayDistance <= totalPathLength ? predictedPos : pathEndPosition;
- }
- else
- {
- minionPosition = pathEndPosition;
- }
- }
- else
- {
- minionPosition = pathEndPosition;
- }
- }
- return sourcePosition.Distance(minionPosition) / missileSpeed;
- }
- return 0.0f;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement