1. -- // Physics
  2. local Physics = {}; Physics.__index = Physics; do
  3. function Physics.MovementPrediction(Origin, Destination, DestinationVelocity, ProjectileSpeed)
  4. local Distance = (Destination - Origin).Magnitude;
  5. local TimeToHit = (Distance / ProjectileSpeed);
  6. local Predicted = Destination + DestinationVelocity * TimeToHit;
  7. local Delta = (Predicted - Origin).Magnitude / ProjectileSpeed;
  8. ProjectileSpeed = ProjectileSpeed - 0.013 * ProjectileSpeed ^ 2 * TimeToHit ^ 2;
  9. TimeToHit += (Delta / ProjectileSpeed);
  10. local Actual = Destination + DestinationVelocity * TimeToHit;
  11. return Actual;
  12. end;
  13. function Physics.Trajectory(Origin, Destination, ProjectileSpeed, ProjectileDrop)
  14. local Distance = (Destination - Origin).Magnitude;
  15. local TimeToHit = (Distance / ProjectileSpeed);
  16. local ProperSpeed = ProjectileSpeed - 0.013 * ProjectileSpeed ^ 2 * TimeToHit ^ 2;
  17. TimeToHit += (Distance / ProperSpeed);
  18. local DropTime = ProjectileDrop * TimeToHit ^ 2;
  19. if tostring(DropTime):find("nan") or (Distance <= 100) then
  20. return 0
  21. end;
  22. return DropTime
  23. end;
  24. end;