In the hotlinking rule, the
.*$ part of the pattern is redundant and can simply be omitted. You should also escape all literal periods in that pattern (2 to do).
In the index rule, you might consider changing
index\.html? (2 to do) so that requests for .htm as well as for .html are both redirected.
In the non-www/www rule you also need the [L] flag, not just the R=301 flag. Additionally, you have missed the ( )? construct I mentioned above. This means that HTTP/1.0 requests, which do not send a HOST header, will be stuck in an infinite redirect loop.
RewriteConds apply only to the very next RewriteRule that follows. Your first rewrite has two preceding conditions. The second rewrite has NO preceding conditions. You MUST duplicate those conditions onto the second rewrite so that both conditions appear before both rules.
With no conditions before the second rewrite, requests that have previously been internally rewritten are rewritten again.
It's also very easy to end up with an infinite rewrite loop for these types of request. Add those conditions to the second rewrite.
Add a blank line after each RewriteRule.