code: def get_ball_prediction(self) -> BallPredictionPacket:
          
          byte_buffer = self.game.GetBallPrediction()
  
          if byte_buffer.size >= 4:  # GetRootAsGameTickPacket gets angry if the size is less than 4
              # We're counting on this copying the data over to a new memory location so that the original
              # pointer can be freed safely.
              proto_string = ctypes.string_at(byte_buffer.ptr, byte_buffer.size)
              self.game.Free(byte_buffer.ptr)  # Avoid a memory leak
              self.game_status(None, RLBotCoreStatus.Success)
              return BallPredictionPacket.GetRootAsBallPrediction(proto_string, 0)
docs: Gets the latest ball prediction available in shared memory. Only works if BallPrediction.exe is running.