Advertisement
Guest User

Untitled

a guest
Jan 25th, 2020
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.54 KB | None | 0 0
  1. static float GetPredictedMissileTravelTime(GameObject* source, Vector2 sourcePosition, float missileDelay, float missileSpeed)
  2. {
  3. if (missileSpeed > 0 && missileSpeed < FLT_MAX)
  4. {
  5. auto minionPosition = source->Position;
  6. if (source->IsMoving())
  7. {
  8. auto pathEndPosition = source->GetPathController()->GetNavigationPath()->EndPosition;
  9. auto direction = (pathEndPosition - minionPosition).Normalized();
  10. auto totalPathLength = pathEndPosition.Distance(minionPosition);
  11. auto delayDistance = missileDelay * source->MoveSpeed;
  12. if (delayDistance <= totalPathLength)
  13. {
  14. auto positionAfterDelay = minionPosition + direction * delayDistance;
  15. auto bAngle = Angle((positionAfterDelay - sourcePosition).Normalized(), direction);
  16. auto sinB = sin(bAngle);
  17. auto sinC = sin(source->MoveSpeed / missileSpeed * sinB);
  18. auto cAngle = asin(sinC);
  19. auto aAngle = M_PI - bAngle - cAngle;
  20. if (aAngle >= 0)
  21. {
  22. auto startDistance = positionAfterDelay.Distance(sourcePosition);
  23. auto sinA = sin(aAngle);
  24. auto playerDistance = (float)(sinC / sinA * startDistance);
  25. auto predictedPos = positionAfterDelay + direction * playerDistance;
  26. minionPosition = playerDistance + delayDistance <= totalPathLength ? predictedPos : pathEndPosition;
  27. }
  28. else
  29. {
  30. minionPosition = pathEndPosition;
  31. }
  32. }
  33. else
  34. {
  35. minionPosition = pathEndPosition;
  36. }
  37. }
  38.  
  39. return sourcePosition.Distance(minionPosition) / missileSpeed;
  40. }
  41.  
  42. return 0.0f;
  43. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement