Bad practices in this procedure to calculate player statistics?
the first thing that I see here is that it is going to be hard to read because you don't use standard ...  "notation" like indentation and new lines for each column you are selecting in a SELECT statement.  all of this is going to matter when you are going to be returning to the code to read it again or maintain it later.



where you have this:

WHERE stage = 0 AND playerid = userID


the playerid = userID part should really be in a join statement if possible.



some of your SET statements look very similar, you should look at these and see if you can't create a Temp Table with them, or even a CTE (I don't remember if this is possible with MySQL or not)