Cool stuff! I did something similar myself a while back.
Something I learned from the above demo was that it was, well, too simple. Maximum_ADHD forwarded me a video to help expand upon what I had, allowing the smoke to better respond to the environment.
I recommend taking a look at it:
Keep up the good work
Edit: I notice somebody else here recommended the video to you as well!
Just figured out that you can make grenades with this very easily if you just modify a few parts, so in the function that checks if the voxel will collide with something you would check if whatever it will collide contains a humanoid